wxauto微信自动化终极上手:从环境搭建到写出一个能自动回复的机器人
wxauto微信自动化终极上手:从环境搭建到写出一个能自动回复的机器人
【免费下载链接】wxautoWindows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人项目地址: https://gitcode.com/gh_mirrors/wx/wxauto
如果你有一台 Windows 电脑、装了微信,又想让某些重复操作自己跑起来——比如定时群发、自动回复、把聊天记录存下来——那么wxauto大概是目前最省事的 Python 方案。它直接控制Windows 版微信客户端(非网页版),能收发消息、管理联系人、传输文件,足够支撑一个"简单微信机器人"。这篇文章会带着你从零开始:先花几分钟装上环境,跑通第一个发送消息的 Demo,再一步步理解它背后是怎么工作的,最后落地一个真实的自动回复机器人。全程没有复杂的网络协议,只有"替你操作桌面"这一件事。
准备三步走:wxauto框架安装教程(含环境要求)
wxauto 挑环境,先对照下面这张表看看自己是否满足:
| 依赖项 | 要求 | 说明 |
|---|---|---|
| 操作系统 | Windows 10 / 11 / Server 2016+ | 底层依赖 Windows 原生自动化接口,Linux/macOS 用不了 |
| 微信客户端 | 3.9.X 版本 | 代码里写明的目标版本为3.9.11.17,版本差太远控件会找不到 |
| Python | 3.9 及以上 | 官方声明支持>=3.8, <=3.15 |
安装有两种常见姿势,选一个即可:
# 方式一:直接装 PyPI 上的包 pip install wxauto # 方式二:从源码开始(仓库地址) git clone https://gitcode.com/gh_mirrors/wx/wxauto cd wxauto pip install -e .装的时候 pip 会自动带上几个关键依赖:pywin32(调 Windows API)、pyperclip(操作剪贴板)、comtypes(COM 接口)、pillow、psutil等。这些库就是后面所有自动化操作的"手脚"。
装好之后,把微信 PC 客户端登录好、保持在前台运行,就能开始写第一行代码了。
5 分钟跑通第一个 Demo:给"文件传输助手"发条消息
打开任意 Python 文件(或直接进交互式终端),敲下这段代码:
from wxauto import WeChat # 初始化微信实例:会找到已登录的微信主窗口并解析界面结构 wx = WeChat() # 给"文件传输助手"发一条消息 wx.SendMsg("你好,这是 wxauto 的第一次发言", who="文件传输助手") # 读取当前聊天窗口的消息 msgs = wx.GetAllMessage() for msg in msgs: print(f"{msg.sender}: {msg.content}")逐行理解一下:
WeChat()做了两件重要的事:找到类名是WeChatMainWndForPC的主窗口,然后把窗口划分成导航栏、会话列表、聊天框三个区域,并把每个区域里的关键控件(搜索框、消息列表、头像等)都缓存成属性,后续操作都是在这三个区域里"点来点去"。SendMsg(msg, who=...)先自动帮你切换到目标聊天窗口,再模拟真实的粘贴+回车发送。GetAllMessage()返回的是一个Message对象列表,每条消息都有sender(发送者)和content(内容)等属性,直接遍历就能用。
跑完这段,微信里"文件传输助手"应该已经收到消息了,控制台也打印出了当前窗口的聊天记录。到这里,wxauto 微信自动化的第一公里已经走完,比想象中简单得多。
进阶第一课:聊天记录是怎么被"读"出来的
想写出靠谱的机器人,得先知道GetAllMessage()返回的消息长什么样。每个Message对象有两个最核心的属性:
attr:消息的来源属性,取值有system(系统)、time(时间)、tickle(拍一拍)、self(自己发的)、friend(好友/群友发的)、other。type:消息的内容类型,取值有text、quote(引用)、voice、image、video、file、location、link、emotion(表情)、merge(合并转发)、personal_card(名片)、note(笔记)、other。
两者组合起来,就覆盖了几乎全部微信消息形态。举例来说:
| 判断写法 | 含义 |
|---|---|
msg.attr == 'friend' | 是好友发来的消息 |
msg.type == 'image' | 是图片消息 |
msg.attr == 'friend' and msg.type == 'text' | 好友发来的文本消息 |
针对不同类型,Message对象还提供了对应的操作能力:图片/视频/文件可以msg.download()下载到本地,语音可以msg.to_text()转文字,链接能msg.get_url()取地址,笔记能msg.to_markdown()转成 Markdown 文件。详细的类继承关系和方法清单,可以翻看官方文档里的 docs/class/Message.md。
它到底是怎么识别消息类型的?这是 wxauto 里最巧妙的部分。微信聊天列表里的每一条消息,本质上都是界面上的一个控件(ListItemControl)。wxauto 在_split方法里做了两件事:
- 按控件高度分类:系统消息高 33 像素、时间消息高 34 像素、撤回消息高 45 像素,直接用
BoundingRectangle.height()比对就能区分开; - 按头像位置分类:拿消息控件的水平中线做参照,发送者头像在中线左边就是好友消息,在右边就是自己发的消息。
至于"哪些是新消息",靠的是消息 ID 去重——每条消息控件有一个RuntimeId,wxauto 记录上一次见过的 ID 列表,和当前列表一对比,多出来的就是新消息。这就是GetNextNewMessage()、GetAllNewMessage()的工作原理。
写出第一个微信自动回复机器人:监听 + 回调
掌握了消息读取,就可以动手做一个真正"活着"的机器人了。官方示例docs/example.md给了完整的骨架,核心就三个 API:添加监听 → 注册回调 → 保持运行。
from wxauto import WeChat from wxauto.msgs import FriendMessage wx = WeChat() # 消息处理函数:每来一条新消息都会自动调用 def on_message(msg, chat): # 1. 把消息内容追加到本地日志 with open('msgs.txt', 'a', encoding='utf-8') as f: f.write(msg.content + '\n') # 2. 图片和视频自动存下来 if msg.type in ('image', 'video'): print(msg.download()) # 3. 好友消息自动回复"收到"(引用式回复) if isinstance(msg, FriendMessage): msg.quote('收到') # 监听"张三"的聊天窗口,新消息交给 on_message 处理 wx.AddListenChat(nickname="张三", callback=on_message) # 阻塞运行,保持机器人不退出 wx.KeepRunning()这段代码背后其实藏着一个关键机制:监听是"开小窗"实现的。AddListenChat()会把目标聊天单独弹出一个ChatWnd独立窗口,机器人轮询这个窗口里的新消息;回调函数on_message接收msg(消息对象)和chat(对应的聊天窗口对象)两个参数。不需要的时候,wx.RemoveListenChat(nickname="张三")就能摘掉监听。
到这里,"微信自动回复机器人怎么写"这个问题已经有了标准答案:读消息 → 判断类型 → 按规则回复。在此基础上加个关键词匹配、接个 AI 接口,就是一个能对外服务的完整机器人了。
实战场景扩展:文件、群聊、好友申请、自动登录
机器人能跑通之后,剩下的就是按场景组合 API。这里挑四个高频需求给出现成写法。
场景一:发送文件(支持多个)
# 单个文件 wx.SendFiles("D:/report.pdf", who="张三") # 批量文件 wx.SendFiles(["D:/a.pdf", "D:/b.docx"], who="张三")原理上,发送文件走的是"复制文件列表到剪贴板 → 粘贴 → 回车"的路径,所以传参必须给绝对路径,路径不存在会直接返回失败提示。
场景二:群内 @ 与打字机模式
# @所有人,并附带消息 wx.AtAll("本周五下午开会", who="项目群") # 打字机模式:模拟逐字输入,更接近真人 wx.SendTypingText("各位好:\n{@张三} 请负责前端\n{@李四} 请负责后端", who="项目群")SendTypingText支持用{@昵称}的占位符在群聊里指定 @ 对象,配合\n换行,能组合出很像真人在打字的效果。
场景三:处理好友申请
newfriends = wx.GetNewFriends() for friend in newfriends: friend.accept(remark=f"备注_{friend.name}", tags=['同学', '技术群'])返回的每个好友申请对象都带accept()方法,可以一次性设置备注名和标签,适合运营账号批量处理好友请求。
场景四:自动登录与多开
from wxauto import LoginWnd, get_wx_clients, get_wx_logins # 指定微信 exe 路径,拉起登录窗口 loginwnd = LoginWnd("D:/path/to/WeChat.exe") qrcode_path = loginwnd.get_qrcode() # 拿到二维码图片路径 loginwnd.login() # 等扫码后完成登录 clients = get_wx_clients() # 获取所有已登录的微信客户端 login_windows = get_wx_logins() # 获取所有登录窗口这套组合拳意味着:机器人可以在机器上自动拉起微信、输出登录二维码,等待扫码后自动接管,甚至能管理多个微信客户端的登录窗口。创建群聊(AddGroupMembers+ManageGroup)、合并转发(multi_select+MergeForward)等更多能力,都在官方文档 docs/example.md 里有完整示例。
那些踩过的坑与避坑清单
自动化跑得再欢,也绕不开桌面应用固有的坑。把这些提前记好,能省下大量排错时间:
| 坑 | 表现 | 对策 |
|---|---|---|
| 微信版本不对 | 控件找不到、报错频繁 | 尽量用 3.9.X,wxauto 代码里写明目标版本3.9.11.17 |
| 窗口被最小化/遮挡 | 操作偶发失效 | 机器人运行期间保持微信窗口可见,最好别手动去抢鼠标 |
| 手动干预 | 点击位置错乱 | 机器人运行时别同时手点微信,两者会"打架" |
| 剪贴板被占用 | 发送内容变成别的 | wxauto 发送走的是剪贴板粘贴,脚本运行期别复制别的东西 |
| 大批量好友操作 | 运行极慢 | GetFriendDetails()/GetAllFriends()是逐人扫描的,好友多时用n参数限制数量,官方也标注"未经过大量测试" |
还有两个官方在源码注释里明确提示过的坑:GetFriendDetails()遇到已离职状态的企业微信好友,可能导致微信卡死需要重启(微信客户端本身的 BUG);GetAllMessage()返回的消息id在切换 UI 后会变化,做去重时建议用hash字段。
最后一句忠告与下一步
在 README 的最开头,作者用加粗的免责声明写得很清楚:wxauto 的代码仅用于对 UIAutomation 技术的交流学习使用,禁止用于实际生产项目,禁止用于非法用途和商业用途。自动化操作本身没有原罪,但请把它用在合规、正当的场景里,比如个人的消息备份、学习研究、效率工具原型。这也是所有桌面自动化工具都该守住的底线。
读完这篇文章,你已经走完了"认识 → 安装 → Demo → 原理 → 机器人 → 避坑"的完整路线。接下来的推荐顺序是:
- 把今天的代码跑一遍,试着给自己写一个关键词自动回复机器人;
- 通读官方文档 docs/class/WeChat.md 和 docs/class/Message.md,把
WeChat类和各类Message的方法都过一遍; - 挑一个真实小需求(比如把指定群的图片自动存档),用它练手并逐步扩展。
动手是最好的学习方式。打开你的 Windows 电脑,把第一个 Demo 跑起来,你离"拥有自己的微信机器人"只差这一步。
【免费下载链接】wxautoWindows版本微信客户端(非网页版)自动化,可实现简单的发送、接收微信消息,简单微信机器人项目地址: https://gitcode.com/gh_mirrors/wx/wxauto
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
