微信用户画像整理?一个开源项目搞定。
WeFlow是一款本地化运行的桌面应用,专注于微信PC版聊天记录的深度处理与分析。核心功能包括:数据库解密与实时浏览、多类型消息处理(文本/图片/语音等)、统计分析及群聊画像、年度报告生成、多格式导出(HTML/Excel/JSON等)以及HTTP API接口服务。采用Electron+React技术栈,通过Worker线程分离重任务保障性能,所有数据处理均在本地完成,确保隐私安全。适合需要长期存
目录
下面是基于已获取源码与文档,对 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 orformat=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
更多推荐
所有评论(0)