wx-cli:用命令行查询本地微信数据

0 阅读5分钟

wx-cli:用命令行查询本地微信数据

微信的聊天记录、联系人、朋友圈,全都锁在本地的 SQLCipher 加密数据库里。官方没有提供任何导出接口,第三方工具要么需要越狱,要么只能在 Windows 上跑,要么早就停更了。wx-cli 做的事情很直接:从微信进程内存里把密钥取出来,解密本地数据库,然后给你一个命令行接口查所有数据。

密钥在哪里,怎么取

微信 4.x 用的是 SQLCipher 4,加密参数是 AES-256-CBC + HMAC-SHA512,PBKDF2 迭代 256,000 次。这个参数组合在 2024 年之前基本是暴力破解无望的。但微信为了性能,把派生后的 raw key 缓存在进程内存里,格式是固定的:x'<64 位十六进制 key><32 位十六进制 salt>',总共 100 个字符,前缀是 x',后缀是 '

wx-cli 在三个平台上用不同方式扫这段内存:macOS 用 Mach VM API(mach_vm_region + mach_vm_read),Linux 读 /proc/<pid>/mem,Windows 用 VirtualQueryEx + ReadProcessMemory(需要 PROCESS_VM_READ | PROCESS_QUERY_INFORMATION 权限)。扫到匹配的字符串之后,用它直接打开 SQLCipher 数据库,验证能不能读出数据,能读就是对的。

整个过程在 sudo wx init 里完成,密钥写到 ~/.wx-cli/all_keys.json,后续不需要再扫内存。

macOS 上的额外麻烦

macOS 的 TCC(透明度、同意和控制)机制会拦截跨进程内存读取。wx-cli 的解法是对 WeChat.app 做 ad-hoc 重签名,让它的代码签名变成一个本地自签的身份,这样 Terminal 拿到开发者工具权限之后就能扫它的内存。

重签名的命令是:

codesign --force --deep --sign - /Applications/WeChat.app

但重签名有一个副作用:macOS TCC 数据库里存的是 bundle id + csreq(代码签名要求)的联合记录,重签之后 csreq 变了,旧的授权记录就失效了,而且 System Settings 里的开关还显示"已允许",实际运行时是拒绝的。所以重签之后必须把微信在 TCC 里的旧记录清掉:

for s in ScreenCapture Camera Microphone AppleEvents AddressBook \
         SystemPolicyDocumentsFolder SystemPolicyDownloadsFolder SystemPolicyDesktopFolder; do
  tccutil reset "$s" com.tencent.xinWeChat
done

清完之后重启微信,让它重新申请权限,然后跑 sudo wx init。这个流程只需要做一次,微信更新后重做。

Daemon 架构和缓存

wx-cli 用 daemon 进程管理解密后的数据库,CLI 和 daemon 之间走 Unix socket 通信。daemon 在第一次调用时自动启动,不需要手动管理。

缓存策略是 mtime 感知的:daemon 把解密后的数据库存在 ~/.wx-cli/cache/,同时记录每个数据库文件的 mtime。下次调用时先比较 mtime,没变就直接用缓存,不重新解密。微信的数据库文件在有新消息时才会更新,所以大多数查询都能命中缓存,响应在毫秒级。

能查什么

安装完成后,wx sessions 列出最近 20 个会话,能看到就说明一切正常。

消息查询支持按联系人、时间范围、关键词过滤:

wx history "张三" -n 2000
wx history "AI群" --since 2026-04-01 --until 2026-04-15
wx search "关键词" --in "工作群" --since 2026-01-01
wx new-messages   # 增量,只拉上次检查后的新消息

联系人和群组:

wx contacts --query "李"
wx members "AI交流群"

群成员数据里有 group_nickname(群昵称)和 contact_display(联系人备注),两个字段分开,不会混。

朋友圈分三个命令,互动通知、时间线、全文搜索各自独立:

wx sns-notifications          # 点赞/评论通知
wx sns-feed --user "张三"     # 某人的朋友圈
wx sns-search "婚礼" --since 2023-01-01

公众号文章存在单独的 biz_message_0.db,用 wx biz-articles 查,支持按公众号名称过滤、按时间范围过滤,也支持 --unread 只看有未读的公众号。

收藏和统计:

wx favorites --type image
wx stats "AI群" --since 2026-01-01
wx export "张三" -n 2000 --format markdown -o chat.md

图片附件解密

聊天里的图片以加密的 .dat 文件存在本地,wx-cli 0.2.0 加了附件提取功能。先列出附件拿到 attachment_id,再解密写出来:

wx attachments "AI群" --kind image -n 100
wx extract <attachment_id> -o ~/Desktop/photo.jpg

图片加密有三档,wx-cli 会自动识别并选对应的解码器:

  • legacy XOR,早期版本,单字节 XOR,没有 magic header,靠文件首字节反推格式
  • V1 fixed-AES,magic header 是 07 08 V1 08 07,AES-128-ECB,固定 key cfcd208495d565ef
  • V2 AES+XOR,magic header 是 07 08 V2 08 07,AES-128-ECB + XOR,key 从平台派生

V2 的 key 提取在 macOS 上从 kvcomm 缓存文件里读,文件名里有 uin,用 md5(str(uin) + wxid)[:16] 算出 AES key,XOR key 是 uin & 0xff。Windows 上扫 Weixin.exe 内存匹配候选 key,再用 V2 模板密文块反验。Linux 暂不支持 V2。

给 AI Agent 用

wx-cli 默认输出 YAML,比 JSON 省 token,也更易读。需要程序处理时加 --json

wx new-messages --json
wx biz-articles --since 2026-05-10 --json | jq '.[].url'

项目提供了 SKILL.md,可以通过 npx skills add jackwener/wx-cli 一键安装到 Claude Code、Cursor、Codex 等 agent。安装后 agent 会自动读取 SKILL.md,知道怎么安装和调用 wx-cli,不需要额外配置。这个机制让"帮我看看微信里有没有关于 XX 的消息"这类请求变得可以直接执行。

项目现状

wx-cli 用 Rust 写,截至 2026 年 5 月,2147 star,0.2.0 版本,最近一周还在活跃提交。支持 macOS(Apple Silicon / Intel)、Linux、Windows,npm 安装或 curl 安装都行。

微信数据一直是个尴尬的存在:它在你的硬盘上,但你拿不到。wx-cli 解决的是这个最基础的问题,把数据的控制权还给用户。在 AI 工具越来越依赖个人上下文的今天,能把自己的聊天记录、联系人关系、收藏内容接入 agent,是一件比看起来更有价值的事。


项目地址github.com/jackwener/w…