把你和某个好友(或某个群)的全部聊天记录,一键导出成可搜索的网页、纯文本和原始附件。 全程只读本机数据:不联网、不上传、不修改微信任何文件。
零第三方依赖 —— 只用 Python 标准库 + Windows 自带的 bcrypt.dll,不需要 pip install 任何东西。
上图是导出的
chat.html,里面的对话是虚构的示例数据(由python tools/demo_export.py生成), 不含任何真实聊天内容。
| 输出 | 说明 |
|---|---|
chat.html |
网页版聊天记录,像微信窗口一样左右分栏;可搜索、可只看带图片的、图片点开看大图、附件点开即用;能用浏览器「打印成 PDF」 |
chat.txt |
纯文本,按日期分段,方便贴进笔记软件、Word,或拿去做文本分析 |
chat.csv |
一条消息一行(时间 / 发送人 / 是否本人 / 类型 / 内容 / 引用 / 附件),UTF-8 BOM,Excel 双击就能开,适合透视表和做统计 |
media/ |
图片、视频、文档等附件原文件(不压缩、不转码) |
消息类型基本都能还原成人话:文本、图片、语音、视频、表情、位置、名片、通话、 引用回复、文件、转账、红包、链接、小程序、聊天记录、撤回提示、系统消息……
- 准备:Windows 10/11 + Python 3.10+(下载,安装时勾选 Add Python to PATH)
- 下载:到 Releases 下载最新的
wxchat-export-*.zip解压(也可以用Code → Download ZIP或git clone) - 打开并登录微信(微信 4.1 之后,数据库密钥只存在于运行中的微信进程内存里,关掉就拿不到)
- 双击
一键导出.bat,按提示选好友/群即可
脚本会自动完成:定位 xwechat_files\<你的wxid> → 从微信内存取出数据库密钥(只读
ReadProcessMemory,不注入、不 hook,且必须通过 page1 的 HMAC 校验才会使用)→
解密到 work\decrypted\ → 列出会话让你选 → 导出到 导出\<名字>_<时间>\。
python main.py # 交互式选择好友
python main.py --list # 只列出所有会话和消息条数
python main.py --friend 张三 # 按备注/昵称/wxid 直接导出(可模糊匹配)
python main.py --friend 张三 --no-media # 只要文字,不搬图片视频
python main.py --friend 张三 --format html,txt --out D:\导出\张三
python main.py --friend 张三 --format csv # 只要表格,方便丢进 Excel
python main.py --selftest # 离线自检,不读微信不联网| 参数 | 说明 |
|---|---|
--friend / -f |
好友或群的备注、昵称、wxid(模糊匹配,命中多个会让你选) |
--list |
只列会话不导出 |
--out / -o |
输出目录,默认 导出\<名字>_<时间> |
--format |
html,txt(默认两个都出),也可以加 csv |
--no-media |
不导出图片/视频/文件 |
--media-key |
图片解密用的 AES-128 密钥(32 位十六进制);一般不用填,默认自动离线派生 |
--media-xor-key |
图片尾段的单字节 XOR 密钥(十六进制,如 0x26);只在手填 --media-key 时需要 |
--no-media-key |
不派生图片密钥,解不开的图片按 .dat 原样保存 |
--scan-media-key |
实验性:离线派生失败时,才去扫描微信进程内存找图片密钥(较慢) |
--ffmpeg |
ffmpeg.exe 路径;默认自动查找(PATH、tools\ffmpeg.exe、常见安装位置) |
--work |
工作目录(密钥缓存 + 解密后的库),默认 work\ |
--rescan |
忽略缓存,重新从微信内存取一次密钥 |
--no-open |
导完不自动打开 HTML |
--account |
指定微信账号(多账号时) |
--yes / -y |
自动确认,适合无人值守 |
同一套引擎正在往 QQ 上扩。库结构、参数探测、逐页解密已经做完并进了自检:
python qq_export.py probe # 找库、验证「1024 字节头 + 4096 页」
python qq_export.py decrypt --key <16位口令> # 自动试参数,解密到 work/qq_decrypted/
python qq_export.py schema # 打印解密后的表结构还差一步才能出 HTML:QQ 的 passphrase 不常驻内存,需要你提供一次(详见
docs/QQ.md);拿到真实样本后校准消息字段映射即可复用现有渲染。
- 找库:扫描各磁盘定位
xwechat_files\*\db_storage,同一账号多份数据时挑最近的。 - 取密钥:微信 4.1+ 不再把密钥以明文十六进制缓存在内存,但 WCDB 的
com.Tencent.WCDB.Config.Cipher配置对象里仍留着一份做了固定字节掩码混淆的x'<64hex 密钥><32hex salt>'。工具顺着「特征字符串 → 引用节点 → 配置对象 → 混淆 blob → 去掩码 → 正则」把它读出来,再用数据库第一页的 HMAC 校验; 校验通过的密钥缓存到work\keys_*.json,之后即使不开微信也能重复导出。 缓存用 Windows 自带的 DPAPI 加密——换台机器或换个账户都解不开,也不需要 任何第三方库;老的明文缓存会在下次运行时自动升级。 4.0.x 老版本会自动回退到「内存里直接扫x'<hex>'」的办法。 - 解密:SQLCipher 4(AES-256-CBC、页 4096、每页 16B IV + 64B HMAC-SHA512、保留 80B)
逐页还原成标准 SQLite,解密后跑
PRAGMA integrity_check;-wal只在必要时回放, 避免把已 checkpoint 的日志重复写入导致损坏。 - 读消息:每个会话是一张
Msg_<md5(用户名)>表,同一人分散在多个message_N.db时自动合并;WCDB_CT_*标记为压缩的字段用 zstd 解压(优先zstandard, 其次系统 Node.js 的 zlib,都没有则跳过)。 - 落盘:图片走
.dat解密(旧 XOR / V1 / V2)。V2 的密钥不需要读进程内存——它是md5(uin + wxid)[:16]和uin & 0xFF,其中uin能从微信的 MMKV 统计文件名里读到, 且必须用多个图片样本验证通过才会采用。解出来是 HEVC 的(wxgf容器)再走一步: 抽成标准.h265+ 配缩略图,有 ffmpeg 就转成 JPG。视频从msg\video\取, 附件从msg\file\按文件名 / 消息内 md5 / 文件大小多路匹配。
| 限制 | 说明 |
|---|---|
| HEVC / wxgf 原图 | 一部分图片(实测约六成)在微信里是 HEVC 封装的原图/动图,浏览器渲染不了。工具会自动抽出 H.265 码流存成 .h265、并用同目录的 _t 缩略图做预览;本机有 ffmpeg(或 --ffmpeg 指定)时直接转成 JPG,画面就是完整的。 |
| 语音 / 表情 | 微信 4.x 本地基本不落盘(Voice/Emoji 目录为空),只保留 [语音 3"]、[表情] 占位 |
| 系统版本 | 仅支持 Windows + 微信 4.x;微信 3.x(WeChat Files\Msg\MSG*.db)格式不同,不支持 |
| 账号范围 | 只能导出本机已登录账号;密钥缓存后可离线重复导出 |
| 已删除消息 | 导不出(只在服务端) |
| zstd 压缩字段 | 约四成消息的正文/元数据是 zstd 压缩的。有 zstandard 模块或系统里有 Node.js(22.15+)会自动解压;两者都没有时这部分字段留空,其余内容不受影响 |
- 全程本地运行,不联网、不上传,产物只在
导出\目录里。 - 只读取你自己登录账号在本机的数据;请勿用于获取他人聊天记录或任何违法用途。
- 取密钥是对本机内存的只读访问,不注入、不修改、不 hook、不绕过账号安全机制。
work\(密钥缓存 + 解密库)和导出\属敏感目录,不需要时直接删。 其中密钥缓存已用 DPAPI 加密,拷到别的机器上也解不开。- 本项目按 MIT 协议「按原样」提供,不保证长期可用;因使用本工具产生的一切后果由使用者自负。
python main.py --selftest # 10 组断言:AES / SQLCipher / .dat / 渲染 /
# 图片密钥 / HEVC / CSV / 密钥缓存 / QQ 库结构
python -m unittest discover -s tests # 同一批断言,CI 里跑的就是这个自检自己造密文再解密,不读微信、不联网、不需要第三方库,读代码时也能直接验证它确实只是在做解密和搬运。
CI(.github/workflows/ci.yml)在 Windows + Python 3.11~3.13 上跑这套自检。
想接着往下做(或者照它给 QQ / 抖音 之类写一个导出工具)?先看
docs/ARCHITECTURE.md——数据流、哪些模块能直接复用、哪些是微信专属
必须重写、以及作者踩过的坑,都在里面。
GitHub 上同类项目的对比、可以借鉴的算法(尤其图片密钥的离线派生)见
docs/REFERENCES.md。
想把这套东西扩展到 QQ / 飞书 / 钉钉 / 抖音,或者做成手机 App?先读
docs/LESSONS.md(所有踩过的坑)和
docs/ROADMAP.md(多平台与移动端路线图、平台可行性矩阵)。
一键导出.bat 双击入口
main.py 命令行入口(--selftest 也在这)
qq_export.py QQ NT 入口(probe / decrypt / schema)
wxexport/
cli.py 交互/参数、选好友、导出流程
pipeline.py 找数据目录、密钥缓存、批量解密
wcdb41.py 微信 4.1+ Config.Cipher 取密钥
keyscan.py 内存扫描基础库
keyextract.py 取密钥总入口(新路线 + 老路线回退)
sqlcipher.py SQLCipher 4 页面解密 / WAL / 完整性校验
cng_aes.py AES(Windows CNG,纯 Python 兜底)
dpapi.py 密钥缓存加密(Windows DPAPI,绑当前用户+机器)
wxstore.py 联系人、会话索引、消息读取
wxmsg.py 消息内容解析
zstd_codec.py zstd 解压(zstandard / Node.js)
media.py 图片 .dat 解密、视频/文件搬运
imagekey.py 图片密钥离线派生(uin → AES / XOR 密钥 + 样本验证)
hevc.py HEVC/wxgf 抽流与转码(有 ffmpeg 才转,没有就抽流 + 缩略图)
qq.py QQ NT:1024 字节头、SQLCipher 参数探测、逐页解密
exporter.py HTML / TXT 渲染
selftest.py 离线自检
mediakey.py [实验性] 内存里找图片密钥
tests/ unittest
tools/
ci_rerun.py CI 辅助(查看 / 重跑 / 抓失败日志)
demo_export.py 生成虚构的演示页面(用来截 README 截图)
.github/workflows/ CI
docs/ARCHITECTURE.md 架构说明与「接新平台」指南
docs/LESSONS.md 所有踩过的坑(换平台前必读)
docs/ROADMAP.md 多平台 + 移动端的可行性矩阵与路线图
docs/QQ.md QQ NT 的实测结论与当前边界
docs/REFERENCES.md 同类项目调研、可借鉴的算法与实测结论
work/ 密钥缓存 + 解密后的数据库(敏感,可删)
导出/ 导出结果
Q:提示「没有检测到正在运行的微信」? A:先打开微信并登录再运行,密钥只在运行时内存里。
Q:提示「打不开进程」? A:用与微信相同的用户运行;个别环境(微信以管理员启动)需要本工具也以管理员运行。
Q:导出要多久? A:纯文字几秒到几十秒;带媒体取决于附件大小(实测 5500 条 + 300 张图十几秒)。
Q:会封号吗? A:工具只读本机数据库文件和微信进程内存,不修改微信行为、不接触服务器通信。
Q:图片导出成了 .hevc / .h265,打不开?
A:那是微信用 HEVC 封装的原图/动图。现在默认会:①用同一张图的缩略图做预览,HTML 里能直接看;
②把原图抽成标准 .h265(VLC、PotPlayer、MPV 都能播)。想直接在网页里看到清晰原图,
装个 ffmpeg 放到 PATH(或 tools\ffmpeg.exe,或 --ffmpeg 指路),
重跑一次就会自动转成 JPG。
Q:导出的 HTML 能发给别人吗?
A:可以,但里面是你自己的聊天内容;media/ 目录要一起带上,页面里的图片是相对路径。
- WCDB / SQLCipher 的公开格式说明(页大小、HMAC、KDF 参数)
- 社区里关于微信 4.x 数据库与
.dat图片格式的公开讨论,帮助确认了字段与偏移 - 早期同类工具的思路启发(多数已停更或下架,本项目为独立实现)
