手把手:用 Python + RPA 自动采集企业微信聊天记录,存成 Excel

发布时间:2026/10/7 7:39:00

手把手:用 Python + RPA 自动采集企业微信聊天记录,存成 Excel 手把手用 Python RPA 自动采集企业微信聊天记录存成 Excel本文记录一个实际需求的完整实现过程企业微信没有消息导出功能我用 RPA 的思路绕过这个限制做了一个自动采集工具。背景为什么要做这个公司要复盘一个长期项目需要整理某客户群半年来的聊天记录。企业微信不提供导出官方的消息存档 API 又需要购买增值服务 IT 管理员开通小团队根本用不上。手动复制了一个下午整理了不到两周的记录整理到崩溃。于是动手写了这个工具。技术选型在动手之前我考虑了几条路方案可行性原因读本地数据库不可行数据库加密密钥与账号绑定官方 API不可行需购买增值服务中小团队无法使用抓包不可行自有加密协议解析成本过高RPA界面自动化可行直接操控 UI绕过底层限制最终选择 RPA 方向让程序模拟用户操作自动翻阅企业微信的聊天界面把内容读取出来整理入库。核心实现1. 控制鼠标与键盘使用pyautogui控制鼠标移动、点击和滚轮操作importpyautoguiimporttimedefscroll_up_chat(chat_region,steps5):在聊天区域向上滚动翻出历史消息cxchat_region[x]chat_region[width]//2cychat_region[y]chat_region[height]//2pyautogui.moveTo(cx,cy)for_inrange(steps):pyautogui.scroll(3)# 正数向上time.sleep(0.1)滚动步数和间隔需要根据消息密度动态调整不能写死一个固定值。2. 读取消息内容放弃 OCR改用剪贴板最初试过截图 pytesseractOCR识别率太低尤其是小字和浅色背景。后来发现企业微信的聊天文字本身可以被选中于是改为模拟全选 → 复制直接从剪贴板拿文本准确率接近 100%。importpyperclipimportpyautoguidefcopy_chat_content(chat_region):点击聊天区域全选并复制文本内容cxchat_region[x]chat_region[width]//2cychat_region[y]chat_region[height]//2prevpyperclip.paste()pyautogui.click(cx,cy)time.sleep(0.1)pyautogui.hotkey(ctrl,a)pyautogui.hotkey(ctrl,c)returnwait_for_clipboard_change(prev)defwait_for_clipboard_change(prev_content,timeout3.0):轮询等待剪贴板内容更新starttime.time()whiletime.time()-starttimeout:currentpyperclip.paste()ifcurrent!prev_content:returncurrent time.sleep(0.05)returnprev_content注意这里不能用time.sleep固定等待剪贴板写入因为不同机器性能差异大。轮询检测变化更可靠。3. 解析原始文本从剪贴板拿到的是未结构化的原始字符串格式类似张三 2025/06/01 14:32 好的这个方案我们同意 李四 2025/06/01 14:35 收到我这边明天确认一下 2025/06/01 时间分隔符 王五 2025/06/01 14:40 [撤回了一条消息]用正则按块切割识别每块的类型正常消息、系统提示、时间分隔符importrefromdataclassesimportdataclassfromdatetimeimportdatetimedataclassclassMessage:sender:strtimestamp:datetime content:strTIMESTAMP_PATTERNre.compile(r^\d{4}/\d{2}/\d{2}\s\d{2}:\d{2}(?::\d{2})?$)DATE_SEPARATOR_PATTERNre.compile(r^\d{4}/\d{2}/\d{2}\s*$|^昨天$|^星期[一二三四五六日]$)defparse_raw_text(raw:str)-list[Message]:lines[l.strip()forlinraw.splitlines()]messages[]i0whileilen(lines):linelines[i]ifnotlineorDATE_SEPARATOR_PATTERN.match(line):i1continue# 判断是否是发件人 时间戳 内容三行结构if(i2len(lines)andTIMESTAMP_PATTERN.match(lines[i1])):senderline tsdatetime.strptime(lines[i1],%Y/%m/%d %H:%M)contentlines[i2]messages.append(Message(sender,ts,content))i3else:i1returnmessages这里列出的只是主流程实际还要处理连续消息同一人短时间发多条、撤回消息占位符等边界情况。4. 去重写库本地用 SQLite 存储每次写入前按采集对象 发件人 时间戳 内容做唯一性校验importsqlite3definsert_messages(db_path:str,target:str,messages:list[Message]):connsqlite3.connect(db_path)curconn.cursor()cur.execute( CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, target TEXT, sender TEXT, timestamp TEXT, content TEXT, UNIQUE(target, sender, timestamp, content) ) )formsginmessages:cur.execute( INSERT OR IGNORE INTO messages (target, sender, timestamp, content) VALUES (?, ?, ?, ?) ,(target,msg.sender,msg.timestamp.isoformat(),msg.content))conn.commit()conn.close()INSERT OR IGNORE保证重复运行不会产生重复数据。5. 断点续采历史记录多的群采集时间可能超过十分钟。中途停止后不能从头跑需要断点续采。思路每完成一批采集后把当前已处理到的最早消息时间戳写入本地状态文件下次启动时读取这个时间戳跳过已经入库的时间段。importjson,os STATE_FILEcollect_state.jsondefsave_state(target:str,earliest_ts:str):state{}ifos.path.exists(STATE_FILE):withopen(STATE_FILE)asf:statejson.load(f)state[target]earliest_tswithopen(STATE_FILE,w)asf:json.dump(state,f)defload_state(target:str)-str|None:ifnotos.path.exists(STATE_FILE):returnNonewithopen(STATE_FILE)asf:returnjson.load(f).get(target)整体架构┌─────────────────────────────────┐ │ Electron 前端 (React) │ │ 历史采集 / 定时监控 / 消息列表 │ └──────────────┬──────────────────┘ │ HTTP / SSE ┌──────────────▼──────────────────┐ │ Python 后端 (FastAPI) │ │ 采集控制 / 进度推送 / 数据查询 │ └──────────────┬──────────────────┘ │ ┌──────────────▼──────────────────┐ │ RPA 层 (pyautogui 剪贴板) │ │ 控制企业微信 UI / 读取内容 │ └──────────────┬──────────────────┘ │ ┌──────────────▼──────────────────┐ │ SQLite 本地数据库 │ │ 消息存储 / 去重 / Excel 导出 │ └─────────────────────────────────┘前端用 Electron 封装打包后无需安装 Python 环境解压即用。两种采集模式历史采集一次性把指定联系人或群聊的历史消息全部采集入库支持批量通过 Excel 名单导入目标列表、支持断点续采、支持设置截止日期。定时监控设好采集间隔程序在后台循环运行每次只写入上次采集以来的新消息自动去重无需人工干预。两个模式配合使用先用历史采集打底再开定时监控持续追踪数据库里就有了完整、不间断、无重复的全量记录。已知限制采集期间企业微信界面必须保持可见不能最小化因为程序需要控制界面目前只支持文字消息图片、文件、语音暂不在范围内数据完全本地存储不上传任何服务器开源地址GitHub 地址https://github.com/a605204746/rpa_wxcom_chat_public欢迎 Star 或提 Issue。有类似需求企业微信消息归档、客户群监控的朋友可以直接拿去用也欢迎一起完善。
延伸阅读

更多相关文章

2026/10/7 15:46:38

Linux实训选题:单机版聊天室Socket编程与多线程并发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 15:46:38

ROS2工程化落地:ARM平台实战与DDS通信调优指南

1. 这套ROS2课程到底值不值得花时间啃?先说清楚它能解决什么真问题ROS2机器人应用开发工程师全套视频课程——光看标题,很多人第一反应是“又一套编程课”,但如果你正在做移动机器人、AGV调度系统、服务机器人导航模块,或者刚从RO…

2026/10/7 15:46:38

用了半年大模型,终于总结出这套 context-mode 上下文管理实战方案

你有没有遇到过这种场景:同一个大模型接口,别人调出来像聊天机器人,你调出来像金鱼——聊到第七句就把你第一句说过的话忘得一干二净。或者反过来,你给了模型一堆资料,结果它答非所问,从背景资料里挑了一条…

2026/10/7 15:46:38

marketingskills:基于Agent Skills规范的AI营销技能包实战指南

1. 从"marketingskills"这个命名说起:它到底想解决什么问题第一次看到marketingskills这个项目名,我的直觉是:这不是一个普通的工具库,而是一套"能力封装"。在 AI Agent 生态里,skills这个词最近被…

2026/10/7 15:46:38

AI芯片软硬件协同设计:脉动阵列与Transformer映射实战

1. AI 芯片软硬件协同设计的核心命题1.1 为什么单看硬件或软件都不够做 AI 芯片这行的人有个共识:硬件和软件分开设计,最后大概率要返工。我见过太多团队,硬件组把脉动阵列的面积和频率优化到极致,软件组把算子调度写得漂漂亮亮&a…

2026/10/7 15:41:37

医学图像分割实战:Python+PyTorch实现U-Net与Dice Loss全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