半天变一分钟:用 RPA 自动化导出企业微信群聊天记录

0 阅读6分钟

半天变一分钟:用 RPA 自动化导出企业微信群聊天记录

标签:Python RPA 桌面自动化 企业微信 pywinauto

目录

问题起源

企业微信是国内最主流的企业即时通讯工具,但它有一个让很多人头疼的设计——不提供聊天记录导出功能

如果你是合规、法务、HR 或者项目经理,你大概率遇到过这样的场景:领导说"把那个群的聊天记录整理一下发我",然后你打开企业微信,开始手动滚动、选中、复制、粘贴……

一个群几千条消息,十几个群就是几万条。Ctrl+A、Ctrl+C、Ctrl+V,一上午就没了。

这种"极度无聊但不得不做"的重复劳动,恰恰是自动化最该解决的问题。

原型如下

img_1.png

技术选型:为什么是 RPA

企业微信没有开放的聊天记录导出 API。这条路堵死了之后,只剩一个选择:RPA(Robotic Process Automation) ——让程序模拟人在桌面客户端上的操作。

┌──────────────┐     ┌─────────────────┐     ┌──────────────┐
│  用户输入     │ ──▶ │  RPA 自动化引擎  │ ──▶ │  企业微信客户端 │
│  群名/参数    │     │  (Python 脚本)   │     │  (被操控对象)  │
└──────────────┘     └────────┬────────┘     └──────────────┘
                              │
                              ▼
                     ┌─────────────────┐
                     │  SQLite + Excel  │
                     │  结构化导出结果    │
                     └─────────────────┘

RPA 方案的优势是绕过了 API 限制。代价是依赖 UI 稳定性——客户端更新可能导致脚本失效。但对于"定期导出"这个场景,ROI 是值得的。

核心实现:四个关键突破

突破一:窗口定位

Windows 下每个窗口都有一个唯一的句柄(Handle),拿到句柄才能在窗口上模拟操作。

企业微信的窗口层级比预期复杂得多——主窗口、子面板、消息列表层层嵌套。直接用 Win32 API 递归遍历虽然可行,但代码量巨大。

后来切换到 pywinauto,它把控件树抽象成了清晰的 API:

主窗口 (WeWorkWindow)
  └── 消息面板 (ChatPanel)
       └── 消息列表 (MessageList)
            └── 消息项 × N

控件树定位比坐标定位稳定得多,而且跨分辨率兼容性更好——这是第一个重要的技术决策。

突破二:消息滚动与 DPI 适配

这是整个项目花时间最多的一环。

方案 1:鼠标拖拽翻页(已废弃)

最初在消息区域底部按住鼠标、拖到中部松开,等效于翻页。自己的 1080p 屏幕上完美运行,换到同事 150% DPI 缩放的笔记本上,坐标全部偏移。

Windows DPI 缩放机制下,程序获取的逻辑坐标和屏幕物理坐标不是线性关系。加上 DPI 换算函数后能跑,但不稳定——不同缩放比例的边界 case 太多。

方案 2:键盘模拟(最终采用)

改为直接发送 PageUp 按键。不依赖任何坐标计算,只要焦点在消息区域内就行。在任何分辨率、任何 DPI 设置下表现一致。

技术启示:能用键盘操作的,尽量别用鼠标坐标。

突破三:消息提取与解析

复制环节的核心问题:企业微信的 Ctrl+A 全选会把搜索栏、工具栏文字也选进来。

最终方案:在消息区域内精确创建拖拽选区,然后 Ctrl+C 获取剪贴板内容。

拿到原始文本后,用正则按 发送人 + 时间 的模式切分:

张三  2024/03/15 14:30:25
项目进度怎么样了?

李四  2024/03/15 14:32:10
前端联调通过了,后端还在修 bug

正则本身不复杂,复杂的是边界场景:

边界情况处理方式
系统通知无发送人匹配特殊前缀("xxx 加入群聊"等)
超长消息被截断调整滚动粒度 + 相邻片段拼接
图片/文件消息识别占位符,记录文件类型元信息
含换行符的多段消息以时间戳为锚点,跨行合并

突破四:可视化坐标选取器

不同电脑、不同企业微信版本,消息区域位置不同。与其让程序猜,不如让用户自己选。

做了一个全屏截图 + 半透明遮罩的区域选择器:

  1. 截取当前屏幕
  2. 用半透明黑色覆盖层铺满全屏
  3. 用户拖拽鼠标框选出消息区域
  4. 程序记录坐标,下次启动自动加载

用 Tkinter 实现,代码量不到 200 行。比让用户手动输入坐标数字,体验上了不止一个台阶。

避坑指南

坑 1:DPI 缩放

上面已经详述。核心经验:优先用键盘操作代替鼠标绝对定位。

坑 2:客户端更新

企业微信某次更新后窗口控件树结构变化,之前硬编码的控件路径全部失效。最终方案是把消息区域识别改成"用户视觉框选 + 程序模板匹配",把适配责任从开发者转移到了更灵活的交互流程上。

坑 3:消息去重

多次采集时同一消息可能被重复导出。用 (群名, 发送人, 时间戳, 内容前 50 字符) 的哈希做去重判断,兼顾准确性和性能。

坑 4:超长消息截断

一次 PageUp 复制的消息量有限。调大滚动窗口可以减少截断,但采集速度会下降。这是一个需要在速度和完整性之间权衡的参数。

最终效果

工具形态:Windows 桌面应用,前端用 React + Ant Design,通过 pywebview 嵌入 Python 后端。

操作流程:

  1. 输入要采集的群名(支持批量导入名单)
  2. 设置采集范围(按日期 / 按消息条数 / 按翻页次数)
  3. 点击开始,自动执行搜索 → 滚动 → 复制 → 解析
  4. 存入 SQLite,支持预览、搜索、导出 Excel

效果对比:

指标手工操作工具自动化
10 个群采集耗时~4 小时~8 分钟
遗漏/重复率~15%<2%
是否需要值守全神贯注点完按钮放着就行
数据格式手动整理结构化 Excel

写在最后

这个工具叫「企微聊天记录导出器」,目前有免费版和 Pro 版。免费版开放全部采集功能,Pro 版解锁明文导出。

Windows 开箱即用,不需要安装 Python 环境。

📦 下载地址gitee.com/shendudian/…

如果你也在做桌面端 RPA 或者有类似的自动化需求,欢迎在 Gitee 上提 Issue 交流。踩过的坑希望别人不用再踩一遍。