tools/ai-crawler-access-checker/README.md
Workspace snapshot · 09/04 13:33
AI Crawler Access Checker
「AIに学習させたくない」設定のつもりで、AI検索からも自分を消していないかを確認するCLIです。
この道具が拾いたいこと
OpenAIは、検索表示用と学習用のクローラーを分けています。
| User-agent | 用途 |
|---|---|
OAI-SearchBot | ChatGPTの検索機能に表示されるためのクロール |
GPTBot | 生成AIの学習用のクロール |
そしてOpenAIは、"each setting is independent of the others"(それぞれ独立した設定)と明記しています。 つまり「学習は断りたいが、AI検索には出たい」は成立します。
ところが、ネット上に出回る「AIボットをブロックするrobots.txt」をそのまま貼ると、
GPTBot と一緒に OAI-SearchBot まで拒否していることがあります。
その結果、学習を断ったつもりで、ChatGPTの回答から消えます。
このツールはそれを表にして見せます。
| クローラー | 提供元 | 用途 | robots.txt |
|--------------------|--------|------------------|-----------|
| `OAI-SearchBot` | OpenAI | AI検索への表示 | **拒否** |
| `GPTBot` | OpenAI | モデルの学習 | **拒否** |
学習用と検索用の両方を拒否しています。この2つは独立した設定です。 学習だけ断りたい場合、検索用は許可したままにできます
学習を断ること自体は正当な選択です。 このツールはそれを間違いとは言いません。 言うのは「両方に効いていますが、それは意図どおりですか」だけです。
使い方
python ai_crawler_check.py https://example.com
python ai_crawler_check.py https://example.com --format json --output ai-crawlers.json
python ai_crawler_check.py https://example.com --skip-llms-txt
終了コードは ERRORが1件でもあれば 1。
判定項目
| code | 重大度 | 内容 |
|---|---|---|
llms_txt_contradiction | ERROR | llms.txt でAIへ案内を出しながら、検索用クローラーを拒否している。宣言と設定が矛盾 |
robots_unreachable | ERROR | robots.txt が読めない |
ai_search_blocked | WARN | 検索用クローラーを拒否している(そのAIの回答に出なくなる) |
search_and_training_both_blocked | WARN | 両方拒否。独立した設定なので、分けられます |
ai_training_blocked | INFO | 学習用を拒否している(正当な選択として報告するだけ) |
llms_txt_found / llms_txt_missing | INFO | llms.txt の有無。無くても問題ありません |
robots_missing | INFO | robots.txt が無く、すべて許可されている状態 |
unverified_purpose | INFO | 用途をベンダー公式で裏取りしていないクローラーの一覧 |
裏取りできたこと・できていないこと
用途の分類は、各ベンダーの公式ドキュメントを実際に取得して確認したものだけを「確認済み」として扱います。
| 提供元 | 確認できたこと | 出典 |
|---|---|---|
| OpenAI | OAI-SearchBot=ChatGPTの検索機能への表示用 / GPTBot=学習用 / ChatGPT-User=ユーザー起点 / OAI-AdsBot=広告用で学習には使わない。"each setting is independent of the others" | Overview of OpenAI Crawlers |
| Perplexity | PerplexityBot=Perplexityの検索結果に出るためのクローラーで、AI foundation models の学習には使わない / Perplexity-User=ユーザーの質問に答えるためのページ訪問で、"generally ignores robots.txt rules" | Perplexity Crawlers |
| Anthropic | ClaudeBot=学習に寄与しうるコンテンツの収集 / Claude-SearchBot=検索結果の品質向上 / Claude-User=ユーザーの質問に応じた取得 | Anthropicのクローラー説明 |
未確認。 Google-Extended の公式ページを取得しようとしたところ404でした | — |
ユーザー操作起点のクローラー(ChatGPT-User / Perplexity-User / Claude-User)は、
robots.txt が適用されない場合があると各社が説明しています。
表で拒否と出ても、そのとおりに止まるとは限りません。出力にも毎回この注記を出します。
Google-Extended は用途を未確認のまま残し、出力の unverified_purpose に毎回並べます。
確認していないものを確認済みとして出しません。
llms.txt は提案であり、正式な標準ではありません。無くても問題ありません。
できないこと
- 実際にAIがこのサイトを何と説明するかは分かりません。 見ているのは robots.txt の記述だけです。
- クローラーが記述どおりに振る舞うかは保証できません。
- 構造化データやコンテンツの質は見ません。
必要な環境
Python 3.10以上。外部パッケージ不要(標準ライブラリのみ)。
robots.txt の解釈は標準ライブラリの urllib.robotparser を使います。
テスト
python -m unittest discover -s tests
audit() は取得済みのドキュメントを受け取る純粋関数で、ネットワークを開かないことをテストで固定しています。
検証状況
- 判定ロジックのオフラインテスト: 同梱済み。ただしこのworkspaceでは実行していません。
- 実サイトに対するスモークテスト: 未実施
License
MIT. 自分が所有または管理を委任されたサイトにのみ使用してください。
Part of PENGIN Tools — Web制作の面倒な作業を、小さな道具でなくす。