ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

忘记密码照样查看QQ聊天记录:用TaoToken统一Key打通本地数据导出链路

忘记密码照样查看QQ聊天记录:用TaoToken统一Key打通本地数据导出链路 1. 旧手机里的聊天记录为什么密码忘了还能救很多人换手机时都会遇到一个尴尬局面旧安卓机里存着几年的 QQ 聊天记录但账号密码早忘了手机号也换了申诉流程走不通。这时候第一反应往往是“完了记录没了”。其实未必。QQ 在本地存储聊天记录时用的是 SQLite 数据库文件密码只负责登录鉴权并不直接加密这些已经落盘的.db文件。换句话说只要你能拿到旧手机里的数据库文件就有机会把记录读出来。这个场景适合三类人一是旧手机还能开机、只是登不上 QQ 的二是之前用电脑版 QQ 做过消息备份、备份文件夹还在的三是做数据自查、想把家人旧设备里的记录整理归档的。核心思路不是“破解密码”而是绕开登录环节直接从本地文件入手。整个过程分两步先把数据库文件从设备或备份里捞出来再用统一的 Key 管理工具把导出脚本、模型调用、文件处理串成一条链路。这里要引入 TaoToken。它本身不是解密工具而是一个统一 API Key 管理平台把模型对话、编码 Agent、密钥管理收敛到一个入口。为什么导出聊天记录会用到它因为从数据库解密、字段解析到最终导出成可读文本中间会涉及脚本调试、报错排查、格式转换这些环节用模型辅助能省大量时间。TaoToken 的价值在于你不用在多个平台之间来回切换 Key一个 Key 就能覆盖模型对话和编码场景调试导出脚本时特别顺手。需要先说明合规边界本文只讨论你自己设备、你自己账号的数据自查。未经授权读取他人聊天记录属于违法行为不在讨论范围。另外QQ 版本迭代很快数据库结构和加密方式在不同年份差异很大本文给的是通用思路和可复制的配置骨架具体字段名要以你实际拿到的库为准。先说清楚一个常见误解很多人以为“忘记密码 数据锁死”。实际上密码是账号层的门锁本地数据库是另一套存储。旧版 QQ 的MsgEx.db这类文件早期甚至没有强加密后来才逐步加上加密头。所以能不能读取决于你手里的文件是哪个版本、有没有加密、加密密钥是否还在设备里。下面按“拿文件 → 配环境 → 写脚本 → 验证 → 排错”的顺序走一遍。2. TaoToken 前置准备统一 Key 怎么配、模型怎么选在动手写导出脚本之前先把工具链搭好。我建议用 TaoToken 做统一入口原因是导出过程中你会反复做三件事让模型解释数据库字段、让模型帮你改 Python 脚本、遇到报错时贴给模型分析。如果每个环节都去不同平台申请 Key光管理就够烦的。TaoToken 把这些收敛成一个 Key省心。第一步打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册并登录。登录后进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite在左侧找到 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite创建一个新 Key。创建时给它起个能认出来的名字比如qq-export-debug方便后面区分用途。Key 只显示一次复制后先存到本地密码管理器里。第二步确认你要用哪些模型。导出脚本调试阶段我一般用两个方向一个是通用对话模型用来解释字段含义、生成 SQL 查询另一个是偏编码的模型用来改脚本、修报错。TaoToken 的模型对话入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite你可以先在这里试几条 prompt确认模型能理解你的需求。如果后面要做长期的编码 Agent 任务比如批量处理多个数据库文件可以看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite它更适合持续性的编码场景。第三步把 API 地址记牢https://taotoken.net/api。注意这个地址不带 UTM 参数是纯 API 端点。后面在脚本或配置文件里填 Base URL 时用的就是它。Key 的用法和常规 OpenAI 兼容接口一致放在请求头的Authorization: Bearer 你的Key里。这里给一个最小验证用 curl 测一下 Key 是否可用。命令如下把$TAOTOKEN_KEY换成你自己的 Keycurl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_KEY \ -d { model: gpt-4o-mini, messages: [{role: user, content: 回复 ok 即可}] }如果返回里有choices字段和正常内容说明 Key 和网络都通了。这一步很重要因为后面脚本报错时你要能区分是“Key 问题”还是“脚本问题”。我见过太多人把 401 当成脚本 bug 查半天其实只是 Key 没配对。关于模型选择给个实用建议解释数据库字段用便宜的小模型就够改复杂脚本再用强一点的模型。TaoToken 支持多模型切换你可以在同一个 Key 下按需调用不用重新申请。这样调试成本低也不用来回换配置。最后提醒一点Key 不要硬编码进脚本提交到 Git。用环境变量或者本地.env文件.env记得加进.gitignore。这是基本安全习惯后面脚本示例里我会用环境变量方式。3. 可复制配置数据库解密参数与导出脚本骨架这一节是核心给你可以直接抄的配置和脚本骨架。先明确文件位置。安卓 QQ 的聊天记录一般在/data/data/com.tencent.mobileqq/databases/目录下文件名类似xxx.db其中xxx是你的 QQ 号。如果是电脑版备份通常在文档/Tencent Files/你的QQ号/下面。拿到文件后先确认它是不是加密的用十六进制编辑器打开看文件头。SQLite 明文库开头是SQLite format 3如果开头是一串乱码说明有加密头。对于加密库旧版本常用的是简单的异或或固定密钥新版本会复杂一些。这里给一个通用的解密脚本骨架用 Python 写依赖sqlcipher或pysqlcipher3。先装依赖pip install pysqlcipher3然后是一个可复制的配置片段用 JSON 存解密参数。注意路径和字段名要按你实际情况改{ db_path: /path/to/your/qq/MsgEx.db, output_path: /path/to/export/chat.txt, key: your_local_key_here, cipher_page_size: 1024, kdf_iter: 64000, cipher_hmac_algorithm: HMAC_SHA1, cipher_kdf_algorithm: PBKDF2_HMAC_SHA1 }这个 JSON 里的key是本地密钥不是 QQ 密码。旧设备上这个 key 有时能从应用数据里找到有时需要从设备内存 dump。如果你拿不到 key可以先用模型对话入口让模型帮你分析文件头特征判断加密类型。把文件头的前 64 字节用十六进制贴给模型问它“这是什么加密格式”通常能得到方向性建议。接下来是导出脚本骨架。这个脚本做三件事打开加密库、查询消息表、导出成文本。表名在不同版本里可能是mr_friend_xxx或MessageSvc先用.tables看一遍import sqlite3 from pysqlcipher3 import dbapi2 as sqlcipher import json import os with open(config.json, r, encodingutf-8) as f: cfg json.load(f) conn sqlcipher.connect(cfg[db_path]) conn.execute(fPRAGMA key{cfg[key]}) conn.execute(fPRAGMA cipher_page_size{cfg[cipher_page_size]}) conn.execute(fPRAGMA kdf_iter{cfg[kdf_iter]}) conn.execute(fPRAGMA cipher_hmac_algorithm{cfg[cipher_hmac_algorithm]}) conn.execute(fPRAGMA cipher_kdf_algorithm{cfg[cipher_kdf_algorithm]}) cur conn.cursor() cur.execute(SELECT name FROM sqlite_master WHERE typetable) tables [row[0] for row in cur.fetchall()] print(表列表:, tables) with open(cfg[output_path], w, encodingutf-8) as out: for t in tables: if msg in t.lower() or message in t.lower(): try: cur.execute(fSELECT * FROM {t} LIMIT 5) cols [d[0] for d in cur.description] out.write(f {t} \n) out.write(字段: , .join(cols) \n) except Exception as e: print(f跳过 {t}: {e}) conn.close() print(导出完成检查, cfg[output_path])这个骨架先只打印表结构和前几行确认能读通再改查询逻辑。为什么要先 LIMIT 5因为直接全量导出可能几万条格式没调好就白导了。先小批量验证字段再放开。如果你用的是 Codex 或类似工具做脚本调试配置里需要三件套Base URL 填https://taotoken.net/apiKey 填你创建的 KeyModel ID 填你选的模型名。这三样缺一不可很多人只填了 Key 忘了 Base URL结果请求发到默认地址直接 401。Cline MCP 场景同理MCP 配置里也要把这三件套写全。脚本跑通后你可以把导出的文本再喂给模型做整理比如按联系人分组、按时间排序。这时候用模型对话入口就行把文本贴进去让它输出结构化格式。整个链路就是本地文件 → 解密脚本 → 原始导出 → 模型整理 → 可读记录。4. 验证请求与成功结果怎么确认真的读出来了脚本能跑不代表数据对。验证分三层文件层、字段层、内容层。文件层看解密是否成功字段层看表结构是否符合预期内容层看导出的文本是不是真的聊天内容。文件层验证运行脚本后如果PRAGMA key错了通常会报file is not a database或直接返回空表。这时候先别改脚本用十六进制编辑器再看一次文件头。如果解密成功sqlite_master查询会返回一堆表名比如mr_friend_xxx、MessageSvc、RecentContact。看到这些表名说明解密参数对了。字段层验证拿到表名后查一张消息表的字段。典型字段包括msgId、msgTime、msgContent、friendUin、senderUin。如果msgContent是乱码可能是编码问题试试decode(utf-8, ignore)或者查一下是不是压缩存储。有些版本的消息内容是 zlib 压缩的需要先解压import zlib raw row[3] try: text zlib.decompress(raw).decode(utf-8, ignore) except Exception: text str(raw)内容层验证导出几条后人工核对。比如你记得某天和某人聊过某个话题去导出文件里搜关键词能搜到就说明链路通了。这一步别偷懒我见过解密参数错了一半、导出全是空字符串的情况不核对根本发现不了。成功的结果长这样导出文件里每条记录有明确的时间戳、发送者、接收者、消息正文。时间戳通常是 Unix 秒或毫秒转换一下就是可读时间import datetime ts 1700000000 print(datetime.datetime.fromtimestamp(ts))如果时间戳是 13 位除以 1000 再转。转换后核对几条确认时间对得上。再给一个验证 API 链路是否正常的请求示例。有时候脚本没问题但模型调用失败导致整理环节卡住。用这个命令测curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_KEY \ -d { model: gpt-4o-mini, messages: [{role: user, content: 把这句话按时间排序B 2023-01-02, A 2023-01-01}] }返回正常说明 API 通。如果这里报错先解决 Key 和 Base URL再回去跑导出脚本。顺序别搞反否则你会以为是脚本问题。验证通过后建议把导出结果做一次备份原始数据库文件也留一份。因为脚本调试过程中可能改坏配置有备份能快速回滚。整个验证过程大概花 20 到 30 分钟比盲目试错快得多。5. 常见报错排查401、local proxy failed、reading choices这一节列几个真实会遇到的报错以及对应的排查动作。这些报错我在调试导出链路时基本都踩过按顺序查能省时间。报错一401 Unauthorized。这是最常见的。原因通常是 Key 没填、填错、或者 Base URL 不对。排查顺序先确认环境变量TAOTOKEN_KEY有没有值echo $TAOTOKEN_KEY看一下再确认请求地址是https://taotoken.net/api不是别的最后确认请求头格式是Authorization: Bearer keyBearer 后面有空格。如果用的是 Codex 的auth.json检查里面OPENAI_API_KEY字段和base_url字段是否都填了。三件套缺一个都会 401。报错二local proxy failed。这个报错通常出现在本地网络配置有问题时。注意这里说的不是让你去配什么代理工具而是检查你的开发环境有没有残留的代理设置干扰请求。排查方法检查环境变量HTTP_PROXY、HTTPS_PROXY是否被设置成了无效地址如果有就清掉。在 Python 脚本里requests库会自动读取这些变量导致请求发不出去。清掉后重试unset HTTP_PROXY unset HTTPS_PROXY然后重新跑 curl 验证。如果 curl 通了脚本也通了说明就是环境变量的问题。报错三reading choices 相关错误。这个报错一般是响应结构不符合预期脚本里直接取response[choices][0]就会崩。原因可能是 API 返回了错误信息而不是正常结构。排查先把原始响应打印出来看error字段。常见的是模型名写错、请求体格式不对。比如模型名填了不存在的 ID返回里就没有choices。解决方法是核对模型 ID用模型对话入口先确认模型可用再写进脚本。报错四OAuth 相关错误。如果你用的是 Claude Code 或类似工具可能会遇到 OAuth 认证失败。这类工具有时走的是 OAuth 流程而不是纯 API Key。排查确认你用的是 API Key 模式Base URL 填https://taotoken.net/api不要混用 OAuth 配置。Claude Code 接入时参考文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里的配置说明把 Base URL、Key、Model ID 三件套写全。如果之前配过别的端点先清掉旧配置再填新的。报错五数据库解密后表为空。这不是 API 报错但很常见。原因可能是 key 错了、或者数据库版本不匹配。排查换一个已知能读的库测试脚本确认脚本本身没问题再检查 key 是不是从正确位置取的。有些设备的 key 存在shared_prefs里有些在databases同级目录的配置文件里。用模型帮你分析文件内容把可疑的字符串贴给模型问它“这像不像密钥”。排查原则先隔离问题层。API 报错就只查 API脚本报错就只查脚本别混在一起查。每解决一层验证一次再进下一层。这样即使出错也能快速定位。6. 从导出到整理把链路用顺的实用建议数据导出只是第一步真正省时间的是把后续整理也串起来。我的做法是导出脚本跑完后直接把原始文本喂给模型做结构化。比如让它按“联系人 日期 消息”输出成表格或者提取某个时间段的所有对话。这一步用模型对话入口就能做不用写复杂代码。如果你要长期处理多个设备的备份建议把脚本参数化用配置文件管理不同设备的路径和 key。这样换设备时只改配置不动代码。TaoToken 的 Coding Plan 适合这种持续性任务一个 Key 覆盖多个脚本的调试和运行。最后给个实用技巧导出前先备份原始数据库文件导出后再备份一次结果。数据库文件不要放在会被同步的目录里避免意外覆盖。整理好的记录如果要长期保存转成纯文本或 Markdown别依赖某个特定软件打开。整个链路走下来核心就三件事拿到本地文件、配对解密参数、用统一 Key 把脚本和模型串起来。密码忘了不是终点本地数据还在就有办法。合规前提下做自己的数据自查这套方法够用了。
返回列表