更新日:2026-03-19 JST
まず境界を明確にしておきます。この文章で議論するのは、「自分のアカウント、自分のデバイス、自分のワークフローの自動化」です。最初にこの境界をはっきりさせておかないと、その後の技術的な判断の多くがずれてしまいます。なぜなら、個人アカウントの自動化と、第三者に向けたメッセージ取得や一括制御は、根本的に別の問題だからです。
多くの人は最初に2つの質問をします。メッセージを監視できるのか。メッセージを自動送信できるのか。この2つの質問自体は間違っていません。ただ、ここから直接始めると、たいていすぐに実装の詳細に沈み込みます。たとえば、ローカルデータベースを逆向き解析すべきか、クライアントを hook すべきか、システム通知を見るべきか、UI 自動化をすべきか、といったことです。本当に先に切り分けるべきなのは、機能ではなく、3つの層です。監視層、実行層、保存層です。
1. まず目標を3つの層に分ける。「できるか」から入らない
いわゆる監視層は、「何が起きたか」に答える役割を持ちます。たとえば、新着メッセージがあるか、どの会話に変化があったか、現在のウィンドウ内で本文を読めるか、といったことです。実行層は、「自分に何の操作ができるか」に答えます。たとえば、会話を切り替える、文字を入力する、送信をクリックする、画像やファイルを送る、などです。保存層はさらに下の能力で、前面の UI に依存しない状態で、会話、メッセージ、カーソル、未読状態といった構造化データを安定して取得できるかを決めます。
この3つの層を分けると、多くの判断が一気に明確になります。たとえば、「自動返信できるか」は、初日からローカルデータベースを完全に解読することを必要としません。同じように、「メッセージを監視できるか」も、必ずしも暗号化ライブラリの逆向き解析だけに頼る必要はありません。UI で先に通した方がよいこともあれば、ローカル保存でしか解決できないこともあります。ただし、この2つは二者択一の関係ではありません。
2. 監視層には少なくとも3つのルートがあるが、安定性は大きく違う
1つ目のルートはシステム通知です。この方法の利点は、実装が速く、侵入性が低く、WeChat 本体やローカルデータベースにほとんど触れなくてよいことです。macOS では、WeChat が通知を通知センターに配信できるなら、タイトル、本文の一部、グループチャット情報などを取得できる可能性があります。PoC にとっては、これはほぼ最速のルートです。
ただし、このルートの問題も明確です。会話で通知が無効なら、何も見えません。メッセージが長いと本文は切り捨てられます。そもそも一部のメッセージ種別は、システム通知に完全な形で出てきません。つまり、通知センターはむしろ fallback に近く、軽量なイベントソースには向いていますが、最終的なメッセージ監視方式としては向いていません。
2つ目のルートは UI 自動化、つまり前面の WeChat ウィンドウのアクセシビリティツリーを読む方法です。その価値は、ローカルデータベースを先に解読しなくても、会話一覧、現在のチャットウィンドウ内の可視メッセージ、さらに入力欄、送信ボタン、添付ボタンといった操作可能な要素を直接読める可能性があることです。「自分のアカウント自動化」にとって、このルートは現実的な意味が大きいです。なぜなら、監視と実行の両方を同時にカバーできるからです。
問題も同じく明確です。UI 自動化は本質的に、WeChat の現在バージョンの画面構造に依存し、システムのアクセシビリティ権限にも依存し、さらにデスクトップ上のウィンドウが本当にアクセス可能な状態であることにも依存します。これはバックグラウンドサービス型の監視ではなく、「今このデスクトップ上にあるクライアントウィンドウ」の監視です。したがって、実用的なツールには向いていますが、安定した API と誤認してはいけません。
3つ目のルートはローカルデータベースと関連するサイドカーファイルです。理論上、これが最も「本当の監視」に近い方法です。なぜなら、会話データベースとメッセージデータベースを安定して読めるなら、多くの問題が一気に整理されるからです。新着メッセージがあるか、どの会話に属するか、未読数がどう変わったか、メッセージ種別は何か、といったことを、すべて構造化データとして扱えるようになります。
しかし現実には、これが最も敷居の高いルートでもあります。理由は、データベースが暗号化されているからだけではありません。多くのクライアントは、「復号処理」を、簡単に横取りできる標準インターフェースとしてそのまま公開してはいません。ファイルがデータベースのように見えるからといって、それが plain SQLite とは限りません。key_info.db を読めたからといって、その中の blob がそのまま使える鍵だとも限りません。多くの場合、本当に価値のある手がかりは、ファイルの静的構造ではなく、実行時の初期化経路の中にあります。
3. 目標が「まず作ること」なら、「体系を先に解き明かすこと」より実行層を先に着地させるべき
これは過小評価されやすい判断です。多くの人は自然に、「監視が最重要だ」と考えます。監視できなければ自動化できないからです。しかし、エンジニアリングを前に進める観点では、むしろ実行層を先に通すべきことが多いです。理由は単純で、先に「指定チャットに切り替える、文字を入力する、送信をクリックする」という一連の能力を持てば、自動化の閉ループに出口ができます。
いったん送信経路が使えるようになれば、その前段の監視は、しばらく不完全でも受け入れられます。たとえば、初期段階では通知センターを軽量イベントソースとして使い、UI 自動化で会話や本文を補うことができます。あるいは、まずは「現在の会話に1件自動送信する」だけを支援し、「全会話を安定監視する」ことは急がなくてもよいのです。これは十分に美しい設計には見えないかもしれませんが、非常に実務的です。優先して検証しているのが、自動化の閉ループそのものであり、研究の深さではないからです。
だからこそ、私は「送信」を、より早い段階で着地させるべきモジュールだと考えます。見た目は完璧でなくてもかまいません。しかし、それによってあなたが「クライアントを観察する段階」から「クライアントを制御する段階」へ進めているかどうかが決まります。
4. 保存層は本当の天井だが、最初からここに自分を閉じ込めるべきではない
最終的にあなたが作りたいものが、長期稼働し、できるだけデスクトップウィンドウに依存せず、できるだけ構造化された WeChat 自動化システムであるなら、ローカル保存層には遅かれ早かれ向き合うことになります。とくに、要件が次のような問題に及び始めたときです。
- どの会話に新着メッセージが来たのかを知りたい。
- 通知が有効かどうかに依存したくない。
- WeChat ウィンドウが常に前面にあることを要求したくない。
- 異なるメッセージ種別をすべて構造化して処理したい。
この段階では、通知や UI の層にとどまり続けるのは、ますます苦しくなります。なぜなら、それらはどちらも画面依存と状態依存が非常に強いからです。いっぽう、保存層が通れば、もともと脆弱だった多くの判断を、確定的なものに変えられます。
しかし、エンジニアリングで最も避けるべきなのは、最初からすべての希望をこの最難関のルートに賭けることです。とくに、暗号化データベース、実行時の解除経路、クライアント固有の非公開ラッパーを相手にするとき、十分な検証ポイントがなければ、何日も低レベルの逆向き解析の中を回り続け、しかもまだ使える結果が何もない、ということが簡単に起こります。
だから、より合理的なやり方はこうです。保存層を能力の上限とみなし、第1段階の唯一の入口とはみなさないことです。
5. 本当に実務的な進め方は、「先に閉ループ、あとで純化」
もし私が「自分の WeChat アカウント自動化」に、より現実的な進行順を付けるなら、次のように分けます。
第1段階では、まず実行層を通します。少なくとも最低限使える送信能力が必要です。たとえば、現在の会話にテキストを送る、あるいは検索で特定の連絡先に切り替えてから送信する、といったものです。この段階の目標は、企業向けレベルの安定性ではなく、自動化アクションの連鎖そのものが到達可能かを確認することです。
第2段階では、十分に安い監視層を1つ、イベントソースとして確保します。通知センターでもよいですし、ファイル変更でも、前面 UI の変化でもかまいません。この段階の目標は、「何かが起きた」と分かることです。
第3段階では、イベントソースを徐々に弱い信号から強い信号へと引き上げます。たとえば、「通知の中でメッセージを見た」から、「UI で本文を読める」へ、さらに「ローカルデータベースが構造化された会話とメッセージを返せる」へと進めます。
第4段階では、監視層と実行層の両方が十分使えるようになってから、ルールエンジンを考えます。たとえば、特定のキーワードを受け取ったら自動でアーカイブ、転送、通知する、あるいは特定の会話でテンプレート化された内容を自動返信する、といったものです。
この順序の核心は、まず閉ループを作り、そのあとで各層を純化していくことです。最初から「最終形」を追わないでください。そうしないと、最も難しく、最も不確実な実装に、早い段階で自分を閉じ込めてしまいます。
6. 公開の議論で本当に記録する価値があるのは、「どう hack するか」ではなく「どう工学的に取捨選択するか」
私はますます、この種の自動化問題で本当に価値があるのは、「魔法のようなインターフェースがあるかどうか」ではなく、あるルートに投資し続ける価値があるかどうかを、どう判断するかだと感じています。
通知ルートの価値は、速さです。UI 自動化ルートの価値は、現実に使えることです。ローカルデータベースルートの価値は、最終的な上限です。どれも間違いではありません。ただし、答えている問題がそれぞれ違います。多くのプロジェクトは、技術的に不可能だから死ぬのではなく、どのルートが結果を取りに行くためのものか、どのルートが長期能力を積み上げるためのものかを区別できないために止まります。
もし1つだけ結論を持ち帰るなら、それは次の3点です。
- 自分のアカウント自動化で、最初に切り分けるべきなのは、監視層、実行層、保存層である。
- 第1段階ではまず閉ループを優先し、いきなり最も深い逆向き解析経路に自分を縛りつけない。
- 本当に安定した会話単位・メッセージ単位の構造化データが必要になったときにだけ、ローカルデータベース層へ本格的に力をかける価値がある。
まとめ
「自分の WeChat アカウント自動化」は、一見すると機能の問題に見えますが、実際にはむしろ階層設計の問題です。本当に差がつくのは、誰がより速く1本のスクリプトを書けるかではなく、誰がより早く問題を正しく分解できるかです。
まず層を分け、次に実行を着地させ、そのあとで監視を補い、最後に保存層へ進むかを決める。この順序はロマンがないかもしれませんが、とても有効です。個人自動化にとって、エンジニアリングで最も重要なのは、決して「最も深いこと」ではなく、「まず作り上げること」なのです。
コメント
コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。