オープンな職場には、昔からある問題がある。こっそり息抜きでWeChatに返信しようとしても、あの蛍光グリーンのアイコン + 画面いっぱいのチャット吹き出しは、3メートル離れていてもすぐ分かる。ボスが背後を通れば、ひと目で仕事をしていないとばれてしまう。
wechat-use は、macOSのWeChatをローカルのコマンドラインツールに変えるプロジェクトで、ついでにこの気まずさも解決できる。3つの手を使えば、画面の上ではもうWeChatで会話しているように見えない。以下では、それぞれの方法について、どう実現しているかまで説明する。

第一手:チャットを端末に移す
wechat-use chat は、端末の中にチャット画面を開く。Claude CodeのようなTUIに似ていて、左側に会話リスト、右側にメッセージの流れ、下に入力欄があり、文字を打ってEnterを押すと送信される。
wechat-use chat # 会話リストに入り、上下で選ぶ
wechat-use chat 張三 # 特定の相手との会話に直接入る
どう実現しているか
このTUI(Rustのratatuiで描画している)はWeChatの画面には触れない。つないでいるのは、下層にある3つのデータ流だ。
- 過去のメッセージ:WeChatのチャット履歴は、ローカルのSQLCipher暗号化データベースに保存されている。アカウントの復号keyを取得したら、復号後のデータベースを直接読む。会話リスト、履歴、検索はすべてSQLで取り出すので、WeChatクライアントが開いているかどうかには関係ない。
- 新しいメッセージ:常駐バックグラウンドプロセス(daemon)が、これらのデータベースファイルの変化(FSEvents)を監視する。データベースに書き込まれると、新しい行を復号してTUIへ流すので、端末の中で受信をリアルタイムに見られる。
- 送信:入力欄でEnterを押した後、メッセージはバックグラウンドで送信される——WeChatのウィンドウは出ず、マウスやキーボードの操作も奪わない。このバックグラウンド送信の経路が、WeChatに付着せず、データベースも壊さずにどう動くのかは、別の記事:「デバッガを付ける」から「ゼロ付着」へで書いた。受信した画像はTUIではまず
[画像]として表示され、/imgを打ったときだけシステム既定の画像ビューアで開く。
効果としては、同僚が通りかかっても、見えるのは黒い背景のウィンドウ、等幅フォントの文字の集まり、コマンドを実行しているような人だけだ。画面にはWeChatらしさがまったくないので、自然とWeChatで会話しているとは思われない。
第二手:WeChat App自体を偽装する
端末の関門は越えたとしても、まだ弱点がある。Dockのグリーンアイコン、Cmd-Tabでアプリを切り替えたときに出る「WeChat」、アクティビティモニタに堂々と表示されるWeChat。ちらっと見られただけで見破られる。
wechat-use disguise list # 使える偽装スキンを見る
wechat-use disguise apply console # WeChatをConsoleに変え、アイコンも端末風にする
wechat-use disguise status
wechat-use disguise restore # ワンタッチで元の緑色WeChatに戻す
どう実現しているか
macOS上では、Appの「身元」は実のところ、その.appパッケージにあるいくつかのものから来ている。Info.plistのCFBundleName / CFBundleDisplayName(DockとCmd-Tabに表示される名前)、Resourcesの.icnsアイコンファイルだ。これらを差し替えると、システムからは別のAppに見える。
ただし、避けられない手順がある。.appパッケージ内のどのファイルでも変更すると、元のコード署名は無効になる。署名が壊れると、Gatekeeperに止められたり、以前に許可したアクセシビリティ / 画面収録などのTCC権限が認識されなくなったりする。だからアイコンと名前を替えた後は、この.appにもう一度ad-hoc署名をしないと、システムが認めてくれない。
ここには重要な境界があり、これも実際に踏んだ落とし穴だ。再署名で触るのは.appの外側だけで、メッセージ送信を担う中核ライブラリには絶対に触れない。理由は、送信がこのライブラリのバージョンをファイルハッシュ(SHA-256)で正確に照合し、対応するアダプタデータを読み込むことに依存しているからだ。ひとたびそのバイトを変えると、ハッシュが変わり、一致しなくなり、送信はそのまま失敗する。最初は手間を省こうとして、ついでにライブラリ内の配色まで変えたところ、sendがその場で壊れた。つまり、そういう壊れ方をする。だからdisguiseの設計は、外側はいくら偽装してもよいが、中核は1バイトも動かさない、というものだ。
第三手:ボスが本当に近づいてきたら、ワンタッチで隠す
前の2つは「ちらっと見る」ことへの対策だ。もしボスが直接机の前まで来るなら、瞬時に隠すためのハードスイッチが必要になる。
wechat-use disguise bosskey on # グローバルショートカットを入れる
その後、⌃⌥Space(Control + Option + 空白)を押すと、WeChatは一瞬で隠れる。ボスが去ったらもう一度押せば、元の状態に戻る。
どう実現しているか
ボスキーは、macOSのシステムレベルのグローバルホットキーを使っている。常駐する小さなバックグラウンドプログラム(LaunchAgent)が、⌃⌥Spaceという組み合わせをシステムに登録する。現在のフォーカスがどのAppにあっても、押せばそれが捕捉される。発火すると、WeChatプロセスに非表示動作(このAppを隠すのと同等)を送り、もう一度押すと復帰する。システムレベルで登録しているので、端末、ブラウザ、IDEのどこにいても同じように効く。
使い方 / 戻し方
この一式はwechat-use v1.17.0に入っている(GitHub)。インストールしてwechat-use initを実行し、keyを抽出すれば使える。chatは読み取り + バックグラウンド送信で、disguiseはAppの外側だけを変え、チャットデータには触れない。disguise restoreでいつでもワンタッチでグリーンのWeChatに戻せる。
技術的には、黒魔術のようなものはない。復号されたローカルデータベースを読む、.appのアイコンと名前を替えて再署名する、グローバルホットキーを登録する。この3つを組み合わせると、画面の上で正体がばれないWeChatになる。勤務中に息抜きをするかどうかは、また別の話だ——もし本当にするなら、せめてあの蛍光グリーンに裏切られないように。

微信
支付宝
コメント
コメントは即時公開されますが、ポリシー違反時は非表示になる場合があります。