查看: 110|回复: 0

Python微信自动化wxauto窗口识别失败与消息重复读取去重处理实战

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
微信自动化常见于自动回复、消息监听和定时通知。网页版微信接口下线后,老教程里的itchat方案已经不能直接扫码登录,wxpy也因依赖itchat而失效。本文围绕Windows客户端GUI自动化的wxauto,说明方案差异、环境准备、三个基础代码示例,以及窗口识别、消息去重、发送频率等高频问题。需要先明确:wxauto不是官方API,而是依赖PC微信窗口控件模拟,稳定性和风险都由客户端UI与使用场景决定。

方案选型
itchat底层是网页微信API,微信官方已下线网页版登录入口,新项目不要再使用。wxpy同样封装网页微信并依赖itchat,一并淘汰。wxauto走Windows微信客户端GUI自动化,读取窗口控件、模拟发送消息,不需要网页版,也不需要抓包逆向;优点是上手简单、API友好,缺点是仅支持Windows,必须保持微信客户端打开,部分版本不能最小化到托盘,发送太快会触发限制。企业微信API或第三方封装机器人适合正规业务通知,稳定合规,是生产环境首选。逆向Hook、DLL注入、协议逆向能力最强,但难度极高且封号风险大,不推荐个人尝试。个人学习在Windows平台可选wxauto,正式业务通知优先企业微信官方API,itchat直接放弃。

环境准备:Windows系统安装PC版微信,原文推荐3.9版本,过高版本可能控件识别失败;Python 3.8+;安装命令为 pip install wxauto。微信自动更新后UI控件ID会变化,wxauto可能失效,突然报找不到窗口时可降级微信或等待wxauto适配更新。

基础代码示例
示例1发送私聊消息:
  1. from wxauto import WeChat
  2. import time
  3. # 初始化微信对象,会自动寻找打开的微信窗口
  4. wx = WeChat()
  5. # 打开好友聊天窗口
  6. who = '文件传输助手'
  7. wx.ChatWith(who)
  8. # 发送文本消息
  9. wx.SendMsg('Hello,这是Python微信自动化测试消息')
  10. time.sleep(0.5)
  11. wx.SendMsg('第二行消息测试')
  12. # 发送文件
  13. # wx.SendFiles(r'C:test.txt')
复制代码

代码中先创建WeChat实例,再通过ChatWith切换到指定好友,SendMsg发送文本。原文用文件传输助手作示例,发送文件调用被注释;实际路径需按本机文件位置填写。

示例2监听消息并简单自动回复:
  1. from wxauto import WeChat
  2. import time
  3. wx = WeChat()
  4. # 加载聊天记录缓存,可选
  5. wx.LoadSessionList()
  6. # 监听目标好友
  7. listen_user = '文件传输助手'
  8. wx.ChatWith(listen_user)
  9. print(f'开始监听【{listen_user}】消息,按Ctrl+C终止程序')
  10. # 记录已读取消息,防止重复回复
  11. msg_id_set = set()
  12. try:
  13.     while True:
  14.         # 获取当前窗口最新消息
  15.         msgs = wx.GetSessionList()
  16.         for msg in msgs:
  17.             sender, content = msg.sender, msg.content
  18.             msg_key = f'{sender}{content}'
  19.             if msg_key in msg_id_set:
  20.                 continue
  21.             msg_id_set.add(msg_key)
  22.             # 过滤自己发的消息
  23.             if sender == 'self':
  24.                 continue
  25.             print(f'收到消息:{sender} -> {content}')
  26.             # 简单自动回复逻辑
  27.             if '你好' in content:
  28.                 wx.SendMsg('你好!我是自动机器人,仅测试使用。')
  29.             elif '时间' in content:
  30.                 wx.SendMsg(f"当前时间:{time.strftime('%Y-%m-%d %H:%M:%S')}")
  31.         time.sleep(1)
  32. except KeyboardInterrupt:
  33.     print('程序退出')
复制代码

这段代码的关键点是:用msg_id_set保存已处理消息的sender与content组合,进入循环先判断是否重复;sender为self时跳过自己发送的消息;每轮循环后sleep 1秒,避免空转和发送过快。原文用该结构演示自动回复,实际使用时可把回复规则替换成自己的提醒逻辑。

示例3群消息读取:
  1. from wxauto import WeChat
  2. wx = WeChat()
  3. # 切换到群聊窗口
  4. wx.ChatWith('测试群聊名称')
  5. msgs = wx.GetSessionList()
  6. for msg in msgs:
  7.     print(f'【{msg.sender}】:{msg.content}')
复制代码

核心API
WeChat()创建微信实例并连接已打开的微信窗口;ChatWith(name)切换到好友或群聊窗口;SendMsg(text)发送文本消息;SendFiles(path)发送文件或图片;GetSessionList()获取当前会话消息列表;LoadSessionList()加载会话列表缓存。理解这些方法后,示例代码的结构并不复杂,难点主要在窗口状态、版本兼容和消息去重。

高频踩坑
坑1:找不到微信窗口,报WindowNotFound。常见原因是微信版本太高、控件结构变动导致wxauto不支持;或者微信最小化到托盘、窗口隐藏,GUI自动化无法识别。处理时保持微信窗口打开,不要托盘最小化;必要时降级微信到适配版本。
坑2:消息重复读取,出现无限循环回复。原因是每轮循环重复读取历史消息,没有做消息去重。处理方式是维护消息唯一标识集合,已经处理过的消息直接跳过。示例2中的msg_id_set就是这种思路。
坑3:发送消息过快,微信限制或消息丢失。不要写死循环疯狂发送,必须加time.sleep,原文建议间隔至少0.5~2秒;短时间高频发送容易触发风控。
坑4:不能后台静默运行。wxauto本质是GUI模拟,依赖Windows窗口句柄,微信窗口被遮挡、最小化到托盘都可能失效。想要无窗口后台方案,wxauto做不到,需要协议逆向,风险极大。
坑5:好友或群名称必须完全匹配。ChatWith的名字必须和微信备注一字不差,不能依赖模糊搜索。

风控与合规
wxauto不是官方API,任何自动化行为都有风控风险。禁止批量群发广告、营销引流,微信检测到可能封号;不要多账号循环登录、短时间大量拉人、批量加好友;个人号尽量少用自动回复机器人长时间在线,更容易触发检测。相对安全的使用场景包括定时给自己或文件传输助手推送服务器告警、日志提醒,以及个人简单消息提醒、家庭内部通知。群内批量自动营销引流、批量加好友、批量点赞、爬虫抓取大量用户隐私信息都属于禁止场景。原文的重要声明也需要保留:技术仅用于个人学习、私域提醒、消息通知等非营销场景,利用该技术发送垃圾广告、批量骚扰、恶意引流违反《微信用户协议》,存在账号封禁风险。

进阶方向
可结合schedule做定时任务,每日定时推送消息;接入大模型API,在收到消息后调用LLM生成回复;用pytesseract识别图片消息内容;如果是正规业务场景,迁移到企业微信官方API,完全规避个人号封号风险。总体上,网页版itchat时代已经结束,wxauto适合个人在Windows上学习GUI自动化,但使用场景决定风险,不能拿来做营销骚扰。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-19 13:01 , Processed in 0.026431 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部