开放工位有个老问题:趁摸鱼回个微信,可那个荧光绿图标 + 满屏聊天气泡,隔着三米都认得出。老板从背后走过,一眼就知道你没在干活。
wechat-use 这个把 macOS 微信变成本地命令行工具的项目,顺手能解决这个尴尬。三招下来,屏幕上再也看不出在聊微信。下面每招都连着讲清楚是怎么做到的。

第一招:把聊天搬进终端
wechat-use chat 在终端里开一个聊天界面,长得跟 Claude Code 那种 TUI 一样:左边会话列表,右边消息流,底下输入框,打字回车就发。
wechat-use chat # 进会话列表,上下选
wechat-use chat 张三 # 直接进跟某人的对话
怎么做到的
这个 TUI(用 Rust 的 ratatui 画的)本身不碰微信界面,它接的是底层三条数据流:
- 历史消息:微信的聊天记录存在本地的 SQLCipher 加密库里。拿到账号的解密 key 之后,直接读解密后的库,会话列表、历史、搜索全是 SQL 查出来的,跟微信客户端开不开没关系。
- 新消息:一个常驻后台进程(daemon)盯着这些库文件的变化(FSEvents),库一被写入就把新行解出来推给 TUI,所以你在终端里能实时看到来信。
- 发送:输入框回车后,消息是后台发出去的——不弹微信窗口、不抢你的鼠标键盘。这条后台发送链本身怎么做到不附着微信、又不搞坏数据库,我单独写过一篇:从「挂调试器」到「零附着」。收到的图片在 TUI 里先显示成
[图片],敲/img才用系统默认看图器打开。
效果是:同事路过,看到的是一个黑底窗口、一堆等宽字、一个像在跑命令的人。屏幕上压根没有微信那个样子,自然没人觉得你在聊微信。
第二招:把微信 App 本身伪装掉
终端那关过了,还有破绽:Dock 里的绿图标、Cmd-Tab 切应用蹦出来的「微信」、活动监视器里赫然写着 WeChat。瞄一眼就穿帮。
wechat-use disguise list # 看有哪些伪装皮
wechat-use disguise apply console # 微信变成 Console、图标也换成终端
wechat-use disguise status
wechat-use disguise restore # 一键变回原来的绿色微信
怎么做到的
macOS 上一个 App 的「身份」其实就来自它 .app 包里的几样东西:Info.plist 里的 CFBundleName / CFBundleDisplayName(Dock 和 Cmd-Tab 显示的名字)、Resources 里的 .icns 图标文件。把这几样换掉,系统看到的就是另一个 App。
但有个绕不过的环节:改了 .app 包里的任何文件,原来的代码签名就失效了。签名一坏,Gatekeeper 会拦、之前授过的辅助功能 / 屏幕录制等 TCC 权限也会失认。所以换完图标和名字,必须对这个 .app 重新做一次 ad-hoc 签名,系统才认。
这里有个关键边界,也是踩过的坑:重签只动 .app 外壳,绝不碰里面那个负责发消息的核心库。原因是发送依赖按文件哈希(SHA-256)精确匹配这个库的版本来加载对应的适配数据;一旦改了它的字节,哈希变了,就匹配不上,发消息直接失效。最早图省事顺手连库里的配色也改了,结果 send 当场报废,就是这么炸的。所以 disguise 的设计是:外壳随便伪装,内核一个字节不动。
第三招:老板真凑过来了,一键隐藏
前两招防的是「瞄一眼」。要是老板直接走到桌前,得有个瞬间隐藏的硬开关。
wechat-use disguise bosskey on # 装上全局快捷键
之后按 ⌃⌥Space(Control + Option + 空格),微信瞬间藏掉;老板走了再按一下,原样回来。
怎么做到的
老板键挂的是一个 macOS 系统级全局热键:一个常驻的小后台程序(LaunchAgent)向系统注册 ⌃⌥Space 这个组合键,不管你当前焦点在哪个 App,按下都会被它截获。触发时它对微信进程发一个隐藏动作(等价于把这个 App 隐藏起来),再按一次再恢复。因为是系统级注册,所以你正在终端、浏览器、IDE 里都一样灵。
怎么用 / 怎么还原
这套都在 wechat-use v1.17.0 里(GitHub),装好跑 wechat-use init 抽完 key 就能用。chat 是只读 + 后台发送,disguise 只改 App 外壳、不碰聊天数据,disguise restore 随时一键变回绿色微信。
技术上没什么黑魔法:读解密的本地库、换 .app 的图标和名字再重签、注册一个全局热键。三样拼起来,就是一套屏幕上不露馅的微信。至于上不上班摸鱼,那是另一回事——真要摸,至少别被那抹荧光绿出卖。

微信
支付宝
评论
评论发布后会立即公开,如触发规则可能被审核下架。