Atlas

Atlas

Do you 👂 the people sing?
twitter
twitter

友達の輪データをエクスポートして永続的にブロックチェーンに保存する方法

これは実際に二つの問題です。最初の問題は、自分の友達の投稿データをエクスポートする方法、二つ目の問題は、それらのデータをブロックチェーンに保存する方法です。成果を先に述べると、最終的に私は iOS システムの 8.0.32 バージョンの WeChat から自分の友達の投稿データをエクスポートし、Crossbell ブロックチェーンに保存することに成功しました:https://xfeed.app/u/wxd6bb23a9

私がこの件を研究した理由は、2023 年 2 月 4 日に私のWeChat が封鎖された後、自分の友達の投稿内容をエクスポートして再表示したいと思ったからです。その間、私は多くの資料を検索しましたが、どれも古いバージョンの解決策でした。だから、今自分の探索と経験した問題を記録しておくべきだと思いました。

あらかじめ声明します:

  1. 私はコメントデータをエクスポートしていません。なぜなら、必要ないと思ったからです。結局、ブロックチェーンに保存することの一部の意味は所有権の確認にあります。この件に関して他の人のコンテンツをブロックチェーンに保存することはあまり意味がありません。しかし、もし本当に必要があれば、実現するのはそれほど難しくないと思います。MyWC_Message01 というテーブルには明文で保存されたコメントがあるのを見ましたが、完全なものであるかどうかは不明です。必要があれば、このチュートリアルを参考にして自分で研究を続けてください。
  2. 私は他の人の友達の投稿データをエクスポートしていません。同様に、必要がないと思いました。しかし、もしエクスポートが必要であれば、どのテーブルから始めるべきかは推測できます。
  3. 私は WeChat の友達 / チャット履歴をエクスポートしていません。これは一般的なニーズかもしれませんが、私はこの点にあまりニーズがなかったので研究しませんでした。しかし、恐らく別のテーブルからデータをエクスポートするだけで、それほど面倒ではないでしょう。
  4. 私は動画アカウントの共有を解析していません。普通のリンク共有は解析できますが、動画アカウントは非常に不明瞭で、実際の動画リンクを復元するのが難しいです。また、私は動画アカウントをあまり転送しないので、これを解析するニーズもあまりありません。

目標を明確にする:友達の投稿データをエクスポートする#

現在のニーズが友達の投稿データをエクスポートすることであれば、実際にはいくつかの状況に分かれます。異なる状況には異なる方法があります:

  • もしあなたが WeChat ユーザー(WeChat のユーザーではなく)であれば、公式にデータエクスポートのインターフェースが提供されています。以前のこのブログを参考にしてください。もしブロックチェーンに表示したい場合は、このブログもご覧ください。
  • もし WeChat ユーザーであれば
    • あなたの WeChat が封鎖されていない場合は、淘宝で「WeChat の友達の投稿」を検索してみてください。あなたの WeChat の友達の投稿をエクスポートして電子書籍にするサービスがたくさんあります(実際、私は淘宝の商人がどうやっているのか非常に興味があります。キャッシュを通じてやっているのかどうかはわかりません)。
    • もしあなたの WeChat も私と同じように封鎖されている場合、または封鎖されていなくてもデータをエクスポートする方法に興味がある場合は、次に私が重点的に紹介する携帯電話のキャッシュからデータを復元する方法を試してみてください。この方法が可能な理由は、WeChat アカウントが封鎖されていても、自分の友達の投稿にはアクセスできるからです(幸運なことに)。

キャッシュからデータを復元する方法#

名前の通り、この方法はまず WeChat がローカルに自分の友達の投稿をキャッシュしていることを確認し、その後自分の携帯電話のデータをエクスポートし、最後にエクスポートしたデータから関連するファイルを見つけ、そこから有用な情報(投稿時間、友達の投稿内容など)を抽出し、最終的に完全な友達の投稿データを再構築するというものです。

1. ローカルキャッシュ#

WeChat を開き、キャッシュをクリアします(このステップは必須ではありませんが、バックアップやコピーに必要な待機時間を短縮できます)。その後、自分の友達の投稿を開き、最初の投稿までスクロールし、自分のすべての友達の投稿をローカルにキャッシュします。各画像も開く必要があります。そうしないと、キャッシュされるのはサムネイル画像だけです。すべてが正常にキャッシュされたことを確認するために、ページをめくった後にネットワークを切断して、まだ見ることができるか確認します。見ることができれば、キャッシュが成功したことを意味します。

2. キャッシュファイルのエクスポート#

私の WeChat は iOS システムでログインしているため、封鎖された後、他のデバイスでログインできるかどうかわかりません(夜長夢多を心配して、試行回数が多すぎると、ログインできる iOS デバイスにもログインできなくなる可能性があるため、無駄になってしまいます)。したがって、携帯電話のバックアップを通じてキャッシュをエクスポートするしかありません。Android システムではキャッシュファイルを直接エクスポートできるはずですが、iOS のメカニズムではアプリ自身のキャッシュファイルに直接アクセスできないため、携帯電話全体のバックアップを通じて行う必要があります。

