我用 Python + RPA 做了个企业微信聊天记录采集工具


前段时间做了一个小工具,解决了我们公司一个让人抓狂的问题——企业微信的聊天记录无法批量导出

没想到身边朋友反响还不错,干脆写一篇文章,聊聊这个工具的思路和实现过程中踩过的坑,也把工具开源出来。


起因:一次让人崩溃的工作交接

我们公司有个同事离职,他跟进了很多客户,客户沟通记录全在企业微信里。

接手的同事想回溯历史记录,打开企微开始翻——翻了半个多小时,手都酸了,还没翻完。

企业微信的聊天界面没有"跳转到某个日期"的功能,只能一屏一屏手动滑动。两年的聊天记录,这么翻下去,翻到猴年马月?

作为团队里唯一的技术人,我当然第一反应是:能不能自动化?


方案选型:为什么选 RPA

开始做之前先调研了几个方向:

方向一:解密数据库文件

企业微信在本地会缓存聊天记录,存在 SQLite 数据库里。有没有可能直接读这个数据库?

调研了一下,这个数据库是加密的,key 和账号绑定,没有官方文档。有人尝试过逆向,但风险高、维护成本大,而且稍微更新版本就可能失效。这条路放弃。

方向二:官方 API

企业微信官方有"会话存档" API,支持合法地拉取员工的聊天记录。

但有几个门槛:必须是企业版、需要管理员开通特殊权限、要接入企业自有服务器、配置周期长。

对于个人使用、或者小团队临时解决问题来说,这条路太重了。

方向三:RPA(机器人流程自动化)

换一个角度想:聊天记录在客户端窗口里都看得到,既然看得到,就能读到。

思路是:程序控制鼠标和键盘,模拟人工翻页的动作,每翻一屏,读取屏幕上显示的消息内容,存入本地数据库。

这个方案的好处:

  • 不需要任何特殊权限,只要你的账号能看到,程序就能采到
  • 不破解、不逆向,行为性质和人工操作一致
  • 随企业微信更新,只需微调定位逻辑,整体稳定性高

最终选了方向三。


核心实现思路

整体流程分几个步骤:

定位聊天窗口
    ↓
模拟翻页(Page Up / 滚轮)
    ↓
截图 + 文字识别(OCR)
    ↓
解析消息结构(发送者、时间、内容)
    ↓
去重写入本地数据库
    ↓
判断是否到达目标位置或已达到截止日期
    ↓
继续下一屏或结束

窗口定位

程序启动时,让用户手动框选企业微信的聊天内容区域(一个拖拽框选的引导界面),把这个坐标记录下来。后续所有翻页、截图操作都基于这个区域。

之所以不自动检测窗口位置,是因为不同用户的屏幕分辨率、企微窗口大小都不一样,手动框选一次,后续复用,最稳。

翻页控制

模拟 Page Up 按键或鼠标滚轮向上滚动。每次翻页之后,等待一个短暂的时间,让内容渲染完成,再截图。

这里有一个坑:企业微信在加载历史消息时,有时候会有 loading 状态(转圈圈),如果翻太快,会截到加载中的空白画面。

解决方式是在每次翻页后检测 loading 状态,如果还在 loading 就等待,直到内容出现再继续。

消息解析

截图之后,用 OCR 把图片转成文字,然后解析出消息结构。

这里最难的是发送者和消息内容的分隔。企业微信的聊天界面,消息是气泡布局,左边是对方消息,右边是自己的消息,发送者名字在气泡上方。

解析策略:

  1. 识别气泡的位置(左/右)来判断是对方还是自己
  2. 识别时间戳的格式(通常是 HH:mm昨天 HH:mm)来分隔不同消息
  3. 识别发送者名字(在消息气泡顶部的灰色小字)

这部分调了很久,对不同的字体大小、系统缩放比例、深色/浅色模式都要做适配。

去重逻辑

因为每次翻页会有一定的内容重叠(上一屏的最后几条,和下一屏的前几条),需要去重。

方案是给每条消息计算一个特征哈希(发送者 + 时间 + 内容前 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 反馈问题或者功能建议。


数据安全说明:工具采集的所有数据只存在本机,不上传任何云端,不联网,不注册账号。你的聊天记录只有你自己看得到。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