LLMのチャット共有機能で公開された会話ログを覗き見してみる
・ChatGPTやClaudeなどのLLMサービスで「チャット共有」を行うと、自分がLLMとやりとりしたログを、Webページとして他の人に共有することができる。テキストをコピペして送るよりも手間が省けるので、多用している人も多いのではないだろうか。
・しかし、URLさえ知っていれば、その内容は第三者から簡単に閲覧できる状態になっているので、うっかりプライベートな内容を晒してしまうリスクがある。さらに、「検索エンジンへの公開設定」をONにしてしまうと、Googleなどの検索エンジンにインデックスされてしまい、通常のGoogle検索でも当該のログがヒットしてしまうという。めっちゃ怖い。
・なんでそんなことが起きてしまうの?Simon Willisonのブログで指摘されているが、ChatGPTの場合で考えると、ボタンのUI設計に課題があり、ユーザが意図せずに公開設定にしてしまう可能性が高いという(これについては既に解消済みとのこと)。端的に言うと、公開するリスクについて、十分な注意喚起が無い状態であるのが問題ということだ。
・本件について、先日興味深い記事を見つけた。検索エンジンにインデックスされた会話ログは、Wayback Machine(過去に保存されたWebページを閲覧できる魚拓サービス)上でアーカイブされているというのだ。これを活用すれば、開されている会話ログのURLリストを取得でき、その中身にもアクセスできる。そんなわけで、悪趣味ながらどんなデータが公開されているかを確認してみることにした。
<この調査は純粋に技術的興味に基づいて実施したものであり、他者の情報を不正に取得する意図はありません。取得したデータは分析後に適切に削除しています>
実施方法
Step1:アーカイブされたURLリストの取得
・今回、CopilotとClaudeのチャットログをターゲットにした。ChatGPTのアーカイブも見てみたかったが、既にOpenAIによってWayback Machine上からも削除されていたので、リストを入手することはできなかった。Grokは残っていたのだけど、やる前からチラシの裏レベルのしょうもなさが感じられたので、除外した。この直感は間違っていないと思うわ。

・本記事執筆時の2025年8月20日現在で、以下の件数がヒットした。
- Claude:1,330件
- Copilot:2,920件
・Wayback Machineでは、次のAPIを使ってURLを一括取得できる。利用したエンドポイントは以下の通り。
- Claude:
https://web.archive.org/web/timemap/json?url=claude.ai%2Fshare%2F&matchType=prefix&collapse=urlkey&output=json&fl=original%2Cmimetype%2Ctimestamp%2Cendtimestamp%2Cgroupcount%2Cuniqcount&filter=!statuscode%3A%5B45%5D..&limit=1000000
- Copilot:
https://web.archive.org/web/timemap/json?url=copilot.microsoft.com%2Fshares%2F&matchType=prefix&collapse=urlkey&output=json&fl=original%2Cmimetype%2Ctimestamp%2Cendtimestamp%2Cgroupcount%2Cuniqcount&filter=!statuscode%3A%5B45%5D..&limit=1000000

Step2:チャット内容の構造化データ取得
・共有URLとは、例えば以下の形式である。ここにアクセスしても、通常のWebページとして表示されるだけで、数千件のURLを一つ一つ確認するのは困難である。
https://claude.ai/share/003669ff-7ea9-4642-a274-e2e136b6d59d
・そこで、各サービスが内部で使用しているAPIエンドポイントを活用した。これを使うと、分析に適した構造データを取得できる。Copilotの場合は比較的シンプルで、共有URL(https://copilot.microsoft.com/shares/{uuid})から抽出したUUIDを以下のエンドポイントに置換することで、構造化データを取得できる。
https://copilot.microsoft.com/c/api/conversations/shares/{uuid}
・Claudeの場合はやや複雑で、エンドポイントの形式は以下の通り。Claudeの共有URLを開いた状態で、Chrome開発者ツールのNetworkを調べることで発見できた。
https://claude.ai/api/organizations/{org_id}/chat_snapshots/{uuid}?rendering_mode=messages

・Claudeのエンドポイントは、Copilotと異なり、リクエスト時に組織ID(org_id)が必要である。しかし、組織IDは共有ページを開いた後でないと取得することはできない。困った。
・そこで、Puppeteer(ブラウザ自動化ツール)を使って、実際に共有ページを開いた際に呼び出されるAPIリクエストを監視し、データ取得するアプローチを図った。さらに、CloudFlareの認証システムを回避するために、puppeteer-extra-plugin-stealthプラグインを使用した。今回の検証で最も手こずったのはこの部分だった。
・データ取得に要した時間は、Copilotは数分程度、Claudeはブラウザ自動化を使ったために、2時間程度を要した。
Step3:データの可視化
・取得したJSONファイルを読みやすい形でブラウザに表示するビューワーを生成した。これにより、ブラウザ上で大量のチャットデータを閲覧できるようになった。

・カード形式でタイトルと最初のクエリを表示し、気になったカードをクリックすると会話履歴がモーダルで表示される仕組みだ。Chromeの翻訳機能を使うこともできる。ここまでのプログラムは、すべてLLM(Claude Sonnet4)に生成してもらっている。
確認結果について
・4,000件以上の会話ログをざっと眺めてみた。確かに、こんなにも多くのプライベートなチャット履歴が公開状態になっているのは、ショッキングな発見だった。しかしながら、安心材料としては、大半がしょーもない(失礼)内容であり、見る価値の無いものだった。法人ユーザが自らの機密情報をうっかり公開しちゃってたり・・・という想像をしていたが、そのような類のものは見つからなかった。流石に「検索エンジンへの公開設定」をONにしちゃうようなヘマはしないか。
・その一方で、なにかの拍子にOpenAIやClaudeのようなLLMベンダーが、ユーザのすべてのチャット履歴を公開状態にするようなことがあったら、大問題に発展するという想像は容易くできるようになった。LLMベンダーにとって、ユーザのプライバシー保護について、思っているより関心は薄そうなので(いまだに多要素認証も実装してくれないし)。自分たちで気をつけないといけないなー、と思った。