wxauto 停更后,我复刻了一个支持微信 4.x 的自动化库:wechatauto
作者:fanyuantaier | 邮箱:fanyuantaier@163.com 项目地址:https://github.com/fanyuantaier/wechatauto-replica,https://pypi.org/project/wechatauto-replica/ 当前版本:v1.0.5(2026-08-10)
一、背景:wxauto 为什么\”死\”了
如果你关注过 Python 微信自动化,一定听说过 wxauto——一个基于 Windows UIAutomation 的开源库,由 cluic 从 2020 年维护到 2025 年,巅峰时期 GitHub 7k+ Star,几乎是\”用 Python 操作微信 PC 客户端\”的唯一选择。
2025 年 10 月 28 日,项目正式归档,README 上写着 “wxauto (2021-2025),本项目于 2025-10-28 停止维护”。
原因不复杂:微信 4.x 把 UIAutomation 这条路彻底堵死了。
| 3.9.x | ✅ 正常,控件树完整 |
| 4.0.0 – 4.0.5 | ⚠️ 勉强可用 |
| 4.1.12+ | ❌ 完全失效 |
微信 4.x 聊天区域改用 Qt 自绘渲染(窗口类 MMUIRenderSubWindow*,不同版本后缀不同,如 MMUIRenderSubWindowHW / MMUIRenderSubWindow),对 UIAutomation / MSAA 完全不暴露无障碍节点——控件树里连\”输入框\”“消息列表”\”发送按钮\”的影子都找不到。老 wxauto 的纯 UI 方案无计可施,这也是作者停更的直接原因。
老路走不通,那就换条路。这就是我复刻 wechatauto 的契机。
二、总体方案:两条技术路线
wechatauto 是上游 wxauto 的复刻版,面向微信 4.x Windows 客户端(非网页版,直接操作本机客户端)。针对\”UI 抓不到\”的现实,拆成两条互补路线:
| 本地数据库解密 | wechatauto/db.py | 读取消息、监听、历史导出、会话/联系人 | ✅ 全链路验证 |
| 坐标 + OCR | wechatauto/guia.py | 发送文本/文件/图片、回复、@成员 | ✅ 文本/文件/图片实测稳定 |
外加两个独立子系统:媒体下载(media.py,图片 v2 解密)、朋友圈读取(moment.py,直读 sns.db)。
一句话概括设计哲学:能直接读数据就不碰界面;必须碰界面时用视觉替代控件。
三、读取原理:本地数据库解密(核心亮点)
微信 4.x 的所有数据都存放在本地 SQLCipher 4 加密的 SQLite 数据库中:
D:\\微信文件\\xwechat_files\\<wxid>_xxxx\\db_storage\\
├── contact\\contact.db 联系人(昵称、备注)
├── session\\session.db 会话列表(未读数、摘要)
├── message\\message_0..4.db 聊天消息(按会话分表 Msg_<md5>,跨库分片)
├── message\\media_0.db 语音(VoiceInfo.voice_data,SILK 二进制)
├── message\\message_resource.db 文件原名(MessageResourceDetail.packed_info)
├── sns\\sns.db 朋友圈(SnsTimeLine,SnsDataItem XML)
└── …
每个库都是 SQLCipher 4:页大小 4096,PBKDF2-HMAC-SHA512(加密密钥迭代 256000 次),每页 IV(16) + HMAC(80)。
3.1 密钥提取:进程内存只读扫描
每个数据库有独立的 32 字节密钥,运行时保存在微信进程 com.Tencent.WCDB.Config.Cipher 配置对象中。提取流程:
全程只读扫描、不注入不改写,微信进程无感知。
3.2 WAL 增量合并(帧盐校验)
微信 -wal 是预分配文件:checkpoint 时 WAL 头 salt+1 并清零写游标,但旧世代帧仍留在文件中。若合并时不过滤帧盐,会把过期页覆盖进主库,报 database disk image is malformed。
修复方案:读取 WAL 头 salt1/salt2,仅合并 salt 与当前 WAL 头一致的帧,旧世代帧直接跳过;合并结果用 PRAGMA integrity_check 校验,失败自动回退全量重建。实测 contact.db 合并后 integrity OK,2354 个联系人全部可查。
3.3 消息查询与监听
- 会话名 → Md5(会话微信号) → 表名 Msg_<md5>;同一会话可能分片在多个 message_*.db,按 sort_seq 合并排序;
- 关键列:local_type(消息类型)、real_sender_id(2=自己)、server_id、






