把 PC 微信(4.x / 3.x)和安卓微信的聊天记录导出成 Markdown 文件,附带图片、视频、文件等附件。纯 Python 标准库实现,不依赖第三方包。
- 命令行:
scan/key/list/export/serve - 本地网页界面:会话列表、消息搜索、日期筛选、图片预览、一键导出
- 解密后的数据库默认只存在内存里,不落盘明文
- Windows 10/11,Python 3.10 及以上(开发环境 3.13)
- 无需安装依赖;AES 优先用
pycryptodome,没有则走 Windows 自带 CNG(bcrypt.dll)
python -m wexport --help| 类型 | 数据目录 | 密钥 |
|---|---|---|
| PC 微信 4.x | xwechat_files\wxid_xxx_xxxx\db_storage |
32 字节 raw key(SQLCipher 4,页 4096) |
| PC 微信 3.x | WeChat Files\wxid_xxx\Msg\Multi |
32 字节 raw key(SQLCipher 3,页 1024) |
| 安卓微信(离线库) | 含 EnMicroMsg.db 的目录 |
md5(IMEI + uin)[:7],或用 --key 指定原始密钥 |
scan 会自动从注册表和常见文档目录里找到本机账号:
python -m wexport scan输出示例:
[1] win4 wxid_a1b2c3d4e5f6 (加密)
E:\Documents\xwechat_files\wxid_a1b2c3d4e5f6_b31b
[2] win3 wxid_a1b2c3d4e5f6 (加密)
E:\Documents\WeChat Files\wxid_a1b2c3d4e5f6
微信 4.x 的数据库使用 SQLCipher 4 加密,每个库有独立密钥。密钥不落盘,但微信运行时会以
com.Tencent.WCDB.Config.Cipher 配置对象的形式驻留在进程内存里,并且整块数据与固定掩码异或。
python -m wexport key --account 1 会扫描内存里的这个配置对象,取出 32 组候选密钥,再用每个库的
salt 逐库校验归属,命中的密钥缓存到 %APPDATA%\wexport\config.json(DPAPI 加密),之后的
list / export / serve 不再需要 --key。如果微信刚启动还没有打开过聊天,密钥可能尚未加载,
先打开任意会话再重试即可。也可以手工传入:
python -m wexport list --account 1 --key 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef密钥会记住,之后的命令可以省略 --key。
- 把手机上的整个微信数据目录拷出来(需要 root 或已经备份),至少包含:
EnMicroMsg.dbshared_prefs/auth_info_key_prefs.xml(提供_auth_uin)shared_prefs/system_config_prefs.xml(提供 IMEI,没有则默认1234567890ABCDEF)
- 运行:
python -m wexport list --android-dir D:\wechat-android
python -m wexport export --android-dir D:\wechat-android --out D:\export --media-root D:\wechat-android-media--media-root 指向从手机拷出的 /sdcard/tencent/MicroMsg 内容,图片/视频/语音会按路径匹配复制。
python -m wexport export --account 1 --out D:\wechat-export产物结构:
D:\wechat-export\
├── index.md # 会话索引(名称、类型、条数、最近时间)
├── 张三.md
├── 产品群.md
└── attachments\
├── 张三\
│ └── 20240315_0001_9f8e7d6c.jpg
└── 产品群\
└── 20240315_0002_季度报表.xlsx
常用参数:
| 参数 | 说明 |
|---|---|
--chat 张三 |
只导出名称包含“张三”的会话(可重复) |
--since 2024-01-01 --until 2024-03-31 |
按时间范围过滤 |
--skip-media |
不写附件,只导出文字 |
--media-root 目录 |
手动指定媒体根目录 |
--image-key 值 |
4.x 图片密钥:16 个 ASCII 字符或 32 位十六进制;auto(默认)首次自动从内存提取并缓存,off 不解码 |
--temp-files |
解密后写临时文件而不是内存库(大库更省内存) |
python -m wexport serve --account 1命令会打印一个带随机 token 的地址,例如 http://127.0.0.1:8765/?token=...,浏览器打开即可。只监听 127.0.0.1,每个请求都校验 token。界面支持会话搜索、消息全文搜索、日期筛选、图片预览和后台导出。
- PC 微信 3.x / 安卓:图片基本是明文(
.jpg/.png等),直接复制。 - PC 微信 4.x:
msg\attach\<会话md5>\<年-月>\Img\<file_id>*.dat是加密容器,同一张图通常有三档:_h.dat原图(多为 PNG),.dat下发版(多为wxgf/HEVC 容器),_t.dat缩略图(JPEG)。- 格式为 15 字节头 + AES-128-ECB 加密段 + 明文段 + 单字节异或段;AES 密钥是账号级 16 字符字符串, 只在微信打开过图片期间驻留内存。
- 首次导出时工具会自动扫描微信进程内存取出该密钥并缓存到配置目录,之后无需再扫;
也可以
--image-key 16字符手工指定,或--image-key off跳过解码。 wxgf是微信自己的 HEVC 容器,Windows 无法直接显示;遇到时工具会依次退回.dat的同名_t.dat缩略图或_h.dat原图,全部不可用时保留原始容器并在 Markdown 中标注。
- 不解密 HMAC、不校验完整性;只做读取,不会写回微信。
- 支持文本、图片、语音、视频、文件、名片、位置、表情、链接、引用、合并转发、转账、红包、系统消息;语音不做 silk 转码,导出的是原始数据引用。
- 朋友圈、小程序、视频号内容不在导出范围。
- 微信正在运行时也可以读取(普通文件共享读),但 WAL 中尚未落盘的数据依赖
-wal文件,导出前最好让微信完成一次 checkpoint。
python -m unittest discover -s wexport/tests -t .共 35 项:SQLCipher 页布局(含 4.x reserve=80)、WAL 重放、图片 V2 容器、内容解析、4.x 合成端到端导出。
需要 PyInstaller(pip install pyinstaller):
python -m PyInstaller --noconfirm --onefile --console --name wexport `
--add-data "wexport\web\static;wexport\web\static" `
--hidden-import wexport.web.server --hidden-import wexport.win.deep_scan `
--hidden-import wexport.win.image_key `
--hidden-import wexport.sources.win4 --hidden-import wexport.sources.win3 `
--hidden-import wexport.sources.android wexport_exe.py产物是 dist\wexport.exe(约 10MB,单文件,不需要目标机器装 Python)。
双击 exe 默认会直接找到账号、启动本地网页界面并打开默认浏览器;想要命令行用法就带上参数,例如 wexport.exe scan、wexport.exe serve --account 1、wexport.exe --help。控制台统一按 UTF-8 输出(启动时会把控制台代码页切到 65001,退出时还原),避免中文乱码。
wexport/
├── cli.py 命令行入口
├── config.py DPAPI 密钥缓存
├── crypto/ AES(pycryptodome / CNG)、SQLCipher 页解密、WAL
├── win/ 进程枚举、内存读取、密钥扫描、数据目录发现
├── sources/ win4 / win3 / android 数据源适配
├── parse/ 消息 XML 解析
├── export/ Markdown 与媒体写出
└── web/ 本地 HTTP 服务与静态页面
MIT License,见 LICENSE。