我的微信聊天记录,终于可以自由查询了
很多人可能没意识到,我们每天在微信上产生的聊天记录,其实一直以加密的形式躺在电脑硬盘里。想导出、想备份、想分析,都绕不开那把不知道藏在哪儿的钥匙。
直到我遇到了 wechat-exporter 这个工具。
它做的事情很直接:把你 macOS 微信里的聊天记录,全量解密成明文的 SQLite 数据库。之后你想怎么查、怎么导出、怎么分析,都随便你。这篇文章就来说说这个工具能做什么、怎么用,以及它背后是怎么工作的。
微信的聊天记录是怎么加密的?
先说清楚一个问题:微信 Mac 版在本地存了你的聊天记录,但全部是加密的,不是直接用 SQLite 能打开的。
微信使用了 SQLCipher,一种 SQLite 的加密扩展。数据库文件本身就在你电脑上,但没有密钥的话,打开就是一堆乱码。
那密钥在哪儿呢?微信启动之后,密钥会出现在内存里。工具的原理就是通过重签名微信 App,让它可以被调试和内存扫描,然后从内存里提取出那把加密密钥。拿到密钥之后,再用 SQLCipher 去解密数据库文件。
这背后的原理其实很简单:密钥在内存里,就一定能找到。复杂的部分是找到它的位置。微信每次更新,内存布局都可能变化,扫描工具也要跟着适配。
安装这个技能要满足什么条件?
在动手之前,先确认一下你的环境是不是满足要求。省得折腾到一半发现卡住了。
| 条件 | 说明 |
|---|---|
| 操作系统 | macOS,仅支持 macOS,Windows 用户暂时无缘 |
| 微信版本 | 已经安装微信 Mac 版,并且登录过 |
| 聊天记录 | 手机上的聊天记录已经迁移/备份到了 Mac 端 |
| 运行环境 | Claude Code 或 Codex,用来运行这个技能 |
| 磁盘权限 | 终端需要有”完全磁盘访问权限” |
最后这一点很多人会忽略。如果后续操作中提示权限错误,十有八九是这里没打开。
设置方法:系统设置 → 隐私与安全性 → 完全磁盘访问权限 → 把终端(Terminal 或 iTerm2)加进去。
提取密钥需要折腾什么?
整个流程看起来步骤不少,但实际跟着走一遍并不复杂。技能本身会引导你一步步完成。
先安装技能。两种方式,选一个就行:
# 方式一:直接复制文件
cp SKILL.md ~/.claude/skills/wechat-exporter.md
# 方式二:创建目录(适合后续扩展)
mkdir -p ~/.claude/skills/wechat-exporter
cp SKILL.md ~/.claude/skills/wechat-exporter/skill.md
注意,这里安装的是 Claude Code 的技能。如果你想在项目里单独使用,就把路径换成 <你的项目>/.claude/skills/。
然后在 Claude Code 里输入:
导出微信聊天记录
或者直接敲技能名:
/wechat-exporter
之后就是自动化流程了。技能会依次做这些事情:
-
安装依赖:用 Homebrew 装 sqlcipher,检测到缺失会自动安装。 -
编译扫描工具:下载 ylytdeng/wechat-decrypt 的代码,编译成可执行文件。 -
重签名微信: sudo codesign --force --deep --sign - /Applications/WeChat.app。这一步需要管理员权限,技能会提示你在终端手动执行。 -
提取密钥:运行扫描工具,从微信进程内存中提取密钥。同样是 sudo 级别,需要手动操作。 -
解密数据库:拿到密钥后,自动批量解密所有数据库文件。 -
输出摘要:告诉你解密了多少个库、保存位置在哪里。
中途有两个地方需要手动输 sudo 密码,其他都是自动的。
解密之后,怎么查聊天记录?
解密后的数据库放在 ~/wechat-decrypt-macos/decrypted/ 目录下,结构是这样的:
decrypted/
├── contact/
│ └── contact.db # 联系人
├── message/
│ ├── message_0.db # 消息分片(按时间段切割)
│ ├── message_1.db
│ └── ...
├── session/
│ └── session.db # 会话列表
└── ...
这些全都是标准 SQLite 格式,直接用 sqlite3 命令行或者 DB Browser for SQLite 这类图形化工具就能打开。
我自己习惯用命令行查:
sqlite3 ~/wechat-decrypt-macos/decrypted/message/message_0.db
.tables
联系人表
contact.db 里有一张 contact 表,其中 local_type 字段记录了联系人的关系类型:
| local_type | 含义 |
|---|---|
| 1 | 真实好友(双向添加) |
| 3 | 有过消息往来但未必是好友 |
| 0 | 服务号、系统通知 |
这个区分挺有用。比如你想分析真实好友的聊天频率,直接过滤 local_type = 1 就行,不会把服务号的消息混进来。
消息表
消息部分的存储方式有点绕。微信按时间段把消息切分到 message_0.db、message_1.db 等多个文件里。其中 message_0.db 通常是最近一年的主力库。
每个联系人的消息存在独立的表里,表名是 Msg_ 加上联系人 username 的 MD5 哈希值。比如 Msg_a6c47a9d3c7a8e3b... 这种格式。
这里有一个映射表 Name2Id,可以把 username 和表名对应起来:
import hashlib
import sqlite3
conn = sqlite3.connect("message_0.db")
for (username,) in conn.execute("SELECT user_name FROM Name2Id"):
table = "Msg_" + hashlib.md5(username.encode()).hexdigest()
print(f"{username} → {table}")
跑完这段代码,你就能看到每个好友对应的表名,然后直接去查那个表里的消息内容。
有没有更省事的办法?——注册 MCP Server
如果你用的是 Claude Code,wechat-exporter 还支持注册为 MCP Server。
意思是:解密完成后,Claude Code 可以直接查询聊天记录数据库,你不需要手动写 SQL,用自然语言就能问。
比如你可以直接问:
-
“我和张三最近一个月聊了什么?” -
“帮我总结一下上个月工作群里的讨论重点。” -
“搜索包含’项目延期’的消息。”
Claude Code 会自己去查 SQLite 数据库,然后把结果返回给你。
这个功能的好处是,对于那些不熟悉 SQL 查询的人来说,门槛大幅降低了。而且 Claude Code 本身有上下文理解能力,你可以连续追问,它会根据之前的查询结果进一步筛选。
遇到问题了怎么办?
我在使用过程中也踩过一些坑,整理出来供参考。
HMAC 验证失败
这个报错的意思是 SQLCipher 尝试用密钥解密时,校验和没通过。原因通常是 config.json 里配置的账号目录和当前实际登录的微信账号不一致。
微信在 ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/ 下有一堆以数字命名的目录,每个对应一个登录过的账号。确认一下你指向的是当前登录的那个。
0 keys / N keys 但数量不对
运行扫描工具时,如果返回 0 个 key,或者数量少得离谱,多半是微信版本更新后内存地址变了。
解决办法:重新对微信做一次重签名,然后再次扫描内存提取密钥。重签名的命令跑一遍就行,不需要重装微信。
lldb attach 失败
这是 macOS 安全机制在拦你。微信默认是受保护的状态,不允许调试器附加。必须用 codesign --force --deep --sign - 把微信的签名替换成 ad-hoc 签名,之后 lldb 才能 attach 上去。
如果你忘了重签名,attach 那一步肯定报错。执行一下重签名命令再试。
解密后消息为空
数据库解密成功了,但查不到消息内容。这种情况我遇到过一回,原因是工具自带的 server.py 读取的是加密数据库路径,而不是解密后的明文库。
解决方法是按技能文档里的说明,修改 server.py 的数据库路径配置,让它指向 decrypted/ 目录下的明文 SQLite 文件。
这东西能在生产环境用吗?
简单说两句适用场景。
个人用途:完全没问题。备份自己的聊天记录、做数据分析、建个人知识库,都很好用。
企业环境:要谨慎。微信聊天记录可能包含公司敏感信息,解密后的数据库是明文存储的,放在哪里、谁有权访问,都需要考虑清楚。另外,重签名微信这个操作在某些公司安全管理策略下可能是被禁止的。
另外提醒一点,微信每次更新版本后,需要重新签名并重新提取密钥。如果微信自动升级了,你的解密流程要重跑一遍。
一页速览:完整操作清单
-
确认环境:macOS + 微信 Mac 版已登录 + 聊天记录已备份到电脑 + 终端有完全磁盘访问权限 -
安装技能:把 SKILL.md 放到 ~/.claude/skills/目录 -
触发运行:在 Claude Code 里输入 /wechat-exporter -
跟着引导操作:输 sudo 密码、等待依赖安装和编译 -
重签名微信:执行 sudo codesign --force --deep --sign - /Applications/WeChat.app -
扫描提取密钥:运行密钥扫描工具,获取加密密钥 -
自动解密:等待所有数据库解密完成 -
开始查询:去 ~/wechat-decrypt-macos/decrypted/用 SQLite 工具查询 -
(可选)注册 MCP Server:在 Claude Code 中用自然语言查聊天记录
FAQ
解密后的数据库可以恢复到手机里吗?
不能。这个工具只做解密导出,不做反向导入。
微信更新后还能用吗?
可能需要重新签名和重新提取密钥。如果工具没适配最新版本,扫描不到 key,可以关注项目的更新动态。
会影响我的微信正常使用吗?
重签名只修改微信 App 的签名,不影响数据和聊天功能。但 macOS 安全机制可能会提示”微信已损坏”,别担心,那是正常现象,信任运行即可。如果之后想恢复原状,从 App Store 或官网重新下载安装微信即可。
能导出语音和视频文件吗?
导出的是 SQLite 数据库,包含文本消息内容和媒体文件的引用路径。媒体文件本身以文件形式存储在别的目录下,不在数据库里。
有没有 GUI 界面?
工具本身是命令行 + Claude Code 技能方式运行,没有独立图形界面。但解密后的 SQLite 可以用 DB Browser for SQLite 这类工具来图形化浏览。
我完全不懂 SQL,能用吗?
能。注册 MCP Server 之后,Claude Code 可以直接用自然语言查询,你不需要写一行 SQL。
写在最后
这个工具解决了一个很实际的需求:让属于你的聊天数据,真正变得可控和可用。数据加密是出于隐私保护的初衷,但当用户自己需要访问这些数据时,加密反而成了一堵墙。
wechat-exporter 把这堵墙打开了一个口子。它的价值不只是”导出聊天记录”这个动作本身,而是让你拥有对自己数据的处置权——无论是备份、分析,还是迁移到其他工具。
当然,能力越大责任越大。解密后的数据是明文的,存储在本地,保护好它跟保护好你的微信账号一样重要。

