我用 Python + RPA 做了个企业微信聊天记录采集工具
我用 Python + RPA 做了个企业微信聊天记录采集工具
前段时间做了一个小工具,解决了我们公司一个让人抓狂的问题——企业微信的聊天记录无法批量导出。
没想到身边朋友反响还不错,干脆写一篇文章,聊聊这个工具的思路和实现过程中踩过的坑,也把工具开源出来。
起因:一次让人崩溃的工作交接
我们公司有个同事离职,他跟进了很多客户,客户沟通记录全在企业微信里。
接手的同事想回溯历史记录,打开企微开始翻——翻了半个多小时,手都酸了,还没翻完。
企业微信的聊天界面没有"跳转到某个日期"的功能,只能一屏一屏手动滑动。两年的聊天记录,这么翻下去,翻到猴年马月?
作为团队里唯一的技术人,我当然第一反应是:能不能自动化?
方案选型:为什么选 RPA
开始做之前先调研了几个方向:
方向一:解密数据库文件
企业微信在本地会缓存聊天记录,存在 SQLite 数据库里。有没有可能直接读这个数据库?
调研了一下,这个数据库是加密的,key 和账号绑定,没有官方文档。有人尝试过逆向,但风险高、维护成本大,而且稍微更新版本就可能失效。这条路放弃。
方向二:官方 API
企业微信官方有"会话存档" API,支持合法地拉取员工的聊天记录。
但有几个门槛:必须是企业版、需要管理员开通特殊权限、要接入企业自有服务器、配置周期长。
对于个人使用、或者小团队临时解决问题来说,这条路太重了。
方向三:RPA(机器人流程自动化)
换一个角度想:聊天记录在客户端窗口里都看得到,既然看得到,就能读到。
思路是:程序控制鼠标和键盘,模拟人工翻页的动作,每翻一屏,读取屏幕上显示的消息内容,存入本地数据库。
这个方案的好处:
- 不需要任何特殊权限,只要你的账号能看到,程序就能采到
- 不破解、不逆向,行为性质和人工操作一致
- 随企业微信更新,只需微调定位逻辑,整体稳定性高
最终选了方向三。
核心实现思路
整体流程分几个步骤:
定位聊天窗口
↓
模拟翻页(Page Up / 滚轮)
↓
截图 + 文字识别(OCR)
↓
解析消息结构(发送者、时间、内容)
↓
去重写入本地数据库
↓
判断是否到达目标位置或已达到截止日期
↓
继续下一屏或结束
窗口定位
程序启动时,让用户手动框选企业微信的聊天内容区域(一个拖拽框选的引导界面),把这个坐标记录下来。后续所有翻页、截图操作都基于这个区域。
之所以不自动检测窗口位置,是因为不同用户的屏幕分辨率、企微窗口大小都不一样,手动框选一次,后续复用,最稳。
翻页控制
模拟 Page Up 按键或鼠标滚轮向上滚动。每次翻页之后,等待一个短暂的时间,让内容渲染完成,再截图。
这里有一个坑:企业微信在加载历史消息时,有时候会有 loading 状态(转圈圈),如果翻太快,会截到加载中的空白画面。
解决方式是在每次翻页后检测 loading 状态,如果还在 loading 就等待,直到内容出现再继续。
消息解析
截图之后,用 OCR 把图片转成文字,然后解析出消息结构。
这里最难的是发送者和消息内容的分隔。企业微信的聊天界面,消息是气泡布局,左边是对方消息,右边是自己的消息,发送者名字在气泡上方。
解析策略:
- 识别气泡的位置(左/右)来判断是对方还是自己
- 识别时间戳的格式(通常是
HH:mm或昨天 HH:mm)来分隔不同消息 - 识别发送者名字(在消息气泡顶部的灰色小字)
这部分调了很久,对不同的字体大小、系统缩放比例、深色/浅色模式都要做适配。
去重逻辑
因为每次翻页会有一定的内容重叠(上一屏的最后几条,和下一屏的前几条),需要去重。
方案是给每条消息计算一个特征哈希(发送者 + 时间 + 内容前 N 个字符),写入数据库前先查是否已存在。
断点续采
采集记录会存一个"已采集到的最早消息时间"的标记。如果采集中断,下次重新开始时,翻页到对应位置再继续,不需要从头重采。
踩过的坑
坑一:企业微信更新之后,聊天界面的布局可能调整
遇到过一次大版本更新,气泡位置偏移了几个像素,导致解析出来的内容错位。
应对方案:关键布局参数(气泡宽度、名字区域高度等)提取为配置项,更新后手动调一次参数就好,不用改代码。
坑二:高 DPI 屏幕下截图坐标对不上
Windows 的 DPI 缩放(125%、150%、200%)会导致实际截图的坐标和程序计算的坐标不一致。
解决方式:程序启动时检测系统 DPI 缩放比例,所有坐标计算都乘以对应的系数。
坑三:长文本消息截断
企业微信的长消息(超过一定字数)在气泡里会有"展开"按钮,折叠了一部分内容。
应对:识别到"展开"按钮时,模拟点击展开,等待内容渲染后再 OCR。
坑四:图片消息的处理
图片消息在 OCR 结果里就是一个图片占位符,只能知道"这里有一张图",拿不到图片内容。
补充了一个图片采集逻辑:识别到图片气泡时,模拟点击打开大图,截取大图区域另存为图片文件,再关闭大图继续翻页。
技术栈
- Python 3.12
- PyAutoGUI / pywin32 — 窗口控制和键鼠模拟
- Pillow — 截图处理
- PaddleOCR — 文字识别(也测试过 Tesseract,PaddleOCR 对中文识别效果更好)
- SQLite — 本地消息存储
- Electron + React — 桌面 GUI 界面
- openpyxl — Excel 导出
现在的功能
经过几个月的迭代,现在工具有三个主要模块:
历史采集:指定群聊或联系人,一次性采集全部历史记录。支持批量(通过 Excel 模板导入采集列表)、支持日期范围、支持断点续采。
定时监控:设置时间间隔,工具在后台持续运行,定时采集新消息。有两个子模式:一是手动指定目标列表,二是智能扫描(自动识别有未读消息的会话并采集)。
Webhook 推送:采集到新消息后,实时推送到你配置的接口。支持多渠道,可以同时推到企业微信机器人、飞书、钉钉或者自建系统。
采集结果支持在工具内检索,也支持一键导出为 Excel。
一些使用场景
自己用了一段时间,也收到一些用户反馈,总结几个比较典型的场景:
- 员工交接:离职员工的客户沟通记录,统一导出归档
- 客户服务:客服对话记录自动定时采集,用于质量分析和合规留存
- 销售管理:销售与客户的聊天记录实时推送到 CRM
- 项目复盘:项目结束后,把项目群的讨论记录导出整理成文档
下载地址
https://github.com/a605204746/rpa_wxcom_chat_public/releases**
聊两句
做这个工具的初衷很简单,就是解决一个让我自己烦躁了很久的问题。
RPA 这个方向其实有很多可以做的事情,很多企业内部用的软件根本没有 API,但从界面层可以做很多自动化。这只是一个很小的切口,如果你也有类似的想法,欢迎交流。
如果这个工具对你有用,帮忙点个 Star,顺手的话也可以提 Issue 反馈问题或者功能建议。
数据安全说明:工具采集的所有数据只存在本机,不上传任何云端,不联网,不注册账号。你的聊天记录只有你自己看得到。
更多推荐
所有评论(0)