我的微信聊天记录,终于可以自由查询了

很多人可能没意识到,我们每天在微信上产生的聊天记录,其实一直以加密的形式躺在电脑硬盘里。想导出、想备份、想分析,都绕不开那把不知道藏在哪儿的钥匙。

直到我遇到了 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

之后就是自动化流程了。技能会依次做这些事情:

  1. 安装依赖:用 Homebrew 装 sqlcipher,检测到缺失会自动安装。
  2. 编译扫描工具:下载 ylytdeng/wechat-decrypt 的代码,编译成可执行文件。
  3. 重签名微信sudo codesign --force --deep --sign - /Applications/WeChat.app。这一步需要管理员权限,技能会提示你在终端手动执行。
  4. 提取密钥:运行扫描工具,从微信进程内存中提取密钥。同样是 sudo 级别,需要手动操作。
  5. 解密数据库:拿到密钥后,自动批量解密所有数据库文件。
  6. 输出摘要:告诉你解密了多少个库、保存位置在哪里。

中途有两个地方需要手动输 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.dbmessage_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 文件。


这东西能在生产环境用吗?

简单说两句适用场景。

个人用途:完全没问题。备份自己的聊天记录、做数据分析、建个人知识库,都很好用。

企业环境:要谨慎。微信聊天记录可能包含公司敏感信息,解密后的数据库是明文存储的,放在哪里、谁有权访问,都需要考虑清楚。另外,重签名微信这个操作在某些公司安全管理策略下可能是被禁止的。

另外提醒一点,微信每次更新版本后,需要重新签名并重新提取密钥。如果微信自动升级了,你的解密流程要重跑一遍。


一页速览:完整操作清单

  1. 确认环境:macOS + 微信 Mac 版已登录 + 聊天记录已备份到电脑 + 终端有完全磁盘访问权限
  2. 安装技能:把 SKILL.md 放到 ~/.claude/skills/ 目录
  3. 触发运行:在 Claude Code 里输入 /wechat-exporter
  4. 跟着引导操作:输 sudo 密码、等待依赖安装和编译
  5. 重签名微信:执行 sudo codesign --force --deep --sign - /Applications/WeChat.app
  6. 扫描提取密钥:运行密钥扫描工具,获取加密密钥
  7. 自动解密:等待所有数据库解密完成
  8. 开始查询:去 ~/wechat-decrypt-macos/decrypted/ 用 SQLite 工具查询
  9. (可选)注册 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 把这堵墙打开了一个口子。它的价值不只是”导出聊天记录”这个动作本身,而是让你拥有对自己数据的处置权——无论是备份、分析,还是迁移到其他工具。

当然,能力越大责任越大。解密后的数据是明文的,存储在本地,保护好它跟保护好你的微信账号一样重要。