Python uiautomation实现微信消息自动监控与提醒
1. 为什么需要微信消息自动监控每天工作的时候最烦的就是不断弹出的微信消息。频繁切换窗口查看消息不仅打断工作思路还严重影响效率。但完全不看又怕错过重要信息这种矛盾相信很多人都遇到过。我去年接手了一个需要高度专注的项目期间尝试过各种方法关闭通知、设置免打扰、甚至退出微信。但要么错过老板消息要么被同事抱怨回复慢。直到发现Python的uiautomation库这个问题才真正解决。uiautomation是Windows平台上的GUI自动化神器能直接操作各种窗口控件。相比其他方案它有三大优势无需微信API不用申请开发者权限不违反微信使用条款实时性高直接读取界面元素延迟控制在秒级扩展性强既能监控也能自动回复一套代码全搞定2. 环境准备与基础配置2.1 安装必备工具先确保你的环境符合这些要求Windows 10/11系统Mac/Linux不支持Python 3.7推荐3.9微信Windows版3.9.5建议更新到最新版打开cmd/powershell执行pip install uiautomation plyerplyer是用来做桌面通知的库比win10toast更稳定。我测试过十几个通知方案这个在Win11上兼容性最好。2.2 微信窗口结构解析用UISpy工具随uiautomation安装查看微信窗口结构主窗口ClassNameWeChatMainWndForPC会话列表Name会话的ListControl消息区域Name消息的ListControl关键点在于识别X条新消息的控件特征。实测发现不同微信版本可能有差异建议先用UISpy确认自己电脑上的控件结构。3. 核心代码实现详解3.1 消息检测逻辑def check_wechat_messages(): wechat_win auto.WindowControl(Name微信, ClassNameWeChatMainWndForPC) session_list wechat_win.ListControl(Name会话) for chat_item in session_list.GetChildren(): if 条新消息 in chat_item.Name: # 使用正则提取昵称和消息数 match re.match(r(.?)(\d)条新消息, chat_item.Name) if match: nickname match.group(1).strip() message_count int(match.group(2)) print(f发现新消息{nickname} {message_count}条)这里有几个坑要注意昵称可能包含emoji或特殊符号建议用.strip()处理部分版本显示1条新消息有些显示新消息1条正则要兼容微信多开时需要用Depth3指定窗口层级3.2 桌面通知系统from plyer import notification notification_history {} def send_notification(nickname, message, count): current_time time.time() # 15秒内相同消息不重复提醒 if (nickname, count) in notification_history: if current_time - notification_history[(nickname, count)] 15: return notification.notify( titlef{nickname} 发来{count}条消息, messagemessage[:200], # 限制长度避免崩溃 app_name微信监控, timeout10 # 通知显示时长 ) notification_history[(nickname, count)] current_time我踩过的坑消息内容过长会导致通知崩溃必须截断不加防重复机制会疯狂弹窗Win11需要设置app_name才会显示正确图标4. 高级功能扩展4.1 关键词优先提醒在循环检测中加入优先级判断priority_keywords [紧急, 老板, 今晚发布] for msg in get_new_messages(): if any(keyword in msg for keyword in priority_keywords): notification.notify(title【重要】title, messagemsg) play_sound(alert.wav) # 添加声音提醒4.2 自动回复功能auto_reply_rules { 在忙: 正在会议中2小时后回复, 快递: 放前台快递柜谢谢 } def handle_auto_reply(): last_msg get_last_message() for keyword, reply in auto_reply_rules.items(): if keyword in last_msg: click_reply_button() # 点击回复按钮 type_message(reply) # 模拟键盘输入 press_enter() # 发送消息 break注意自动回复不要太频繁建议加上时间间隔判断避免被微信限制。5. 性能优化与稳定性5.1 降低CPU占用原始方案每2秒扫描一次窗口我优化后的版本last_state {} while True: current_state get_window_state() if current_state ! last_state: # 只有状态变化时才处理 process_messages() last_state current_state time.sleep(5) # 检查间隔延长到5秒实测CPU占用从3%降到0.5%笔记本风扇再也不狂转了。5.2 异常处理机制必须捕获这些常见异常try: wechat_win auto.WindowControl(searchDepth3) except auto.ControlNotFoundError: print(微信窗口未找到请先登录) except Exception as e: logging.error(f监控出错{str(e)}) send_alert_email(微信监控异常) # 邮件通知管理员建议添加窗口最小化检测if wechat_win.IsMinimized: wechat_win.Show() # 先恢复窗口才能操作6. 实际应用案例去年我给财务部门部署的这个方案他们需要实时处理供应商的付款确认。改造后的工作流收到含付款字样的消息时自动高亮提醒识别消息中的金额和账号自动填入内部系统处理完成后自动回复已处理原本需要专人盯着微信现在每天节省3小时人工。有几个实用建议对群消息特别处理加上群名标识重要消息自动截图存档夜间模式可以降低检测频率最近发现微信新版增加了无障碍接口可能未来会有更优雅的实现方式。不过目前这个方案在我们公司跑了半年多稳定性相当不错。关键是要定期检查微信版本更新及时调整控件定位逻辑。