1、立项背景和目标
在社群电商和社区团购业务中,运营人员需要每天在固定时间(如午餐前、晚餐前)向多个微信群发送营销消息(如当日菜单、限时优惠、接龙提醒等)。实际操作中,运营人员需要逐个打开微信群、复制消息内容、粘贴发送,整个过程重复性高、耗时且容易遗漏。如果团队管理数十个群,每次群发需要15-30分钟,且必须准时操作,占用大量人力。此外,远程桌面场景下微信窗口的激活和焦点获取存在技术难题,普通自动化脚本在远程断开重连后容易失效。本项目的核心目标是:构建一个Windows桌面自动化工具,实现微信消息的定时批量群发——用户只需配置群列表和发送时间,工具自动在指定时间激活微信、搜索群、粘贴消息并发送,全程无人值守。
2、软件功能、核心功能模块的介绍
工具涵盖以下核心模块:定时调度引擎——基于schedule库实现多时间点注册,支持配置多个发送时间(如午餐11:30、晚餐17:00),到点自动触发批量发送;配置文件动态加载——支持多套独立配置(如config_lunch.py、config_dinner.py),不同时段发送不同内容和群列表,通过命令行参数灵活切换;微信窗口强制激活——通过win32gui+pyautogui组合,实现远程桌面环境下窗口的可靠前置,解决了SetForegroundWindow在远程会话中的权限限制问题;搜索与切换群——模拟Ctrl+F搜索、Ctrl+A全选删除、粘贴群名、回车打开群聊的完整流程,支持任意群名;消息发送——支持普通文本和@所有人两种模式(消息以@all@开头则自动@所有人);消息动态生成——支持在配置文件中定义get_message()函数,每次发送时动态生成消息内容(如包含当天日期、实时库存等)。
3、业务流程、功能路径描述
用户创建配置文件(如config_lunch.py),配置GROUP_NAMES群列表、SCHEDULE_TIMES发送时间、get_message()消息生成函数 → 双击运行脚本并传入配置名(如python main.py config_lunch)→ 工具启动,注册定时任务 → 到设定时间(如11:30)自动触发batch_send()→ 工具激活微信窗口(强制置顶+模拟点击标题栏)→ 按Ctrl+F打开搜索框 → 清空搜索框 → 粘贴第一个群名 → 按回车打开群聊天窗口 → 点击输入框获取焦点 → 粘贴消息内容(若以@all@开头则先输入@并回车再粘贴正文)→ 按回车发送 → 记录成功日志 → 等待2-4秒后处理下一个群 → 全部发送完成后等待下一个定时点。工具持续运行,支持多轮定时任务。
1、整体架构和设计思路,不同模块使用的技术栈
项目采用模块化分层设计,技术栈为Python 3 + Windows GUI自动化库。配置层:每个业务场景独立创建配置文件(如config_lunch.py、config_dinner.py),包含群列表、发送时间、消息生成函数三要素,通过__import__()动态加载,实现一核多配。窗口管理层:使用win32gui库操作Windows窗口句柄(FindWindow、SetWindowPos、SetForegroundWindow、ShowWindow、GetWindowRect),实现微信窗口的定位、恢复、置顶和坐标获取;核心创新是通过"临时置顶+模拟点击标题栏"的组合方案,解决远程桌面环境下SetForegroundWindow失效的业界难题。输入模拟层:使用pyautogui库模拟鼠标点击和键盘输入(点击坐标、热键Ctrl+F/Ctrl+V/Ctrl+A、Press回车等),结合pyperclip实现中文内容的可靠粘贴(避免typewrite逐字输入中文的不可靠性和低效率)。调度层:使用schedule库实现秒级精度的定时任务注册,主循环每30秒检查一次待执行任务。
2、"我"的负责模块和结果(尽可能量化)
(请根据实际情况替换) 本人独立完成该项目的全流程开发与测试,包括:窗口激活核心函数(约80行 关键代码)、配置文件动态加载机制、消息发送全链路封装、定时调度框架、5套 不同时段的配置文件(午餐/晚餐/宵夜/早安/促销)。项目实现了:单次群发 20-50个 群,总耗时从 手工操作约15-30分钟 压缩至 2-3分钟 ,效率提升约 85%以上 ;窗口激活成功率从普通方案的 约60%(远程桌面场景)提升至 95%以上 ;连续运行_30天_ 无需人工干预的稳定性验证。工具已在实际社区团购业务中运行超过 3个月 。
3、"我"遇到的难点、坑,和解决方案
难点一:远程桌面场景下SetForegroundWindow失效。 Windows系统出于安全考虑,远程桌面会话中非前台进程调用SetForegroundWindow会被静默忽略(即使窗口已找到),导致自动化脚本无法将微信窗口激活到前台。解决方案:采用多步骤强制激活策略——先恢复最小化窗口(ShowWindow SW_RESTORE),再通过SetWindowPos设置HWND_TOPMOST临时置顶突破层级限制,调用SetForegroundWindow后立即取消置顶;最关键的一步是模拟点击窗口标题栏(通过GetWindowRect获取窗口坐标,点击左上角偏移15,15),这个操作会触发窗口消息循环,将焦点强制转移到目标窗口,彻底绕过远程会话的权限限制。
难点二:中文输入在GUI自动化中不可靠。 pyautogui的typewrite()不支持中