微信聊天记录导出全攻略:用 wechat-dump 把十年对话搬进浏览器
【免费下载链接】wechat-dumpAnalyzing your wechat message history from android项目地址: https://gitcode.com/gh_mirrors/we/wechat-dump
换机那天,我才发现全家十年的微信聊天记录差点彻底蒸发——官方没有导出按钮,云备份只恢复最近 90 天,剩下的全是加密乱码。折腾了一整周,我最终靠开源工具 wechat-dump 完成了微信聊天记录导出:它直接从安卓设备读取微信数据库,把文字、图片、语音、表情原样还原成一份可永久保存、可离线浏览、可搜索的 HTML 档案。这篇攻略,就是我从踩坑到上手的完整实战记录。
动手之前:微信到底把聊天记录"藏"在哪里
很多人以为聊天记录就是一坨数据库文件,其实微信把数据拆成了两半:
- 账本:
EnMicroMsg.db,一张加密的 SQLite 表,记录每条消息的时间、类型、发送者和正文。 - 仓库:手机上的
avatar、emoji、image2、voice2、video、sfs等资源目录,存着头像、表情、原图和语音文件本体。
wechat-dump 干的事,就是"拿着账本去仓库取货":从message、rcontact、ImgInfo2、EmojiInfo这些表里解析出消息索引,再去资源目录里找到对应的图片语音,最后统一装进网页这个"展柜"。解析逻辑集中在wechat/parser.py,渲染逻辑在wechat/render.py,想深入了解运行原理的人可以直接翻源码。
前置条件:一台 root 手机和三条命令
工具的环境要求并不苛刻:一台已 root 的安卓手机、开启 USB 调试、电脑上装好 adb 和 Python 3.8+。依赖用一条命令装齐:
pip install -r requirements.txt语音解码还需要sox和项目自带的 Silk 解码器(./third-party/compile_silk.sh编译一下即可)。装完之后,获取数据的两个动作都有现成脚本:
./android-interact.sh db # 自动定位 userid 目录,拉取加密数据库 ./android-interact.sh res # 拉取 avatar/emoji/image2 等全部资源目录脚本会自动在/data/data/com.tencent.mm/MicroMsg下找出那个 32 位十六进制字符的 userid 目录——这是新手最容易卡住的地方,手动找的话经常翻错目录。资源体积大,脚本会优先用busybox tar打包后传输,比adb pull逐文件拷贝快得多。
第一个绕不开的坑:数据库要自己解密
android-interact.sh拉回来的是加密库,wechat-dump 明确不负责解密,需要自己用 SQLCipher 之类的工具解开,密钥通常和设备 IMEI、微信 UIN 相关。解密后得到一个EnMicroMsg.db.decoded,这才是工具能读懂的文件。
这块没有捷径,但别慌——解密只是整个流程里最费心的一步,后面就顺畅了。
核心操作:一条命令导出单个联系人的完整聊天记录
所有准备就绪后,导出单个联系人的聊天记录只需要一条命令:
./dump-html.py "联系人显示名称"默认生成output.html,用浏览器打开就是一份完整的对话档案。常用参数也都给足了:
./dump-html.py "联系人" --db EnMicroMsg.db.decoded --res resource --output 我的聊天.html--start参数可以只导出某个时间点之后的消息;对话太长时工具会自动按 1500 条或时间间隔切片成多个 HTML 文件,避免单文件过大卡死浏览器。上面那张截图就是真实导出的效果:左侧是语音气泡带时长,右侧是绿色文字气泡,图片按原始质量嵌入,时间戳自动分组,整个界面和微信几乎一模一样。
图片为什么是黑屏:认识 WXGF 这个专有格式
第一次导出时,我发现表情和图片全是黑块。查了半天才明白,微信用自研的WXGF/WXAM 格式(本质是 HEVC 视频流套了一层专有容器)存图片,浏览器根本不认识。wechat-dump 给了两条解码路线:
路线一:本地 ffmpeg 解码。电脑装了 ffmpeg/ffprobe 后,wechat/wxgf.py会自动从 WXGF 文件里提取 Annex-B HEVC 比特流,单帧转 PNG、多帧转 GIF,全程本地完成,最省事。
路线二:安卓端 WXGF Decoder 服务器。没有 ffmpeg 的环境,可以在安卓设备上装WXGFDecoder这个配套应用,点一下START SERVER,把地址以--wxgf-server ws://设备IP:端口传给导出命令,手机就变成了一个解码服务器,电脑把图片数据发过去、收回来的是标准格式。下面就是它运行时的界面:
两条路都失败时,工具会回退显示占位符,至少不会让整个页面崩掉。
语音、表情、视频:这些"硬骨头"是怎么啃下来的
文字和图片搞定后,剩下的三类消息才是真正体现工具功底的地方:
- 语音:微信把语音存成 Silk 编码,电脑没法直接播。wechat-dump 内置了完整的 Silk 解码器源码(
third-party/silk/),配合 sox 转成 mp3 嵌进网页,时长、播放按钮都保留。 - 表情包:
EmojiInfo表里只存表情的 md5 和 CDN 地址。工具会先在本地emoji目录里找,找不到再按需从网络拉取;拉回来的表情还会写进本地缓存,下次导出直接命中,不用重复下载。 - 视频:消息表里的视频索引会对应到
video目录,同时生成缩略图,网页里点开即看。
从"存档"升级到"分析":把聊天记录变成数据
导出 HTML 只是第一步,wechat-dump 真正的隐藏价值在于它把数据交给了你。配套的几个脚本能立刻把对话变成统计报表:
./list-chats.py decoded.db # 列出所有聊天对象 ./dump-msg.py decoded.db output_dir # 全量导出纯文本消息 ./count-message.sh output_dir # 统计每个人的消息数量 ./plot-num-msg-by-time.py # 按时间画消息分布曲线朋友最近就在用这套脚本做"我和女朋友谁话多"的年度复盘,几秒钟出结果,数据都来自原始数据库,比截图统计靠谱得多。想验证工具是否适配你的微信版本,跑一次list-chats.py就是最直接的体检。
避坑清单:半年实测攒下的血泪经验
- emoji 缓存包提前下:首次导出如果表情很多,联网下载会很慢。可以先把官方发布的 emoji 缓存压缩包解压到项目根目录,导出时直接命中本地,速度翻倍。
- 资源传输优先用 tar:大量小文件用
adb pull会慢到怀疑人生,脚本里的busybox tar方案强烈建议保留。 - 旧版微信的坑:老版本微信的头像索引叫
avatar.index,要用--avt参数指定;新版已经不需要。 - 极少数消息类型会跳过:项目 TODO 里明确标注,类型大于 10000 和小于 0 的消息可能无法处理,遇到别慌,属于已知边界。
为什么不推荐截图和云备份:横向对比一下
和"手动截图""第三方云备份""破解版导出器"相比,wechat-dump 的差异化优势很明显:它直接处理原始数据库,不经过任何中转服务,数据完整性有保障,且全程离线;截图只能留画面,丢时间戳丢上下文;云备份受时效和账号限制;而它导出的是一份结构完整的网页,文字、图片、语音、时间线全在,还能被统计脚本二次分析。唯一的门槛就是需要 root 手机和手动解密,适合愿意为数据主权花两小时的人。
想再进一步?从这三处源码开始改造
wechat/static/下是一整套 HTML 模板,TP_MSG.html、TP_IMG.html、wx.css改一改就能换风格。wechat/msgslice.py控制消息切片逻辑,觉得 1500 条一页不合适,改阈值就行。- 项目里散落着不少
TODO标注,运行grep 'TODO' wechat -R就能看到官方求助清单——修掉一个就是现成的贡献机会。
看完这篇,最值得你现在就做的事是:翻出旧手机,root 后跑一遍./android-interact.sh db,先确认数据库能不能正常解析,再决定要不要走完整导出流程。备份这件事,永远是"趁数据还在时做",而不是"等手机坏了再后悔"。
【免费下载链接】wechat-dumpAnalyzing your wechat message history from android项目地址: https://gitcode.com/gh_mirrors/we/wechat-dump
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考