Skip to content
HelloWorldNockPublic

About

把 PC 微信(4.x / 3.x)和安卓微信的聊天记录导出成 Markdown,附图片视频文件;纯 Python 标准库,无第三方依赖。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

wexport · 微信聊天记录导出工具

把 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

关于 PC 微信 4.x 的数据库密钥

微信 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。

安卓离线导入

  1. 把手机上的整个微信数据目录拷出来(需要 root 或已经备份),至少包含:
    • EnMicroMsg.db
    • shared_prefs/auth_info_key_prefs.xml(提供 _auth_uin)
    • shared_prefs/system_config_prefs.xml(提供 IMEI,没有则默认 1234567890ABCDEF)
  2. 运行:
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 内容,图片/视频/语音会按路径匹配复制。

导出 Markdown

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 合成端到端导出。

打包成 exe

需要 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。

About

把 PC 微信(4.x / 3.x)和安卓微信的聊天记录导出成 Markdown,附图片视频文件;纯 Python 标准库,无第三方依赖。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages