半天变一分钟:用 RPA 自动化导出企业微信群聊天记录
标签:
PythonRPA桌面自动化企业微信pywinauto
目录
问题起源
企业微信是国内最主流的企业即时通讯工具,但它有一个让很多人头疼的设计——不提供聊天记录导出功能。
如果你是合规、法务、HR 或者项目经理,你大概率遇到过这样的场景:领导说"把那个群的聊天记录整理一下发我",然后你打开企业微信,开始手动滚动、选中、复制、粘贴……
一个群几千条消息,十几个群就是几万条。Ctrl+A、Ctrl+C、Ctrl+V,一上午就没了。
这种"极度无聊但不得不做"的重复劳动,恰恰是自动化最该解决的问题。
原型如下
技术选型:为什么是 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 加入群聊"等) |
| 超长消息被截断 | 调整滚动粒度 + 相邻片段拼接 |
| 图片/文件消息 | 识别占位符,记录文件类型元信息 |
| 含换行符的多段消息 | 以时间戳为锚点,跨行合并 |
突破四:可视化坐标选取器
不同电脑、不同企业微信版本,消息区域位置不同。与其让程序猜,不如让用户自己选。
做了一个全屏截图 + 半透明遮罩的区域选择器:
- 截取当前屏幕
- 用半透明黑色覆盖层铺满全屏
- 用户拖拽鼠标框选出消息区域
- 程序记录坐标,下次启动自动加载
用 Tkinter 实现,代码量不到 200 行。比让用户手动输入坐标数字,体验上了不止一个台阶。
避坑指南
坑 1:DPI 缩放
上面已经详述。核心经验:优先用键盘操作代替鼠标绝对定位。
坑 2:客户端更新
企业微信某次更新后窗口控件树结构变化,之前硬编码的控件路径全部失效。最终方案是把消息区域识别改成"用户视觉框选 + 程序模板匹配",把适配责任从开发者转移到了更灵活的交互流程上。
坑 3:消息去重
多次采集时同一消息可能被重复导出。用 (群名, 发送人, 时间戳, 内容前 50 字符) 的哈希做去重判断,兼顾准确性和性能。
坑 4:超长消息截断
一次 PageUp 复制的消息量有限。调大滚动窗口可以减少截断,但采集速度会下降。这是一个需要在速度和完整性之间权衡的参数。
最终效果
工具形态:Windows 桌面应用,前端用 React + Ant Design,通过 pywebview 嵌入 Python 后端。
操作流程:
- 输入要采集的群名(支持批量导入名单)
- 设置采集范围(按日期 / 按消息条数 / 按翻页次数)
- 点击开始,自动执行搜索 → 滚动 → 复制 → 解析
- 存入 SQLite,支持预览、搜索、导出 Excel
效果对比:
| 指标 | 手工操作 | 工具自动化 |
|---|---|---|
| 10 个群采集耗时 | ~4 小时 | ~8 分钟 |
| 遗漏/重复率 | ~15% | <2% |
| 是否需要值守 | 全神贯注 | 点完按钮放着就行 |
| 数据格式 | 手动整理 | 结构化 Excel |
写在最后
这个工具叫「企微聊天记录导出器」,目前有免费版和 Pro 版。免费版开放全部采集功能,Pro 版解锁明文导出。
Windows 开箱即用,不需要安装 Python 环境。
📦 下载地址:gitee.com/shendudian/…
如果你也在做桌面端 RPA 或者有类似的自动化需求,欢迎在 Gitee 上提 Issue 交流。踩过的坑希望别人不用再踩一遍。