目录
一、项目定位与整体能力概览
二、功能拆解:它到底能做什么?
聊天记录浏览与检索
媒体内容处理
统计分析与群聊画像
年度报告生成
多格式导出(Export)
HTTP API(对外集成)
三、实现方式与架构设计
进程与线程结构
数据与服务层(Electron services)
前端 UI 与状态管理
四、技术栈总结
后端 / 主进程相关
前端相关
构建与发布
五、适用范围与可行性分析
适用人群与场景
可行性与成熟度
六、二次开发的建议
作为终端用户使用
作为开发者二开 / 接入
总结
下面是基于已获取源码与文档,对 WeFlow 项目的系统性拆解和评估。
一、项目定位与整体能力概览
项目地址:https://github.com/hicccc77/WeFlow
定位:
WeFlow 是一个 完全本地运行 的桌面应用,用于:
-
读取 & 解密 PC 版微信本地数据库(WCDB)
-
实时浏览聊天记录(私聊 / 群聊)
-
对聊天数据做统计分析、群聊画像
-
生成年度报告(可视化页面)
-
将聊天记录导出为多种格式(HTML、ChatLab 标准格式、Excel、JSON 等)
-
暴露本地 HTTP API,供其他工具(如 ChatLab)调用
关键特征:
-
所有数据与计算 都在本机完成,无云端依赖,隐私友好
-
深度耦合微信 PC 版数据库结构(WCDB + 各种 media.db、emoticon.db)
-
除可视化以外,还提供了“标准化导出格式”(ChatLab),方便在其他系统中复用
二、功能拆解:它到底能做什么?
聊天记录浏览与检索
-
自动连接、解密微信数据库(前提:提供 db 路径 + 解密 key + 微信号 wxid)
-
会话列表(私聊 + 群聊):
-
未读数、最后一条消息摘要、时间、会话类型(群/单聊)
-
头像与显示名从联系人表 & 缓存中补齐
-
-
聊天消息列表:
-
按时间、分页/游标懒加载,支持向上加载更多历史
-
支持文本、图片、表情包、语音、视频、链接、系统消息等多类型消息展示
-
群聊中,显示每条消息的发送者昵称,区分自己/他人
-
媒体内容处理
-
图片:
-
通过 imageDecryptService,基于微信的加密规则解密 *.dat 文件
-
支持缩略图与高清图切换(有“发现更高清图片,点击更新”逻辑)
-
前端点击“图片未解密 -> 点击解密”触发后台解密
-
-
表情包(emoji/自定义表情):
-
从消息 XML 或表情数据库中恢复 CDN URL / MD5
-
支持本地缓存表情图片(用于导出/展示)
-
fallback 逻辑:如果消息里没有 CDN URL,会尝试去 emoticon.db / emotion.db 里按 MD5 搜索 [从 chatService.fallbackEmoticon 可见]
-
-
语音:
-
使用 silk-wasm + sherpa-onnx-node 进行:
-
语音文件解码(silk -> wav)
-
本地离线语音转文字(Sherpa Onnx)
-
-
UI 上:
-
可播放 / 暂停
-
语音波形(基于采样振幅渲染)
-
“点击解密”、“转写中… / 转写失败 / 转写结果” 多状态展示
-
-
-
视频:
-
后台 videoService 获取视频文件路径 + 尺寸信息
-
专门的“视频播放窗”窗口:
-
根据视频宽高比,智能计算窗口尺寸
-
双击消息中缩略图时,使用 window:openVideoPlayerWindow 打开新窗口播放
-
-
统计分析与群聊画像
在 Electron services 中有:
-
analyticsService:
-
对多会话进行聚合统计:
-
消息数量、时间分布(小时/星期)、消息类型占比
-
联系人排行(谁跟你聊得最多)
-
-
结果前端以 ECharts 图表绘制:饼图 / 柱状图 / 时间曲线等
-
-
groupAnalyticsService:
-
针对单个群聊做画像:
-
成员发言数量排行
-
活跃时间段(按小时分布)
-
媒体消息统计(图、语音、视频、表情等数量)
-
-
-
有缓存清理接口(analytics 缓存、图片缓存、所有缓存),通过 IPC 调用 cache:clearAnalytics / cache:clearImages / cache:clearAll
年度报告生成
-
使用独立 Worker (annualReportWorker.ts) 在后台生成:
-
输入:年份 + 数据库路径 + 解密 key + wxid + resourcesPath + userDataPath 等参数
-
中间利用 WCDB 提供的年度统计接口:
-
getAvailableYears
-
getAnnualReportStats
-
getAnnualReportExtras
-
-
生成一套 JSON + HTML,可在 AnnualReportWindow 里以流畅的 UI 展示
-
-
应用层支持:
-
检测可用年份(有哪些年有聊天记录)
-
进度回调:annualReport:progress 事件推送进度条
-
导出年度报告图片:前端利用 html2canvas 把报告卡片渲染为 PNG,然后通过 annualReport:exportImages保存到本地目录中
-
多格式导出(Export)
核心逻辑在 electron/services/exportService.ts:
支持导出为:
-
ChatLab 标准格式(推荐):
-
结构包含:
-
chatlab(版本、导出时间、生成器)
-
meta(会话名称、平台=wechat、会话类型、ownerId)
-
members(每个参与者的 platformId / accountName / groupNickname / avatar)
-
messages(发件人、昵称、时间、类型、内容)
-
-
消息类型做了本地类型 -> ChatLab 类型的映射(文本、图片、语音、视频、链接、文件、位置、通话、系统消息等)
-
对 49 类型(appmsg)进行二次解析,根据 <type> 区分文件 / 小程序 / 引用消息
-
-
JSON / JSONL / HTML / TXT / Excel / SQL
-
文本/HTML:用 parseMessageContent 将 XML/压缩内容解码为可读文案
-
Excel:使用 ExcelJS 构造多 sheet 的统计/明细表,支持“紧凑列”模式
-
Media 导出:
-
图片 -> images/ 子目录
-
语音 -> voices/,可选“转文字后不导出音频”
-
表情 -> emojis/
-
-
导出过程支持回调进度 export:progress,包括:
-
当前导出到第几个会话
-
当前阶段:preparing / exporting / writing / complete
HTTP API(对外集成)
详见 docs/HTTP-API.md [1]:
-
服务启动:在应用设置中勾选“启动 API 服务”
-
默认监听:http://127.0.0.1:5031
-
仅本地回环地址,默认不对外网暴露
-
-
主要接口:
-
GET /health —— 健康检查
-
GET /api/v1/messages
-
参数:talker(wxid 或群 ID,必填)、limit、offset、start/end(YYYYMMDD)、chatlab=1 or format=chatlab
-
返回:原始格式 或 ChatLab 标准格式消息数组
-
-
GET /api/v1/sessions
-
参数:keyword、limit
-
返回:会话概要列表(username、displayName、lastMessage、lastTime 等)
-
GET /api/v1/contacts
-
参数:keyword、limit
-
返回:联系人列表(userName、alias、nickName、remark等)
这样,任何本地脚本(Python/Node/PowerShell/cURL)都可以通过 HTTP 拉取微信聊天数据,做进一步分析。
三、实现方式与架构设计
进程与线程结构
-
Electron 主进程 (electron/main.ts):
-
管理窗口生命周期(主窗口 + Onboarding 首次引导窗口 + 协议窗口 + 视频播放窗口)
-
提供一大批 IPC handler,转发到各个 service:
-
config:* 配置保存 / 清理
-
dbpath:* 自动检测、扫描 wxid、获取默认路径
-
wcdb:* 测试连接、打开、关闭
-
chat:* 会话 / 消息 / 图片 / 语音 / 视频 / 表情 相关接口
-
analytics:*、groupAnalytics:* 分析相关
-
export:* 导出逻辑
-
annualReport:* 年度报告逻辑
-
key:* 自动获取数据库 key / 图片 key(依赖 wx_key.dll)
-
-
管理自动更新(electron-updater),控制是否启用自动下载与安装
-
-
Preload 脚本 (electron/preload.ts):
-
使用 contextBridge.exposeInMainWorld 暴露 window.electronAPI
-
将 IPC 封装为 Promise 异步方法,前端通过 window.electronAPI.xxx 使用,无需直接操作 ipcRenderer
-
-
Worker 线程:
-
wcdbWorker.ts:所有数据库重操作都在此线程中,避免阻塞主进程
-
annualReportWorker.ts / transcribeWorker.ts / imageSearchWorker.ts:较重计算任务多用 Worker 实现
-
数据与服务层(Electron services)
代表性服务:
-
wcdbCore.ts + wcdbService.ts:
-
使用 koffi 动态加载 wcdb_api.dll、WCDB.dll、SDL2.dll 等
-
定义一系列 C 函数签名(如 wcdb_get_sessions, wcdb_get_messages, wcdb_open_message_cursor 等)
-
通过 wcdbService 作为 “代理对象”,把 worker 中的 Core 封装为 Promise 风格 API
-
做了大量容错处理:
-
DLL 路径多重候选
-
日志写入 wcdb.log,方便定位闪退/初始化失败
-
针对 VC++ 运行库缺失 / 32/64 位不匹配,给出更易懂的错误提示文案
-
-
-
chatService.ts(最关键):
-
connect:
-
确认用户在配置中填写了 myWxid / dbPath / decryptKey
-
通过 WCDB 打开数据库,设置当前账号,预热媒体 DB 列表缓存
-
-
getSessions:
-
调用 wcdb 获取原始 session row
-
过滤无效 / 垃圾会话
-
基于 avatarCache(持久化到磁盘)给 session 补全 displayName / avatarUrl
-
-
getMessages:
-
使用 message cursor(openMessageCursor + fetchMessageBatch)分批查询
-
对原始 row 进行规整、排序修正、消息类型区分(文本/图片/emoji/语音/视频/系统等)
-
并发修复缺失 emoji CDN URL
-
本地 messageCacheService 缓存每个会话的消息列表,前端可先显示缓存,再补充新消息
-
-
图片/语音/视频/表情的具体解密/获取也由此处调度到对应 service
-
-
exportService.ts:
-
实现从 WCDB -> ChatLab/Excel/HTML/JSON 等导出逻辑的全部过程
-
包含复杂的内容解析、类型映射、媒体落盘逻辑(前文已详述)
-
前端 UI 与状态管理
-
前端入口:src/main.tsx + src/App.tsx
-
页面路由(src/pages):
-
WelcomePage、HomePage:引导 + 首页
-
ChatPage:核心聊天浏览页面
-
AnalyticsPage / AnalyticsWelcomePage:分析与概览
-
GroupAnalyticsPage:群聊画像
-
AnnualReportPage / AnnualReportWindow:年度报告
-
ExportPage:导出配置与执行
-
DataManagementPage:数据库路径/缓存/日志管理
-
SettingsPage:配置 myWxid/dbPath/decryptKey、API 服务开关、日志开关等
-
VideoWindow:独立视频播放窗口
-
AgreementPage:用户协议
-
-
ChatPage.tsx 中的典型优化:
-
使用 useChatStore(Zustand)保存全局聊天状态
-
针对侧边会话列表:
-
SessionItem 使用 React.memo + 自定义 props 比较,减少重渲染
-
分批异步加载联系人信息(昵称/头像),在滚动时暂停加载,利用 requestIdleCallback + 防抖节流
-
-
消息渲染层:
-
内部定义 MessageBubble,对各种类型消息进行差异化呈现(图片/语音/视频/链接/引用/表情)
-
文本 + 微信原生 emoji 通过 wechat-emojis 转成 inline <img> 展示
-
增量刷新消息时保持滚动位置,并提供“回到底部”按钮
-
-
四、技术栈总结
后端 / 主进程相关
-
Electron 39.x
-
Node.js 环境
-
C/C++ + DLL(wcdb_api.dll, WCDB.dll, wx_key.dll)
-
koffi:FFI 调用 C 接口
-
better-sqlite3:用于内部缓存/辅助数据库操作(非微信主库)
-
fzstd:Zstd 解压,用于解压微信压缩内容
-
sherpa-onnx-node + silk-wasm:语音解码与识别
前端相关
-
React 19 + TypeScript
-
Vite 6 + @vitejs/plugin-react
-
状态管理:Zustand
-
路由:React Router DOM v7
-
图表:ECharts + ECharts for React
-
UI/图标:Lucide React + SCSS(大量页面独立样式)
-
Markdown 渲染:react-markdown + remark-gfm(部分说明/协议)
构建与发布
-
打包:electron-builder
-
Windows NSIS 安装包
-
资源(DLL、icon)通过 extraResources 打入应用目录中
-
-
脚本:
-
dev: Vite dev
-
build: tsc && vite build && electron-builder
-
默认安装产物输出到 release 目录
-
五、适用范围与可行性分析
适用人群与场景
非常适合:
重度微信用户/自媒体系:
想长期保存聊天记录(尤其有法律/业务价值的);
需要导出 HTML/Word/Excel/ChatLab,存档或复盘。
数据分析 / AI 应用开发者:
借助 ChatLab 格式,通过本地 HTTP API 把微信聊天导入到自己的分析/LLM 系统;
做“情感分析/话题建模/关系网络分析”等。
对隐私非常敏感的个人或小团队:
不希望聊天记录上传第三方服务器;
需要完全本地、自控的数据流程。
一般适合:
-
只偶尔需要导出少量记录做证据或存档的普通用户(可能更简单的导出工具也能满足)。
不太适合:
-
完全不懂 PC 版微信备份 / 不愿意折腾“解密 key”的小白用户;
-
需要云端多端同步、Web 在线查看聊天记录的需求(WeFlow 是纯本地桌面工具)。
可行性与成熟度
从源码 + Releases 信息来看:
-
项目功能是可用且在持续维护的:
-
已有 1.x 多个版本,最新 v1.3.x 修过闪退问题
-
有完整的构建脚本和自动更新机制
-
-
技术选型成熟、社区常见(Electron + React + TS + WCDB + ECharts 等),没有明显“玩票式”代码风格
-
对稳定性有不少专门处理:
-
PATH 白名单过滤,避免被第三方 VC++ runtime 劫持;
-
Worker 分离重任务,防止 UI 卡顿;
-
日志系统 + 错误提示,对 DLL 加载失败等情况给出指导语。
-
风险与限制点:
强依赖 Windows + PC 微信实现细节:
不支持 macOS / Linux;
微信未来若大改数据库结构,可能需要更新 WCDB DLL 与上层逻辑。
环境依赖:
必须有 Visual C++ Redistributable (x64);
DLL 架构必须和系统/应用匹配(64 位)。
数据体量大时的体验:
几十万 / 百万条消息时,虽然有缓存/游标/worker,但在低配置机器上仍可能出现加载缓慢。
HTTP API 标为“早期版本”:
文档已给出,但接口未来可能会有 break change。
总体上,从工程质量、功能完整度、隐私安全性三个维度看:
-
工程质量:中上(结构清晰、模块划分合理、错误处理较完善)
-
功能完整度:高(涵盖浏览、分析、报告、导出、API 几大核心能力)
-
隐私安全:极佳(完全本地,不联网)
六、二次开发的建议
作为终端用户使用
-
环境准备:
-
Windows 10/11 x64;
-
安装最新版 PC 微信;
-
确保已安装 Microsoft Visual C++ Redistributable x64。
-
-
步骤:
-
用 PC 微信把手机聊天记录迁移/备份到电脑;
-
在 WeFlow 设定中自动/手动定位微信数据库路径;
-
使用“自动获取 key”功能获取数据库解密 key;
-
连接成功后即可浏览会话 / 消息;
-
在分析/年度报告/导出页面按需操作;
-
如需与其他工具联动,可在设置中开启 HTTP API 服务。
-
作为开发者二开 / 接入
-
利用 HTTP API 作为“微信聊天数据源”,自己的服务做:
-
问答机器人(基于历史聊天);
-
私有知识库;
-
情感分析 / 推荐系统等。
-
-
利用导出的 ChatLab 格式:
-
直接导入你已有的对话数据平台或 LLM 微调数据集。
-
-
如果要深度修改:
-
可以基于现有 chatService / exportService 扩展新的导出格式或分析逻辑;
-
注意 WCDB 相关改动需要非常小心,避免破坏 DLL 调用契约。
-
总结
WeFlow 是一个面向“想认真管理和分析微信聊天记录”的用户与开发者的 本地桌面级解决方案。
通过 Electron + React + WCDB + 多个 Worker 线程,把微信 PC 本地数据库完整“打通”,实现了从“数据接入 → 实时浏览 → 统计分析 → 年度报告 → 标准格式导出 → HTTP API”这一整条链路。
如果你关心隐私、又需要高质量的聊天数据导出和分析能力,WeFlow 是目前生态中实现方式较为严谨、功能比较全面且开放的一个选择,具有很高的实践可行性。
References
[1] README / HTTP-API 文档 / 源码目录. https://github.com/hicccc77/WeFlow
网硕互联帮助中心





评论前必须登录!
注册