私が使用しているツールは iMazing で、無料版で十分です。まず携帯電話のデータをバックアップし、次に WeChat の Documents フォルダを見つけてエクスポートします。手順は以下の図の通りです。無料版の iMazing には 10 回のエクスポート機会があります。
image

Documents フォルダには、少なくとも Hash 文字列で命名されたフォルダが 1 つ存在します。例えば、こんな感じです。

eb8a6093b56e2f1c27fbf471ee97c7f9

このようなフォルダには WeChat ユーザーの個人データが保存されています。この携帯電話で複数の WeChat にログインしていた場合、複数のこのような Hash 命名のフォルダが存在する可能性があります。どれが自分がエクスポートしたいものであるか不明な場合は、すべてエクスポートしてみてください。

./Documents/{hash}/wc/wc005_008.db と./Documents/{hash}/DB/WCDB_Contact.sqlite を見つけます。これらの二つが解析する必要のあるキャッシュファイルです。前者は友達の投稿データに関連するテーブルで、後者は友達データに関連するテーブルです。ここでは、アカウントのプロフィール画像を解析するためにこのテーブルが必要です。

(経験した問題:新しいバージョンの Mac では iTunes バックアップができなくなりました)

3. キャッシュの解析#

TL;DR このリポジトリをダウンロードし、wc005_008.dbWCDB_Contact.sqliteをルートディレクトリにドラッグし、main.pyの hash を自分の hash に変更して、python3 main.pyを実行すれば、moments.json をエクスポートできます。

スクリプトについて特に説明が必要なのは:

  1. スクリプト内で dl_img というパラメータを設定しました。True の場合、すべての画像をローカルにダウンロードします。結局、WeChat アカウントはすでに封鎖されているので、友達の投稿の画像がいつホストされるかわかりませんし、頻繁に外部から友達の投稿画像にアクセスすることが何が起こるかわかりません。ダウンロードできるうちにすべての画像をローカルにダウンロードすることをお勧めします。

  2. 共有リンクタイプの moment については、共有されたリンク自体だけでなく、WeChat がこのリンクにキャッシュした画像 / タイトル / 説明も解析し、友達の投稿がリンクをどのようにレンダリングするかを完全に再現しました。こうする理由は、以前に共有された多くのリンクがすでに 404 になっているからです…… リンクだけを解析してもあまり意味がないと思いますので、当時キャッシュされたデータをすべて解析する必要があると思います。少なくとも「表紙」を再現するために。

もちろん、このリポジトリのスクリプトがこのように書かれている背景には多くの分析があります。興味がある方は、次の部分を飛ばすかどうかを選択できます。

まず、WeChat は SQLlite キャッシュを使用しており、wc005_008.db というデータベースを分析するには、このオープンソースのsqlite browserを使用できます。簡単な分析を行った結果、db には大量のMyWC01_で始まるテーブルがあり、自分のアカウントの友達の投稿データはMyWC01_{$hash}というテーブルに存在します。$hash は先ほどのディレクトリの hash で、これは自分のアカウントの何らかの ID を表していると推測され、他のMyWC01_...は友達の友達の投稿データを表していると思われます。

自分の友達の投稿データを保存しているテーブルに入ると、非常に重要な二つのフィールドBufferidがあることがわかります。Buffer フィールドを utf-8 方式でデコードすると、多くの明文フィールドが見えます。中には画像の URL や友達の名前、以前に投稿した友達の投稿内容があります。したがって、Buffer フィールドから友達の投稿データを復元できることが推測されます。

ここで少し主線から外れて、「Buffer フィールドを utf-8 方式でデコードする」ということについて話します。このsqlite browserでは、バイナリファイルを utf8 方式でデコードして直接読む方法が見当たらなかったため、最終的にはこのテーブルのすべての Buffer フィールドをファイルに書き込み、hex viewer/editor を使用して読み取って分析しました。しかし、これもあまり順調ではありませんでした。多くの hex viewer/editor を探しましたが、utf8 のデコード方式をサポートしているものは見つかりませんでした。最終的に、私が見つけた唯一の utf8 解析をサポートするソフトウェアはSynalyze It!で、このソフトウェアは 2 週間の無料試用版しかなく、その後は 9.99 ドルの支払いが必要です。もっと良い方法があれば、皆さんと交流したいと思います。

主線に戻り、Buffer フィールドを分析し続けると、これらのデータの形式を完全に理解するのは難しいことがわかりますが、それでも固定の識別子に基づいて内容を特定することは可能です。典型的なペイロードはおおよそ次のようになります:

payload

