| name | wechatdaily |
| description | 微信群聊/私聊聊天记录导出(Windows)。先在微信里自动快速向上滚动把指定时间段的历史加载出来,再抽取去重写成 Markdown。触发词:导出、导出群聊、导出聊天记录、把xx群从…导出、wechat 导出、export wechat。例如「导出 My Group 从昨天9点到现在」「把 张三 从5月30日13:00导出」。不含导出意图不触发。 |
wechatdaily — 微信导出技能(Windows)
用鼠标滚轮快速上滚加载微信聊天历史,再抽取去重导出为 Markdown。相比逐条 PageUp 的经典方式,大群导出快很多。
技能目录内文件:fast_export.py(快速滚动导出 worker)、wechat_exporter.py(导出引擎)、config.py(读 .env)。命令都在本技能目录内用相对路径执行。
结果日志:logs/fast_export.log(成功以 RESULT_OK 收尾)。
前提(首次务必确认)
- 微信 PC 版 3.9.12.x(窗口类
WeChatMainWndForPC)。请勿升级微信,高版本 UI 结构变化会失效。
- Python 3.11;已在技能目录执行
pip install -r requirements.txt。
- 普通权限即可,无需管理员 / UAC。
- 运行时脚本会接管几下按键 / 滚轮,提醒用户保持微信在前台、别动鼠标键盘(前台必须是微信,按键 / 滚轮才落得进去)。
关键技术点(实测结论,反直觉)
- 搜进群聊用 pywinauto
send_keys 逐字符发中文群名(Ctrl+F 打开搜索 → send_keys 群名 → 回车进第一个结果),基于 KEYEVENTF_UNICODE,不依赖输入法,中文不会被挡。别用剪贴板 + Ctrl+V(后台进程里 tkinter 剪贴板是延迟渲染,会取到空)。若用户已手动打开目标聊天,worker 自动跳过导航(更快)。
- 只用鼠标滚轮上滚(约 3 聊天小时/秒);PageUp 基本无效(加载不动)。
- 判断是否滚到起点只读列表顶部约 12 项找最早时间(O(1),约 45ms),不做全树遍历,几千条的大群也不卡。
- 微信会把已加载消息保留在 UIA 树里(滚出屏的元素带巨大负 y 坐标),所以「先滚动加载、再一次性抽取」可行。
参数与默认值
--group:聊天名(群名或联系人显示名),必须和微信顶部标题能对上(worker 会校验,不符立即中止,绝不碰别的聊天)。
--start:起始时间 YYYY-MM-DD HH:MM:SS。把用户的自然语言(「昨天9点」「5月30日13:00」)解析成绝对时间。
- 不给
--start 时自动「接上次」:worker 扫本地 exports/ 里该群上次导出的最大结束时间当本次开始,无缝衔接。用户没明确给开始时间时默认走这条,不要自己瞎填。
- 跑前先用
--show-last 查一下并告诉用户「上次导到 X,这次从 X 接着导」:python fast_export.py --group "<群>" --show-last(只查不导,输出 LAST_EXPORT ... / NEXT_START=... 或 NO_PRIOR_EXPORT)。
- 若
NO_PRIOR_EXPORT(该群本地没历史导出):worker 会报错退出;需要让用户给一个明确开始时间。
--end:结束时间,默认 = 现在 − 2 小时(省略 --end 即可)。用户明确说「到现在」可按需给 now。
--max-scroll:最大上滚轮数,默认 2000;到顶会自动提前停(活跃大群可能需要上千轮)。
--check-every:每隔几轮打印一次进度,默认 4。
执行流程(你要做的)
- 解析用户指令 → group / (start) / (end)。用户没给开始时间时:先跑
--show-last 拿「接上次」的起点(NEXT_START)用于确认;正式跑时省略 --start 让 worker 自己衔接。
- 和用户确认一条参数:列出 group、start(注明「接上次导出结束 X」或用户指定)、end;提示「保持微信前台、别动鼠标键盘」。
- 启动 worker(普通后台跑,无需提权):
python fast_export.py --group "<群名>" [--start "<...>"] [--end "<...>"]
省略 --start = 接上次导出结束;自定义结束加 --end。worker 自己 tee 到 logs/fast_export.log。
- 轮询日志等结束:grep
RESULT_OK|SAFETY ABORT|ABORT:|Traceback|Could not,命中即结束。大群滚动可能数分钟。
- 读
logs/fast_export.log:报告 OPENED CHAT TITLE(确认对了聊天)、是否 REACHED start / 耗时、WROTE N messages、导出文件路径。
- 若
SAFETY ABORT(打开的不是目标聊天):不重试乱猜,让用户确认群名 / 手动打开目标聊天后重试。若这是「按顺序导出多个群」中的一个,立刻停整批,别接着跑下一个(见下)。
多群按顺序导出(铁律)
当用户说「按顺序导出 A、B、C…」时:
- 严格串行:必须第一个完整成功(读到
RESULT_OK 且确认是目标聊天)才开始第二个,以此类推。
- 任何原因停了就停整批:第一个若
SAFETY ABORT / 报错 / 用户喊停 / 任何异常,绝对不许为了省时间先开下一个。先回报用户、按其指示把当前这个解决(如焦点问题切前台重试、确认群名、手动打开),跑通后再继续后续的群。
- 为什么:顺序是用户的明确意图;常见的「安全中止」多是焦点 / 前台问题,下一个大概率同样失败,并行只会制造混乱。
常见「安全中止」= 焦点问题
最常见症状是打开的不是目标群、而是当前会话——多半是运行时焦点问题:微信不在前台,或运行时用户在动鼠标键盘,send_keys 没落进搜索框。处理:让用户把微信切到前台后别动鼠标键盘,原样重试即可;或让用户手动点开目标群(worker 自动跳过搜索)。别因此乱改群名或盲目重试。
安全红线
- 顶部标题不匹配目标聊天 → worker 自动中止;不要绕过。
- 绝不在非目标聊天里滚动 / 抓取。
- 导出结果仅写入本地
exports/,本技能不包含任何上传 / 外发功能。
调参(首次 / 大群)
- worker 默认
--max-scroll 2000、每轮用便宜读校验最早时间;到顶判定 = 连续约 30 轮无进展且已无「查看更多消息」按钮。
- 首次在新群上用短范围(如最近 2–3 小时)验证产物与速度,再上大范围。
- 若太慢 / 漏消息:调
--max-scroll、或在 fast_export.py 里调滚轮 wheel_dist / sleep(PageUp 实测无效,别用)。