1. 微信聊天记录提取与 AI 分析:从 SQLCipher 加密库到 MCP 数据管道
微信聊天记录里藏着大量可被结构化分析的信息:你和谁在什么时间段聊得最频繁、哪些话题反复出现、情绪曲线怎么波动。问题是这些数据默认锁在本地 SQLCipher 加密数据库里,微信官方不提供导出入口。这篇内容聚焦一件事:用 Python 把加密库导出成可用文本,再通过 MCP 把数据接入 AI 工具做话题聚类与情绪趋势分析。适合有基础 Python 环境、想在本地完成数据处理、不希望把原始聊天内容上传到不明服务的读者。整个链路分四步:确认环境、解密导出、字段清洗、MCP 接入验证。每一步都有可复制的命令和配置,跟着做就能跑通。
我试过在 Windows 和 macOS 上分别走一遍流程,核心差异在微信版本对应的 SQLCipher 版本和数据库路径。Windows 微信 3.x 用 SQLCipher v3,4.0 以上切到 v4;macOS 4.0+ 同样是 v4。密钥在首次登录时生成,存在微信进程内存里,解密工具的本质是从进程读取这个密钥再打开数据库。理解这一点,后面遇到“密钥提取失败”就知道该往哪个方向排查。
先确认 Python 环境是否统一。多环境玩家经常出现 pip 和 python 指向不同解释器的情况,库装到 Anaconda 里、脚本却用系统 Python 跑,直接报 ModuleNotFoundError。执行:
pip -V python -V两条命令输出的路径必须指向同一个 Python。MCP 相关依赖要求 Python 3.10 以上,建议 3.12。确认后安装解密工具依赖:
git clone https://github.com/ylytdeng/wechat-decrypt.git cd wechat-decrypt pip install -r requirements.txt安装完成后不要急着跑解密脚本,先确认微信已经在电脑上登录过至少一次,否则本地没有可解密的数据库文件。解密脚本运行时会自动从微信进程提取密钥,这一步在 Windows 上可能需要管理员权限,macOS 上可能需要在系统设置里给终端授予辅助功能权限。如果脚本报“无法读取进程内存”,先检查权限,再检查微信版本是否在支持范围内。
解密完成后会得到一组 SQLite 数据库文件,核心表包括message、contact、chatroom等。直接打开message表会看到StrContent字段里混着文本、图片标记、系统消息、撤回提示。下一步的字段清洗就是把这些噪声过滤掉,只保留可分析的纯文本对话。清洗逻辑不复杂,但字段名和表结构在不同微信版本间有差异,建议先用 SQLite Browser 打开解密后的库,确认实际字段名再写脚本。
2. TaoToken 前置准备:API Key 与 MCP 接入配置
把清洗后的聊天数据接入 AI 做分析,需要一个稳定的模型调用入口。TaoToken 提供 OpenAI 兼容的 API 接口,同时支持 MCP 协议接入,适合这种“本地数据 + 云端模型分析”的场景。前置准备分三件事:注册账号、创建 API Key、确认 MCP 接入方式。整个过程不需要改动本地网络环境,直接在浏览器里完成。
先访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册账号。注册完成后进入控制台,在 API Keys 页面创建一个新的 Key。创建时建议给 Key 起一个可识别的名字,比如wechat-analysis,方便后续在多个项目间区分。Key 只在创建时完整显示一次,复制后保存到本地环境变量或配置文件里,不要直接硬编码在脚本中。
API 基础地址是 https://taotoken.net/api,这个地址在后续的 MCP 配置和 Python 请求里都会用到。如果你用的是 Claude Code 或类似的编码工具,可以在工具设置里填入这个 Base URL 和刚才创建的 Key。模型 ID 根据你实际需要选择,做聊天记录分析建议选上下文窗口较大的模型,因为一次分析可能涉及几百条消息。
MCP 接入方式有两种:一种是在支持 MCP 的客户端里直接配置,另一种是通过 Python 脚本调用 API。前者适合用 OpenCode、Cline 这类工具做交互式分析,后者适合写自动化脚本做批量处理。两种方式都需要 Base URL、API Key、Model ID 三件套。下面是一个标准的 MCP 配置片段,路径和字段名按你实际使用的客户端调整:
{ "mcpServers": { "taotoken": { "type": "stdio", "command": "npx", "args": [ "-y", "@taotoken/mcp-server" ], "env": { "TAOTOKEN_API_KEY": "你的API Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL": "你的Model ID" } } } }如果你用的是 OpenCode,配置文件路径在 Windows 上是C:\Users\你的用户名\.config\opencode\opencode.jsonc,macOS 上是~/.config/opencode/opencode.jsonc。把上面的 MCP 配置合并进去,注意 JSON 里 Windows 路径要用双反斜杠。配置完成后重启客户端,输入/mcps检查是否加载成功。如果显示taotoken状态为 connected,说明前置准备完成。
这一步常见的问题是 Key 权限不足或 Base URL 写错。Key 创建后默认有调用权限,但如果你的账号余额为零,调用会返回 401。Base URL 末尾不要加/v1,直接写https://taotoken.net/api即可。MCP 客户端如果报local proxy failed,通常是npx命令找不到或网络无法拉取包,检查 Node.js 是否安装、npm 源是否可用。
3. 可复制配置:解密导出脚本与字段清洗
这一节给出完整的 Python 脚本,从解密后的数据库导出可分析的文本,并做字段清洗。脚本分两部分:第一部分连接解密后的 SQLite 数据库,读取message表;第二部分过滤系统消息、图片标记、撤回提示,输出 JSONL 格式的对话记录。JSONL 每行一条消息,包含时间戳、发送者、接收者、文本内容,方便后续喂给 AI。
先确认解密后的数据库路径。wechat-decrypt 默认输出到项目目录下的decrypted文件夹,里面按账号分目录。找到message.db文件,用 SQLite Browser 打开,确认message表的字段名。常见字段包括localId、TalkerId、MsgSvrID、Type、SubType、IsSender、CreateTime、StrContent。不同版本可能有差异,以实际看到的为准。
下面是导出脚本,保存为export_chat.py:
import sqlite3 import json import re from datetime import datetime DB_PATH = "decrypted/你的账号/message.db" OUTPUT_PATH = "chat_export.jsonl" # 需要过滤的消息类型 SYSTEM_TYPES = {10000, 10002} IMAGE_MARKERS = re.compile(r'\[图片\]|\[表情\]|\[语音\]|\[视频\]|\[文件\]|\[链接\]') RECALL_MARKERS = re.compile(r'撤回了一条消息|对方已撤回') def clean_content(text): if not text: return None text = IMAGE_MARKERS.sub('', text) text = RECALL_MARKERS.sub('', text) text = text.strip() if len(text) < 2: return None return text def export_messages(): conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() cursor.execute(""" SELECT CreateTime, IsSender, StrContent, TalkerId FROM message WHERE Type = 1 ORDER BY CreateTime ASC """) count = 0 with open(OUTPUT_PATH, 'w', encoding='utf-8') as f: for row in cursor.fetchall(): create_time, is_sender, content, talker_id = row if not content: continue cleaned = clean_content(content) if not cleaned: continue record = { "timestamp": datetime.fromtimestamp(create_time).isoformat(), "sender": "me" if is_sender == 1 else talker_id, "receiver": talker_id if is_sender == 1 else "me", "content": cleaned } f.write(json.dumps(record, ensure_ascii=False) + '\n') count += 1 conn.close() print(f"导出完成,共 {count} 条有效消息") if __name__ == "__main__": export_messages()运行前把DB_PATH改成你实际的数据库路径。脚本只保留Type = 1的文本消息,过滤掉系统提示和媒体标记。IsSender为 1 表示自己发的,为 0 表示对方发的。输出文件chat_export.jsonl每行一条 JSON,可以直接用head -5 chat_export.jsonl查看前五条确认格式。
如果message表里没有TalkerId字段,可能是版本差异,换成StrTalker或Username。如果CreateTime是毫秒时间戳,datetime.fromtimestamp需要先除以 1000。清洗规则可以根据你的实际数据调整,比如你想保留表情标记做情绪分析,就把IMAGE_MARKERS里的\[表情\]去掉。
导出后建议做一次样本验证:随机抽 20 条消息,人工核对发送者和时间戳是否正确。如果发现所有消息的sender都是me,说明IsSender字段判断反了,把条件互换即可。这一步确认无误后再进入 MCP 接入。
4. 验证请求:MCP 接入与 AI 分析成功结果
数据导出后,通过 MCP 把 JSONL 文件接入 AI 工具做分析。这里以 OpenCode 为例,配置 MCP 服务指向本地 Python 脚本,脚本负责读取 JSONL 并调用 TaoToken API。配置完成后,在对话里输入分析指令,AI 会读取聊天记录并返回话题聚类和情绪趋势结果。
先写 MCP 服务脚本mcp_server.py,放在 wechat-decrypt 项目目录下:
import json import os from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent import httpx TAOTOKEN_API_KEY = os.environ.get("TAOTOKEN_API_KEY") TAOTOKEN_BASE_URL = os.environ.get("TAOTOKEN_BASE_URL", "https://taotoken.net/api") TAOTOKEN_MODEL = os.environ.get("TAOTOKEN_MODEL", "你的Model ID") CHAT_FILE = "chat_export.jsonl" app = Server("wechat-analysis") @app.list_tools() async def list_tools(): return [ Tool( name="analyze_chat", description="读取微信聊天记录并调用 AI 分析话题与情绪", inputSchema={ "type": "object", "properties": { "query": {"type": "string", "description": "分析指令"} }, "required": ["query"] } ) ] @app.call_tool() async def call_tool(name: str, arguments: dict): if name != "analyze_chat": raise ValueError(f"未知工具: {name}") query = arguments["query"] messages = [] with open(CHAT_FILE, 'r', encoding='utf-8') as f: for line in f: messages.append(json.loads(line)) sample = messages[-500:] context = "\n".join( f"[{m['timestamp']}] {m['sender']}: {m['content']}" for m in sample ) prompt = f"以下是微信聊天记录样本:\n{context}\n\n分析指令:{query}" async with httpx.AsyncClient(timeout=120) as client: resp = await client.post( f"{TAOTOKEN_BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {TAOTOKEN_API_KEY}", "Content-Type": "application/json" }, json={ "model": TAOTOKEN_MODEL, "messages": [{"role": "user", "content": prompt}], "temperature": 0.3 } ) resp.raise_for_status() result = resp.json() answer = result["choices"][0]["message"]["content"] return [TextContent(type="text", text=answer)] async def main(): async with stdio_server() as (read, write): await app.run(read, write, app.create_initialization_options()) if __name__ == "__main__": import asyncio asyncio.run(main())然后在 OpenCode 的opencode.jsonc里添加 MCP 配置:
{ "mcp": { "wechat": { "type": "local", "command": ["python", "E:\\你的路径\\wechat-decrypt\\mcp_server.py"], "env": { "TAOTOKEN_API_KEY": "你的API Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL": "你的Model ID" }, "enabled": true } } }重启 OpenCode,输入/mcps确认wechat状态为 connected。然后输入分析指令,比如“请分析最近 500 条聊天记录的话题分布和情绪趋势”。如果返回结果包含话题关键词和情绪描述,说明链路打通。
验证成功的标志是:AI 返回的内容里引用了你聊天记录中的具体话题,而不是泛泛而谈。如果 AI 说“我没有看到聊天记录”,检查CHAT_FILE路径是否正确、JSONL 文件是否为空。如果返回 401,检查 API Key 是否有效、余额是否充足。如果返回reading choices相关错误,说明 API 响应格式不符合预期,检查 Base URL 是否写成了https://taotoken.net/api/v1,去掉/v1再试。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
这一节对照实际报错给出排查路径。以下错误按出现频率排序,每条都附上原因和修复动作。
401 Unauthorized:API Key 无效或未正确传入。检查三处:MCP 配置里的TAOTOKEN_API_KEY是否和创建时一致、环境变量是否被覆盖、Key 是否已过期。如果 Key 复制时带了空格,去掉空格。如果账号余额为零,充值后重试。
local proxy failed:MCP 客户端无法启动本地服务。常见原因是npx命令找不到或网络无法拉取包。检查 Node.js 是否安装(node -v),npm 源是否可用(npm config get registry)。如果用的是 Python 脚本作为 MCP 服务,检查python命令是否在 PATH 里、脚本路径是否正确。Windows 上路径要用双反斜杠或正斜杠。
reading choices 报错:API 返回的 JSON 结构里没有choices字段。通常是 Base URL 写错,比如写成了https://taotoken.net/api/v1,实际应该用https://taotoken.net/api。另外检查请求体里model字段是否填了有效的 Model ID,空值或错误值会导致返回格式异常。
OAuth 相关错误:如果你用的是 Claude Code 或类似工具,可能遇到 OAuth 认证失败。这类工具默认走 Anthropic 的 OAuth 流程,需要切换到 API Key 模式。在工具设置里找到认证方式,改为 API Key,填入 TaoToken 的 Key 和 Base URL。如果工具不支持自定义 Base URL,改用 OpenCode 或 Cline 这类支持 OpenAI 兼容接口的客户端。
解密脚本报“无法读取进程内存”:权限不足或微信版本不支持。Windows 上以管理员身份运行终端,macOS 上给终端授予辅助功能权限。如果微信版本是 4.0 以上,确认解密工具是否支持 SQLCipher v4。不支持的话需要找对应版本的解密方案。
导出 JSONL 为空:message表字段名不匹配或过滤条件太严。先用 SQLite Browser 打开数据库,执行SELECT COUNT(*) FROM message WHERE Type = 1确认有数据。如果字段名不是StrContent,换成实际字段名。如果clean_content过滤掉了所有内容,放宽len(text) < 2的判断。
MCP 工具调用无响应:脚本阻塞或超时。检查httpx请求的timeout设置,聊天记录样本太大时 API 响应可能超过 120 秒。减少sample数量,比如从 500 条降到 200 条。如果脚本报asyncio相关错误,确认 Python 版本在 3.10 以上。
排查时建议按链路顺序逐段验证:先确认数据库能打开,再确认 JSONL 有内容,再确认 API 能调通,最后确认 MCP 能加载。每段单独测试,不要一次性全跑。
6. 语义一致 CTA:从数据导出到长期分析
走到这里,你已经完成了从 SQLCipher 加密库导出、字段清洗、MCP 接入到 AI 分析的完整链路。如果后续想把这套流程做成可重复使用的工具,建议把 API Key 管理、模型调用、MCP 配置这三件事固定下来。TaoToken 的 API Keys 页面可以创建多个 Key 按项目区分,接入文档里有 MCP 和 OpenAI 兼容接口的详细说明。需要验证模型效果时,用模型对话页面直接测试提示词,确认返回质量后再写进脚本。如果打算长期做聊天记录分析或搭建个人 Agent,Coding Plan 提供更稳定的调用额度,适合高频使用场景。
实际使用中,聊天记录分析的价值不在于一次性的“性格分析”,而在于持续追踪。你可以每周导出一次增量数据,用同样的 MCP 管道做话题变化和情绪趋势对比。时间拉长后,这些数据能反映出你自己都未必察觉的行为模式。数据始终在本地,只有分析请求会发到 API,原始聊天内容不会上传到任何第三方存储。这一点在配置 MCP 时已经通过本地脚本读取 JSONL 实现,API 只接收你主动传入的样本片段。
最后提醒一句:解密后的数据库和导出的 JSONL 文件包含敏感信息,不要提交到公开仓库,不要放在同步网盘里。本地分析完成后,如果不需要保留原始数据,及时清理。数据自觉的第一步,是知道自己有什么数据、放在哪里、谁能访问。