WhatsAppは、チャットメッセージ、メディアの参照情報、連絡先データをSQLiteデータベースに保存しています。iMazingのようなツールでiPhoneからバックアップを取り出した場合でも、iTunesバックアップからChatStorage.sqliteファイルを取得した場合でも、あるいはAndroidバックアップからmsgstore.dbを取り出した場合でも、いずれにせよMac上にデータベースファイルがある状態になります。ダブルクリックしても何も起こりません。それを開いて中の会話を読む方法が必要です。
なぜこれが想定以上に難しいのか
WhatsAppのSQLiteデータベースは独自のスキーマを使用しています。メッセージはZWAMESSAGE(iOS)やmessages(Android)といったテーブルに格納され、送信者、タイムスタンプ、テキスト内容、メディアの種類、ステータスといった列があります。タイムスタンプは標準的でない形式で保存されています——iOSはCore Dataのエポック(2001年1月1日からの秒数)を使い、Androidはミリ秒単位のUnixタイムスタンプを使います。連絡先は、読みやすい名前ではなくJID文字列で参照されます。
ターミナルでsqlite3を使ってファイルを開けば生のアクセスは得られますが、エンコードされたタイムスタンプとJID識別子を伴う書式のないテキストの行としてチャットメッセージを読むのは、ほとんどの人にとって実質的に役に立ちません。データを理解可能にするには、ビジュアルなインターフェースが必要です。
Androidのバックアップには、もう一つ複雑な事情があります。msgstore.db.crypt15ファイルは暗号化されているのです。どのSQLiteブラウザで開く前にも、まずキーファイルを使って復号する必要があります。しかし一度復号してしまえば、標準的なSQLiteデータベースになります。
TomeでWhatsAppのデータを閲覧
Tomeは、WhatsAppのSQLiteデータベースファイルを他のデータベースと同じように開きます。取り出したChatStorage.sqliteや復号済みのmsgstore.dbをTomeにドラッグすれば、サイドバーにすべてのテーブルが表示されます。メッセージのテーブルをクリックすれば、スクロール可能なグリッドでチャット履歴を閲覧できます。
文脈の中でメッセージを読む
メッセージのテーブルを閲覧すれば、テキスト内容、送信者の識別子、タイムスタンプ、メディアの参照情報を確認できます。日付で並べ替えれば、会話を時系列で読むことができます。TomeのSQLエディタを使って、連絡先や日付範囲でメッセージを絞り込むこともできます。
複数の会話を横断して検索
特定のメッセージを見つける必要がありますか?オートコンプリート付きのTomeのSQLエディタで簡単なクエリを書いてみましょう。SELECT * FROM ZWAMESSAGE WHERE ZTEXT LIKE '%keyword%';結果はスクロールと並べ替えが可能なネイティブグリッドに表示されます——ターミナルでgrepするよりもはるかに実用的です。
データはMac内にとどまる
データベースのアップロードを必要とするウェブベースのSQLiteビューアとは異なり、Tomeは完全にローカルで動作します。WhatsAppのメッセージがあなたのマシンから外に出ることはありません。開く、閲覧する、クエリする、閉じる——すべてMac上で完結します。