異なるフィールドにはそれぞれ対応する識別フラグがあり、画像 / 内容 / 共有リンクなど、これらのフィールドは Buffer 内での形式が基本的にフラグが最初に現れ、その後に 1〜2 バイトのメッセージの長さを示すものが続き、その後がメッセージ本体となります。

本文内容の例として、以下の図は二つの友達の投稿内容のバイナリファイルです。観察すると、b'\xba\x01'が本文内容の識別子であることが簡単にわかります。
flag

これで基本的な考え方は明確になりました。まず、どのフィールドを解析する必要があるかを確認し(最終的に解析する必要があるフィールドは本文内容、画像リンク、共有リンク、共有リンクからレンダリングされた画像、共有リンクからレンダリングされたタイトル、共有リンクからレンダリングされた説明です)、次に解析するフィールドのフラグを特定し、最後にメッセージの長さとオフセットを解析する方法を考えればよいのです。

しかし、最後のピースが欠けています —— 投稿時間です。直感的に、テーブル内の別のフィールドidは時間に非常に関連していると思われます。なぜなら、これらの数字は実際の時間とともに増加するからです。したがって、これはタイムスタンプに基づくアルゴリズムであると推測されます。この部分については、@kaiiの助けに非常に感謝しています。最終的に、実際の create_time と id の変換アルゴリズムは次のようにほぼ確定しました。

create_time = id / 8388607990

この公式のマジックナンバー 8388607990 は MyWC_Message01 から推測されました。これはコメントを保存するテーブルで、原内容の正確な投稿時間はわかりませんが、このテーブルの create time フィールドからコメントの実際の投稿時間を知ることができます。このテーブルの別のフィールド id は原投稿の id に対応しているはずです。

私たちは簡略化して考えることができ、各投稿の最初の返信の create time と id の関係は原投稿と id の関係に等しいと考えられます。なぜなら、最初の返信の時間は原投稿の実際の投稿時間に最も近いからです。したがって、テーブル内の最大の Id/CreateTime をマジック係数として取得できます。

SELECT MAX(ID/CreateTime) FROM MyWC_Message01

実際にコメントから得られたマジック係数はわずかに小さかったため、より正確にするために、最後に自分の友達の投稿データをいくつかサンプリングし、WeChat アプリのフロントエンドに表示される投稿時間と照らし合わせて微調整を行い、最終的に 8388607990 という数字を得ました。この公式は、実際の投稿時間との誤差が 1 分以内であることを保証できます。

要するに、概念はこのようなものです。もちろん、具体的には多くの詳細があります。興味がある方は、コードの実装を直接参考にしてください。

(経験した問題:最初はこのリポジトリのコードを多く参考にしましたが、このリポジトリのコードは plist 形式で Buffer を解析しており、実際には現在のバージョンのキャッシュが何の形式であるかはわかりませんが、少なくとも plist 形式ではありません)

4. データの表示とブロックチェーンへの永続化#

データがすでにエクスポートされたので、実際には何をしても構いません。私はデータをブロックチェーンに保存することが非常にロマンチックな記録方法だと思うので、友達の投稿を Crossbell チェーンにバックアップし、同時に xFeed で再表示することにしました。

ブロックチェーン機能を実現し、自分のデータが正常にエクスポートされたかどうかを確認するために、リポジトリにはエクスポートスクリプトの他に、簡単な表示ページも作成しました。最終的な効果はおおよそ以下のようになります:

image

データのエクスポートに問題がなければ、ページ上で「ブロックチェーンに保存」をクリックし、手順に従って進めばよいです。しかし、ブロックチェーンとスムーズにやり取りするためには、いくつかの準備が必要です:

  1. Metamask ウォレットプラグインをダウンロードします。
  2. 水道でインタラクションに必要なガスを受け取ります。データが多すぎる場合、必要なガスの額が大きくなる可能性があります。さらにガスが必要な場合は、私に連絡してください。

この二つの準備が整ったら、ページ上で直接ブロックチェーンに保存することができます。

結論#

WeChat のバージョンは常に更新されており、キャッシュの構造も変化し続けています。本記事の内容は完全に一般的であるわけではなく、すべての状況をカバーすることもできませんが、この記事がいくつかの参考を提供し、皆さんに何らかのインスピレーションを与えることを願っています。他に発見があれば、ぜひ交流しましょう。

最後に、この記事で言及された二つのリポジトリを再度列挙します:

また、友達の投稿をエクスポートするだけでなく、QQ スペースの投稿をエクスポートするためのユーザースクリプトも書きました(はい、私の QQ も一緒に封鎖されたので)。QQ スペースのエクスポートははるかに簡単で、内容はすでにこちらにエクスポートされていますが、まだコードを整理していません。後で簡単なチュートリアルも書くつもりです。

参考#

先人に感謝します:

https://zhuanlan.zhihu.com/p/22474033

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。