チャット履歴のエクスポート:五つのプラットフォーム、同じものについての互換のない五通りの考え方
どのメッセージングサービスもデータのエクスポートを用意していますが、会話をディスク上でどう表すかは各社が独立に決めてきました。中身は同じです。誰がいつ何を言ったか。しかし形はまったく共通していません。あるものは、タイムスタンプの書式が端末の地域設定に左右されるテキストログです。あるものは識別子をキーにしたノードの木で、会話はそのグラフを通る一本の経路にすぎません。あるものはチャンネルと日付で整理されたファイルの束で、名前はまったく別の場所に置かれています。
このページはそのすべてを読み、読める文字起こしを出します。プラットフォームはファイル名ではなくファイル自身の構造から判定するので、これが何かを先に伝えなくてもエクスポートをそのまま置けます。すべてこのブラウザタブの中で動きます。
判定はどう行われるか
ファイル名はこの用途には使えません。これらのプラットフォームの半分はエクスポートを conversations.json と名づけますし、そもそもファイルはメールやクラウドストレージを経由する過程で改名されます。そこで判定は構造を読みます。chat_messages 配列と sender フィールドの組み合わせ、mapping オブジェクトと create_time の組み合わせ、Unix タイムスタンプを文字列として持つ ts フィールド。どれも、特定の一社しか作らない指紋です。
順序に関する細かい点がひとつ効いてきます。iPhone の WhatsApp のエクスポートは [12/03/2024, 14:23:01] で始まります。角括弧です。そして JSON の配列も角括弧で始まります。先に JSON を試すと、iPhone のチャットログはすべて JSON パーサーに渡されて失敗します。だから WhatsApp の行のパターンは、角括弧の判定より後ではなく先に確かめます。
五つの形
- WhatsApp はプレーンテキストのログを書きます。一行に一メッセージ、タイムスタンプの書式は OS とロケールで変わります。複数行のメッセージは印のない裸の行として続くので、パーサーはタイムスタンプのない行をすべて直前の行の続きとして扱う必要があります。
- ChatGPT は会話ごとにノードのマップを保存します。再生成された回答も編集されたプロンプトも分岐として残るので、実際に画面で見たものを復元するには根から出発し、各段階で最後の子をたどることになります。
- Claude は平坦な配列で、五つのうち最も扱いやすい形です。唯一の癖は、新しいエクスポートがメッセージ本文を型付きのコンテンツブロックの並びに入れ、古いものは素の文字列フィールドを使う点で、どちらも読む必要があります。
- Slack はディレクトリ構造です。チャンネルごとに一フォルダー、一日ごとに一つの JSON ファイル、加えて ID と名前の対応を持つ
users.jsonが別に置かれます。メッセージは人をU0123ABCDのように指すので、このファイルがなければすべての発言がコードに帰属します。 - Discord のエクスポートは、よく使われるコミュニティ製ツールが出す形では、チャンネルのメタデータと平坦なメッセージ配列を持つ単一のオブジェクトです。素直で、ゼロから設計するなら書きそうな形にいちばん近いものです。
何が取り除かれるか
生のエクスポートには、誰も読みたくないものが大量に入っています。既定では落とし、スイッチで戻せます。
システム通知。WhatsApp のエクスポート冒頭の暗号化の告知、グループへの参加と退出、件名の変更、「このメッセージは削除されました」、Slack の channel_join サブタイプ。出入りの多いグループでは、これらが実際のメッセージより多いこともあります。
添付のプレースホルダー。画像や音声メッセージがあった場所には <Media omitted> が残り、写真中心のチャットではこれがファイルの大半を占めます。何かがあったことは伝えますが、それが何だったかは伝えません。
見えない配管。ChatGPT のエクスポートにはシステムプロンプトやツールのやり取りが含まれ、会話には表示しないという印が付いています。もともとあなたに見えていなかったものなので、落とします。
アーカイブもそのまま扱える
Slack と ChatGPT が渡してくるのは .zip であって裸の JSON ではないので、アーカイブをそのまま置けます。読み取り側はまず conversations.json を探します。それがあるなら、それがエクスポートの全部だからです。見つからなければ Slack のワークスペースとして扱い、まず users.json を読んで名前が解決できる状態を作り、それから日付ごとのファイルをたどって、チャンネルごとに一本の文字起こしへ日付順にまとめ直します。認識できないファイルはアーカイブ全体を失敗させずに読み飛ばします。
なぜこれをブラウザの中で動かすのか
このサイトが受け取る入力の中で、ここがいちばん重要な場面です。チャットのエクスポートは読者に向けて書いた文書ではありません。何年分かの私的な会話であり、そこで言われたことがそのまま入っています。住所。健康。お金。そして、この話に同意したことのない他人のこと。
それをどこかの変換サービスにアップロードすることは、見知らぬ相手の保持ポリシー、アクセス制御、バックアップ、そしてその会社の将来を信用するということです。ここでの解析はこのタブで動く JavaScript です。ファイルはブラウザが読み、メモリ上で変換され、表示されます。アップロードの工程がないので、保持されるものも削除するものもありません。この作り方には、運用費がかからず、ページを読み込んだあとはオフラインでも動くという副次的な利点もあります。
プラットフォーム別のページ
手元にあるものが分かっているなら、各プラットフォームの専用ページにそのサービスのエクスポート手順が載っています。WhatsApp、ChatGPT、Claude、Slack です。同じパーサーを使っているので、結果に違いはありません。