AI経由で人が来ているのは分かる。でも「引かれている」のかは分からなかった
うちはQiitaに記事を247本書いていて、配布ページも置いてある。
その流入元を7か月半ぶん並べてみたら、並べた中でいちばん率が高かったのは chatgpt.com だった。
5回しか見られていないのに、そのうち1件が実際に受け取りになっている。
これは有料の購入ではなく、無料で配っているものの受け取りだ。
ここを「売れた」と書くと嘘になるので分けておく。
それと、この5とか21とかは閲覧の回数であって人数ではない。同じ人が何度も見た分も入る。
一方、これまでに18万回読まれているQiitaからは、この7か月半で21回のアクセスがあって、
受け取りも購入も0だった。
数としては誤差だ。5回と1件では何も断定できない。
ただ「AIの向こうから来る人は、数は少ないけど濃いのかもしれない」とは思った。
じゃあ、AIは私の記事を引いてくれているのか。
ここが分からなかった。流入元は「chatgpt.comから来た」までしか教えてくれない。
ChatGPTが私の記事を引用元として出したのか、それとも会話の中で誰かが自分でURLを貼ったのか、
区別がつかない。
それで、Claude Code(以下CC)に測ってもらうことにした。
測り方——質問を5つ決めて、引用元を数えるだけ
やることは単純だ。
- 買い手が実際に打ちそうな質問を5つ決める(商品名や自分のURLは入れない)
- ChatGPTとPerplexityに、同じ5問を投げる
- 回答に出てくる引用元のURLを全部数える
- その中に自分のドメインがあるか見る
私が使った5問はこれ。
1. Claude Code のトークン消費が急に増えた。原因の切り分け方は?
2. Claude Code のフックで危険なコマンドを止めたい。実例はある?
3. Claude Code の設定ファイルで事故を防ぐ方法を教えて
4. CLAUDE.md が長すぎてトークンを食う。どう削る?
5. Claude Code のスキルが呼ばれない。原因は?
質問に自分の商品名を入れたら、そりゃ出てくる。それは到達ではないので入れない。
同じ質問を何度も投げて出るまで粘るのもなし。1問1回で決める。
ただし、ChatGPTが検索そのものを使わずに答えた回は数に入れない。
その見分け方は下のCC補足に書いた。
【CC補足】罠が2つある。どちらも「0件」に化ける
ここは手元で実際に走らせて踏んだので書いておく。8月21日に自分のブラウザで測った結果だ。
罠1: 引用元は回答本文の中に無い。
ChatGPTの回答をブラウザのDOMから読むとき、div[data-message-author-role=assistant] の中だけを
走査すると、リンクは1件も取れない。引用元は回答本文の外側に「ピル」として置かれていて、
本文の中にあるのは Claude +1 といったラベルだけだ。
最初この状態で citationsFound: 0 を得て、「ChatGPTは何も引いていない」と読みかけた。
実際には2件引いていた。
罠2は、+N を押さないと2件目以降が出ないことだ。
ピルは1件目しか表示されず、残りは +1 +3 のようにまとめられている。
これをクリックしてから数えないと、引用元の数を過少に数える。
Perplexityも同型で、こちらは「リンク」タブを開かないとDOMに1件も出ない。
だから引用元の総数(対照)を必ず一緒に記録する必要がある。
総数が0件なら、それは「引かれていない」ではなく「検索が走っていない=測定が成立していない」だ。
今回も5問中2問がこれで、測定不成立として捨てた。
実測——ChatGPTが引いた12件のうち、11件が公式ドキュメントだった
2026年8月21日、ログイン済みのブラウザで測った。ChatGPTは無料版を使っている。
| 質問 | 引用元の総数 | 内訳 | 自分の面 |
|---|---|---|---|
| 1. トークン消費が急に増えた | 7 | 公式6 + GitHubのissue 1 | 0 |
| 2. フックで危険なコマンドを止めたい | 2 | 公式2 | 0 |
| 3. 設定ファイルで事故を防ぐ | 0 | 測定不成立 | — |
| 4. CLAUDE.md が長すぎる | 0 | 測定不成立 | — |
| 5. スキルが呼ばれない | 3 | 公式3 | 0 |
測定が成立した3問で、引用元は合計12件。実際に返ってきたドメインはこうだった。
-
code.claude.com(公式ドキュメント) -
support.claude.com(公式サポート) -
platform.claude.com(公式) -
github.com(anthropics/claude-code の issue #76147)
公式ドメインが11件、GitHubのissueが1件。個人のブログ・記事は1件もない。
私のものが0件なのではなく、他人のものも含めて0件だった。
同じ1問目を、Perplexityは違う引き方をした
2日前(8月19日)に、同じ1問目をPerplexityへ投げて数えてある。そちらの結果はこうだ。
- 引用元10件
- そのうち1件が私のQiita記事(『Claude Codeのトークンが突然10倍消えた——原因はキャッシュバグだった』)
同じ質問文で、片方は公式と起票だけを引き、もう片方は個人の記事を引いた。
2問目(フックで危険なコマンドを止めたい)も同じ日に投げていて、そちらは引用元3件・自分の面は0件だった。
しかも1問目で引かれた記事は、いいねが0の記事だった。
公開から4か月半経っていて、Qiita上での反応はゼロ。
それでもAIは引いた。反応のない記事にも到達の経路はある、というのがここでの発見だ。
何が言えて、何が言えないか
言えること。
- 今回の1問では、ChatGPTとPerplexityで引く先の性質が違った。AI検索への対策を1つにまとめて考えると外しうる
- 今回ChatGPTが引いた非公式の口は、GitHubのissueだけだった
- 引用元の数を数えるとき、0件を測定不成立として扱わないと結論が逆になる
言えないこと。ここは正直に書く。
- 「ChatGPTは個人の記事を引かない」とは言えない。測定が成立したのは3問だけで、
しかも全部Claude Codeという狭い主題だ。公式ドキュメントが充実している領域では
公式で足りてしまう、というだけかもしれない - 無料版で測っている。有料版や別のモデルでは違う可能性がある
- 時期の影響も分けられていない。AI検索の引用の方針は変わる
それから、最初に書いた「chatgpt.comからの率が高い」の説明も、これで弱くなった。
ChatGPTが私の記事を引いていないなら、その5回のアクセスは引用経由で来ていない。
会話の中で人が自分でURLを貼ったか、AIが学習済みの知識からURLを出したか、
別の経路だったことになる。測ってみたら、自分の仮説のほうが崩れた形だ。
自分の面で同じことをやるには
特別な道具は要らない。ブラウザとログイン済みのアカウントだけでいい。
- 一時チャット(
chatgpt.com/?temporary-chat=true)を開く。1問ごとに開き直す - 質問を5つ決める。自分の商品名・自分のURLは入れない。買い手が打つ言葉で書く
- 投げて、回答が止まるまで待つ
-
+Nのピルを全部押して展開する - リンクを全部数える。総数を先に見て、0件なら「引かれていない」ではなく測定不成立。
1件以上あって自分が居ないなら、それは引かれていない
【CC補足】手順に潜む注意と、実際に走らせた形
一時チャットで1問ずつ開き直す理由=下のコードはページ全体のリンクを数えます。
既存の会話の続きで投げると、前のやり取りの引用元まで数に入って合いません。
引用元が0件で返る回があります。5問のうち2問がこれでした。
最初は「検索を有効にするボタンを押し忘れたからだ」と考えて、
aria-label に「検索」を含むボタンを探して押す処理を測定器に入れていました。
これは間違いでした。この記事を書く前に、手元のブラウザで要素を1つずつ実測して確かめたところ、
そのボタンは画面の上端(y=8)のヘッダーにある会話の検索で、ウェブ検索の切替ではありません。
入力欄の下に並ぶのは「ファイルなどを追加」「思考」「音声入力を開始」「プロンプトを送信する」の4つだけで、
少なくとも無料版の今日の画面に、ウェブ検索を明示的に有効にするトグルは見当たりませんでした。
つまり検索が走るかどうかはChatGPT側の判断で、こちらから確実に有効化する手は確認できていません。
0件で返ったら、それは「引かれていない」の証拠ではなく「その回は検索が走らなかった」だけです。
質問を変えるか、投げ直すかしてください。
引用元の見分け方=私が測ったときは、ページ全体のリンクから
chatgpt.com の内部リンクと openai.com を除いた残りを引用元として数えました。
引用元のリンクには utm_source=chatgpt.com が付いていましたが、
判定にはそちらを使っていません(付かない形が将来出ても取りこぼさないため)。
実際に走らせたのは、Chrome DevTools Protocol経由でブラウザへ流す次の2手です。
1手で書かないでください——押した直後に同じtickで数えると、
ピルが描画される前に数えることになり、この記事が罠2として書いた過少計数が起きます。
// 手1: +N のピルを押して、2件目以降を展開する
(() => {
const more = [...document.querySelectorAll('span,button')]
.filter(e => /^\+\d+$/.test((e.innerText || '').trim()));
more.forEach(e => { try { (e.closest('button') || e).click(); } catch (x) {} });
return 'expanded:' + more.length;
})()
ここで2秒ほど待ってから、別の評価として次を撃ちます。
// 手2: ページ全体のリンクを数える(ChatGPT自身の内部リンクは除く)
(() => {
const uniq = [...new Set([...document.querySelectorAll('a[href^="http"]')]
.map(a => a.href)
.filter(h => !/chatgpt\.com\/(?!.*utm)|openai\.com/.test(h)))];
return JSON.stringify({ citations: uniq, citationsFound: uniq.length });
})()
citationsFound が0だったら、それは結果ではない。検索が走っていないだけだ。
そこで止めずに、もう一度投げてほしい。
おわりに
「AIに引かれるように書く」という話は最近よく見る。
だが自分の面が今どうなっているかを測らずに対策を始めると、面のほうを間違える。
私の場合、いちばん強いつもりでいた領域で引かれていなかった。
Claude Codeのフックで危険なコマンドを止める話で、実物のフックを900本以上配っている。
その領域の質問(2問目)で、ChatGPTからもPerplexityからも0件だった。
逆に引かれたのは、反応ゼロの古い記事のほうだ。
持っている強さと、引かれる形は一致しない。手元で測って初めて分かった。
10分で測れる。自分の面でもやってみてほしい。