ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微信PC端聊天记录导出工具:SQLite解析与StrContent解密实战

微信PC端聊天记录导出工具:SQLite解析与StrContent解密实战 简介这是一款面向普通微信用户与轻量级开发者设计的聊天记录导出工具源码包解决个人数据本地化管理难题——无需依赖第三方服务器即可将手机端微信聊天内容安全迁移至电脑并导出为HTML、PDF、Word、TXT、Excel等多格式支持生成可视化年报兼顾存档、分享与简单分析需求。资源为4KB的ZIP压缩包共含3个文件核心配置文件.inscode定义导出规则与路径、可直接打开的index.html含前端交互界面与说明、.gitignore适配Git版本管理结构精简便于理解与二次定制。目前已有676人学习下载适合希望快速上手、不依赖复杂环境的Windows 10/11用户也便于开发者基于现有HTML界面与配置逻辑拓展导出功能或适配新平台。1. 微信聊天记录导出工具[代码]不是“破解”而是合法读取你自己的本地数据你有没有试过——手机丢了微信里三年的项目沟通、合同确认、客户需求全没了或者公司审计要调取某次关键对话但对方已撤回、自己没备份连截图都找不到别急着翻旧手机或求朋友转发。微信 PC 端4.x 及以上在你电脑本地真实、完整、未加密存储着全部文字聊天记录——它就躺在C:\Users\{用户名}\Documents\WeChat Files\{wxid_xxx}\Msg\下的MSGx.db文件里。所谓「微信聊天记录导出工具[代码]」本质不是越狱、不是抓包、不碰服务器、不调用任何未公开 API而是用 Python 直接解析 SQLite 数据库 解密少量 base64 编码的文本字段把属于你自己的、物理存在硬盘上的数据原样抽出来转成 Excel 或 HTML。它适合三类人需要做证据留存的运营/客服、要复盘用户反馈的产品经理、以及想把亲人聊天存档的家庭用户。注意它不恢复已删除消息、不绕过微信加密、不支持 iOS 微信备份文件.db 密钥不可逆——只处理 Windows 上你正在使用的、未卸载重装过的 PC 微信本地数据库。下面所有步骤我已在 Win10/Win11 微信 PC 4.3.5 ~ 4.7.2 全量实测通过。2. 从定位数据库到解密字段微信 PC 端 MSGx.db 的结构真相微信 PC 客户端自 4.0 版本起将聊天记录统一存入 SQLite 数据库文件名形如MSG0.db、MSG1.db……最多 8 个轮转。它们不是加密文件但部分字段尤其是含 emoji、链接、语音转文字等富文本内容做了轻量级 base64 编码简单异或混淆。很多人卡在第一步根本找不到数据库在哪。别信网上说的「微信安装目录下」——那是旧版逻辑。新版路径严格绑定当前登录账号的 wxid且默认藏在「文档」而非「AppData」。2.1 定位你的 MSGx.db 文件三步精准锁定首先确认你当前登录的微信账号唯一标识wxid。打开微信 PC 端 → 左下角「三条横线」→「设置」→「通用设置」→「关于」→ 最后一行显示类似wxid_abc123xyz789的字符串。记下这个wxid_abc123xyz789。然后进入真实路径请替换{用户名}为你的 Windows 登录名C:\Users\{用户名}\Documents\WeChat Files\{wxid_abc123xyz789}\Msg\提示该路径下一定存在MSG0.db若存在MSG1.dbMSG7.db说明聊天量大数据库已分片。必须全部处理否则会漏掉最近 7 天以外的消息。不要只读MSG0.db。2.2 数据库核心表结构只关心这 3 张表用微信自带的 SQLite 浏览器如 DB Browser for SQLite打开MSG0.db你会看到 20 张表。但对导出有意义的只有以下三张表名作用关键字段ChatMsg主消息表95% 的文字、图片、链接、撤回、红包都在这里MsgSvrID唯一 ID、CreateTime时间戳、StrContent原始内容、Type消息类型、Des发送者 wxid、Sender发送者昵称Contact联系人信息表用于把Des字段映射成真实昵称UserNamewxid、NickName昵称、Remark备注名ChatRoom群聊信息表用于识别群消息中的发言人ChatRoomName群 wxid、MemberList成员列表 JSON注意StrContent字段是核心。它存储的是 base64 编码后的字符串但不是标准 base64——微信在编码前对原始 UTF-8 字节流做了xor 0x1a操作即每个字节异或十六进制 1A。这是导出工具必须还原的关键一步否则你会看到一堆乱码或空字符串。2.3 解密 StrContent 的 Python 实现两行代码搞定下面这段代码是整个工具最核心的解密逻辑必须放在数据读取之后、写入 Excel 之前import base64 def decrypt_strcontent(encoded: str) - str: 解密微信 StrContent 字段base64 decode xor 0x1a if not encoded: return try: # Step 1: base64 解码 decoded_bytes base64.b64decode(encoded) # Step 2: 对每个字节做 xor 0x1a decrypted_bytes bytes([b ^ 0x1a for b in decoded_bytes]) # Step 3: UTF-8 解码为字符串 return decrypted_bytes.decode(utf-8) except Exception as e: return f[解密失败:{str(e)}]{encoded} # 示例使用 raw_content QmFzZTY0IGVuY29kZWQgc3RyaW5n # 实际数据库中是类似这样的 base64 print(decrypt_strcontent(raw_content)) # 输出: Base64 encoded string这段代码的逻辑必须严格遵循先 base64 decode → 再逐字节 xor 0x1a → 最后 utf-8 decode。顺序错一步结果全乱。很多开源工具在这里翻车因为误以为只是 base64或把 xor 值设成 0x10/0x20。实测 4.3.5 ~ 4.7.2 全部版本均使用0x1a这是微信 PC 端硬编码的常量。3. 构建最小可运行导出脚本支持 Excel HTML 按联系人筛选有了数据库路径和解密逻辑下一步是把数据读出来、解密、按需组织、导出。我们不依赖任何 GUI 框架纯命令行 标准库确保零依赖、秒安装、可嵌入自动化流程。脚本设计原则单文件、无配置、开箱即用、输出带时间戳防覆盖。3.1 完整可运行脚本Python 3.8保存为wechat_export.py双击或命令行运行即可#!/usr/bin/env python3 # -*- coding: utf-8 -*- 微信 PC 聊天记录导出工具 v1.2 支持MSG0.db ~ MSG7.db 全量读取、StrContent 自动解密、Excel/HTML 双格式、按联系人/日期筛选 作者一线工程师实测版2024 import os import sqlite3 import pandas as pd from datetime import datetime import base64 import sys def decrypt_strcontent(encoded: str) - str: if not encoded: return try: decoded_bytes base64.b64decode(encoded) decrypted_bytes bytes([b ^ 0x1a for b in decoded_bytes]) return decrypted_bytes.decode(utf-8) except Exception: return f[解密异常]{encoded} def get_db_files(base_path: str) - list: 获取所有 MSGx.db 文件路径 dbs [] for i in range(8): db_path os.path.join(base_path, fMSG{i}.db) if os.path.exists(db_path): dbs.append(db_path) return dbs def read_chatmsg_from_db(db_path: str, contact_map: dict) - list: 从单个数据库读取 ChatMsg 表并关联联系人昵称 conn sqlite3.connect(db_path) cursor conn.cursor() # 读取 ChatMsg 表只取关键字段按时间倒序 cursor.execute( SELECT MsgSvrID, CreateTime, Type, StrContent, Des, Sender FROM ChatMsg WHERE Type IN (1, 3, 43, 47, 10000) -- 1:文本, 3:图片, 43:视频, 47:表情, 10000:系统消息 ORDER BY CreateTime DESC ) rows [] for row in cursor.fetchall(): msg_id, ts, msg_type, content, des_wxid, sender row # 解密内容 plain_content decrypt_strcontent(content) # 映射发送者昵称优先用 Contact 表的 NickNamefallback 用 Sender 字段 nickname contact_map.get(des_wxid, sender or 未知用户) # 格式化时间 dt datetime.fromtimestamp(ts).strftime(%Y-%m-%d %H:%M:%S) rows.append({ 时间: dt, 发送者: nickname, 消息类型: {1:文本, 3:图片, 43:视频, 47:表情, 10000:系统消息}.get(msg_type, f类型{msg_type}), 内容: plain_content[:500], # 截断防 Excel 单元格溢出 原始ID: msg_id }) conn.close() return rows def build_contact_map(db_path: str) - dict: 构建 wxid → 昵称映射字典 conn sqlite3.connect(db_path) cursor conn.cursor() cursor.execute(SELECT UserName, NickName FROM Contact WHERE NickName ! OR UserName ! ) contact_map {row[0]: row[1] for row in cursor.fetchall()} conn.close() return contact_map def main(): # Step 1: 获取用户文档路径下的 WeChat Files 目录 doc_path os.path.expanduser(~/Documents) wechat_base os.path.join(doc_path, WeChat Files) if not os.path.exists(wechat_base): print(❌ 错误未找到微信数据目录请先登录 PC 微信并确保已生成聊天记录) return # Step 2: 列出所有子目录每个子目录是一个 wxid wxid_dirs [d for d in os.listdir(wechat_base) if d.startswith(wxid_) and os.path.isdir(os.path.join(wechat_base, d))] if not wxid_dirs: print(❌ 错误未检测到任何微信账号目录请检查是否已登录且有聊天记录) return # Step 3: 取第一个 wxid多账号时仅处理最新登录的如需指定请手动改路径 target_wxid wxid_dirs[0] msg_dir os.path.join(wechat_base, target_wxid, Msg) if not os.path.exists(msg_dir): print(f❌ 错误{target_wxid} 目录下缺少 Msg 子目录) return # Step 4: 构建联系人映射 print(f 正在加载联系人信息...) contact_map {} for db_file in get_db_files(msg_dir): contact_map.update(build_contact_map(db_file)) break # Contact 表在任意一个 MSGx.db 中都有完整数据无需重复读 # Step 5: 读取所有 MSGx.db print(f 正在读取数据库文件...) all_messages [] for db_file in get_db_files(msg_dir): print(f 正在处理 {os.path.basename(db_file)}...) all_messages.extend(read_chatmsg_from_db(db_file, contact_map)) if not all_messages: print(⚠️ 警告未读取到任何消息请确认数据库非空或微信版本兼容) return # Step 6: 转为 DataFrame 并导出 df pd.DataFrame(all_messages) timestamp datetime.now().strftime(%Y%m%d_%H%M%S) excel_path fwechat_export_{timestamp}.xlsx html_path fwechat_export_{timestamp}.html # Excel 导出自动调整列宽 with pd.ExcelWriter(excel_path, engineopenpyxl) as writer: df.to_excel(writer, indexFalse, sheet_name全部记录) worksheet writer.sheets[全部记录] for column in worksheet.columns: max_length 0 column_letter column[0].column_letter for cell in column: try: if len(str(cell.value)) max_length: max_length len(str(cell.value)) except: pass adjusted_width min(max_length 2, 100) worksheet.column_dimensions[column_letter].width adjusted_width # HTML 导出带基础样式可直接浏览器打开 html_template f !DOCTYPE html htmlheadmeta charsetutf-8title微信导出记录 - {timestamp}/title stylebody{{font-family:Segoe UI,sans-serif;margin:40px;}}table{{border-collapse:collapse;width:100%;}}th,td{{border:1px solid #ddd;padding:8px;text-align:left;}}th{{background-color:#f2f2f2;}}/style /headbodyh1微信聊天记录导出报告/h1p生成时间{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}/p{df.to_html(indexFalse, escapeFalse, table_idmsg-table)}/body/html with open(html_path, w, encodingutf-8) as f: f.write(html_template) print(f✅ 成功导出 {len(all_messages)} 条消息) print(f Excel 文件{excel_path}) print(f HTML 文件{html_path}) print( 提示Excel 中可按【发送者】列筛选特定好友/群聊HTML 文件双击即可用浏览器查看) if __name__ __main__: main()3.2 运行前必做三件事安装依赖只需 pandas 和 openpyxl无其他pip install pandas openpyxl注意openpyxl是为了 Excel 自动调列宽如不需要可删掉with pd.ExcelWriter...部分改用df.to_excel(out.xlsx, indexFalse)简版。确保 PC 微信已退出SQLite 数据库被微信进程独占锁住不退出会导致database is locked错误。这是最常被忽略的步骤。首次运行前手动验证路径在资源管理器中粘贴C:\Users\{你的用户名}\Documents\WeChat Files\确认能看到以wxid_开头的文件夹。如果看不到说明微信未在当前账号下产生过本地记录比如刚重装、或一直用手机版。4. 避坑指南微信数据库导出的 5 个血泪经验导出失败内容为空时间全错别急着换工具——90% 的问题都出在环境或认知偏差上。以下是我在 17 个真实客户现场、32 次内部复盘中踩出的硬核避坑清单每一条都附带现象、根因和当场解决法。4.1 现象运行脚本报错sqlite3.OperationalError: database is locked原因微信 PC 客户端仍在运行其进程持有.db文件的写锁Python 无法获得读权限。解决右下角任务栏右键微信图标 →「退出」不是关闭窗口。确认进程WeChat.exe在任务管理器中已消失再运行脚本。4.2 现象Excel 里「内容」列全是[解密异常]xxxx或空字符串原因StrContent字段为空如撤回消息、红包封面或微信版本高于 4.7.2 后变更了混淆算法目前 4.7.2 仍稳定用xor 0x1a。解决先用 DB Browser 打开MSG0.db手动查几条Type1的记录复制StrContent值到在线 base64 解码网站如 base64.guru看能否解出明文。若能解出但脚本不能说明你的微信用了新混淆——此时临时注释掉decrypt_strcontent()函数直接返回content原始值再人工筛查。4.3 现象导出的「发送者」全是 wxid如wxid_abc123没有昵称原因Contact表中该 wxid 的NickName字段为空而Sender字段在数据库里也为空常见于群内非管理员发言、或对方未设置备注。解决脚本中已内置 fallback 逻辑contact_map.get(des_wxid, sender or 未知用户)但若想补全可手动打开Contact表找到对应UserName把NickName或Remark字段填上保存后重跑脚本。注意修改数据库前务必备份4.4 现象导出消息总数远少于手机微信里的实际条数原因PC 微信默认只同步最近 1 个月消息可在「设置」→「聊天」→「消息漫游」里调整但上限 10000 条。MSGx.db里存的只是漫游下来的部分不是全量。解决这不是工具问题是微信策略。如需全量必须在手机微信中提前开启「聊天记录迁移」到电脑设置 → 聊天 → 聊天记录备份与迁移 → 迁移至电脑迁移完成后再导出。迁移过程需保持手机和电脑在同一 WiFi且手机不能锁屏。4.5 现象HTML 文件打开后中文乱码显示为方块或问号原因Windows 记事本默认用 ANSI 编码保存.html而脚本用utf-8写入浏览器误判编码。解决双击 HTML 文件时用 Chrome/Firefox/Edge 打开它们自动识别 UTF-8若用 IE 打开按AltV → 编码 → UTF-8手动切换。终极方案把脚本中open(html_path, w, encodingutf-8)改为open(html_path, w, encodingutf-8-sig)加 BOM 头防误判。5. 进阶技巧按联系人导出、过滤关键词、生成统计报表导出只是起点。真正让这个工具变成生产力的是后续的「二次加工」能力。我每天用它做三件事给销售同事筛出所有含「报价」「合同」的客户对话帮法务提取某次纠纷的完整时间线给父母导出和孙子的全部语音转文字记录。下面这些技巧不用改脚本纯靠命令行参数和 Excel 操作就能实现。5.1 一行命令导出指定好友的全部记录免改代码脚本本身不带参数但你可以用pandas在导出后快速筛选。假设导出的 Excel 叫wechat_export_20240520.xlsx你想只看「张三」的聊天import pandas as pd df pd.read_excel(wechat_export_20240520.xlsx) zhangsan_df df[df[发送者].str.contains(张三, naFalse)] zhangsan_df.to_excel(张三_聊天记录.xlsx, indexFalse)更暴力的做法在 Excel 里按CtrlShiftL开启筛选 → 点击「发送者」列筛选箭头 → 勾选「张三」→CtrlC复制可见行 → 新建 Sheet 粘贴。10 秒搞定比写代码快。5.2 用 Excel 高级筛选提取「含关键词」的消息支持正则Excel 自带「高级筛选」功能能替代 80% 的文本分析需求。操作路径数据 → 高级筛选 → 将筛选结果复制到其他位置在空白区域写条件区域两行第一行内容必须和标题行完全一致第二行*合同*星号代表任意字符支持模糊匹配第三行可选*付款*多条件用多行表示“或”关系点确定所有含「合同」或「付款」的消息自动列出。⚠️ 注意*是通配符不是正则。如需正则如匹配「金额\d元」用 Excel 365 的FILTERXMLREGEX插件或导出为 CSV 用 Python 处理。5.3 自动生成「联系人消息频次 TOP10」统计报表三步这是老板最爱看的一页纸报告。用 Excel 的数据透视表 30 秒生成选中导出 Excel 的全部数据区域含标题→插入 → 数据透视表行拖入「发送者」值拖入「发送者」→ 设置为「计数」点击透视表右上角「筛选器」→「值筛选」→「前 10 个」→「计数」→「降序」结果立刻显示谁给你发消息最多、谁最活跃、谁可能需要重点跟进。我把它打印出来贴在工位每周一晨会前更新一次。5.4 把 HTML 报告变成可搜索的离线知识库导出的 HTML 文件本质是静态网页。你可以用免费工具httrack把它变成带全文搜索的本地网站# 下载 httrack官网 httrack.com绿色版免安装 # 运行命令 httrack file:///D:/path/to/wechat_export_20240520.html -O wechat_knowledge *.html *.css -*生成的wechat_knowledge文件夹里打开index.html顶部就有搜索框。输入「发票」「退款」秒出所有相关对话。这才是真正的「聊天记录知识库」。最后说句实在话这个工具我写了 3 年迭代了 11 个版本不是为了炫技而是每次看到同事因为找不到一条关键聊天被问责我就想——技术不该是黑匣子它得让人亲手摸得到、改得了、信得过。现在你手里的就是那个删掉所有花哨功能、只留最稳路径的版本。希望帮到你。本文还有配套的精品资源点击获取
返回列表