项目地址:github-wxauto 点击即可访问
项目官网:wxauto 点击即可访问
😂什么是wxauto?
wxauto 是作者在2020年开发的一个基于 UIAutomation 的开源 Python 微信自动化库,最初只是一个简单的脚本,只能获取消息和发送消息,经历了2年多的停滞,期间很多网友留言说需要更多的功能,所以在2023年针对新版微信重新开发了 wxauto,增加了更多的功能,即使 Python 初学者也可以简单上手自动化微信操作。目前已实现很多日常的微信操作的自动化,如自动发送消息、自动添加好友、自动回复、自动获取聊天记录、图片、文件等功能,后续还会根据反馈更新更多功能。
📌wxauto 的主要功能
- 消息发送:支持发送文字、图片、文件、@群好友、引用消息等功能
- 聊天记录:可获取好友的聊天记录内容
- 监听消息:实时获取指定监听好友(群)的新消息
- 其他定制功能:根据需求定制自动化流程,满足各种特殊需求。
🎧为什么选择 wxauto?
- 开源免费:完全开源,你可以自由使用和修改,帮助更多人实现微信自动化。
- 简单易用:界面简洁,操作简单,编程小白也能快速上手。
- 灵活强大:支持多种操作和定制,满足各种自动化需求。
💡 未来展望
作者我们将持续优化 wxauto,增加更多实用功能,帮助更多用户实现微信自动化。
一、环境配置
Windows版本微信客户端自动化,可实现简单的发送、接收微信消息、保存聊天图片
3.9.11.17版本微信安装包下载: 123云盘 提取码:seqA
环境 | 版本 |
---|---|
OS | `windows 10 |
微信 | `微信 |
Python | `Python |
获取wxauto
CMD窗口:
pip install wxauto
Python窗口:
>>> import wxauto
>>> wxauto.VERSION
'3.9.11.17'
>>> wx = wxauto.WeChat()
初始化成功,获取到已登录窗口:xxx
二、快速入门
1. 获取微信对象
# 导入
from wxauto import WeChat
# 获取微信窗口对象
wx = WeChat()
# 输出 > 初始化成功,获取到已登录窗口:xxxx
🚨注意
请先登录PC微信客户端,再运行上述代码
🚨注意
上面定义了wx变量,后续文档不再重复定义和解释wx变量
2. 一个简单的收到机器人
首先设置一个监听列表,列表元素为指定好友(或群聊)的昵称
listen_list = [
'张三',
'李四',
'工作群A',
'工作群B'
]
然后调用AddListenChat
方法添加监听对象,其中可选参数savepic
为是否保存新消息图片
for i in listen_list:
wx.AddListenChat(who=i, savepic=True)
最后调用GetListenMessage
方法,实现消息监听,收到消息类型为friend
的消息之后,调用SendMsg
方法回复消息
# 持续监听消息,并且收到消息后回复“收到”
wait = 1 # 设置1秒查看一次是否有新消息
while True:
msgs = wx.GetListenMessage()
for chat in msgs:
who = chat.who # 获取聊天窗口名(人或群名)
one_msgs = msgs.get(chat) # 获取消息内容
# 回复收到
for msg in one_msgs:
msgtype = msg.type # 获取消息类型
content = msg.content # 获取消息内容,字符串类型的消息内容
print(f'【{who}】:{content}')
# ===================================================
# 处理消息逻辑(如果有)
#
# 处理消息内容的逻辑每个人都不同,按自己想法写就好了,这里不写了
#
# ===================================================
# 如果是好友发来的消息(即非系统消息等),则回复收到
if msgtype == 'friend':
chat.SendMsg('收到') # 回复收到
time.sleep(wait)
👌SUCCESS
恭喜你,你已经实现了一个简单的微信机器人,可以自动回复消息了!
完整代码
# 导入
from wxauto import WeChat
# 获取微信窗口对象
wx = WeChat()
# 输出 > 初始化成功,获取到已登录窗口:xxxx
# 设置监听列表
listen_list = [
'张三',
'李四',
'工作群A',
'工作群B'
]
# 循环添加监听对象
for i in listen_list:
wx.AddListenChat(who=i, savepic=True)
# 持续监听消息,并且收到消息后回复“收到”
wait = 1 # 设置1秒查看一次是否有新消息
while True:
msgs = wx.GetListenMessage()
for chat in msgs:
who = chat.who # 获取聊天窗口名(人或群名)
one_msgs = msgs.get(chat) # 获取消息内容
# 回复收到
for msg in one_msgs:
msgtype = msg.type # 获取消息类型
content = msg.content # 获取消息内容,字符串类型的消息内容
print(f'【{who}】:{content}')
# ===================================================
# 处理消息逻辑(如果有)
#
# 处理消息内容的逻辑每个人都不同,按自己想法写就好了,这里不写了
#
# ===================================================
# 如果是好友发来的消息(即非系统消息等),则回复收到
if msgtype == 'friend':
chat.SendMsg('收到') # 回复收到
time.sleep(wait)
三、方法说明
发送消息
1. 发送文字消息SendMsg
参数说明:
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
msg | str | / | 要发送的文字内容 |
who | str | None | 要发送给谁,默认则发送给当前打开的页面 |
clear | bool | True | 是否清除原本聊天编辑框的内容 |
at | list,str | None | 要@的人,可以是一个人或多个人,格式为str或list,例如:"张三"或[“张三”, “李四”] |
1.1简单的发送文字信息
from wxauto import WeChat
wx = WeChat()
# 发送消息给文件传输助手
msg = 'hello, wxauto!'
who = '文件传输助手'
wx.SendMsg(msg=msg, who=who)
1.2 附带@群好友的消息
from wxauto import WeChat
wx = WeChat()
msg = 'xxxxxxx,收到请回复!'
who = '工作群A'
at = ['张三', '李四'] # 要@的人
wx.SendMsg(msg=msg, who=who, at=at)
2. 发送图片/视频/文件消息 SendFiles参数说明:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
filepath | str | list | / | 指定文件路径,单个文件str,多个文件list |
who | str | None | 要发送给谁,默认则发送给当前打开的页面 |
2.1 发送图片/视频/文件消息
from wxauto import WeChat
wx = WeChat()
# 发送图片
files = [
r'C:\Users\user\Desktop\1.jpg', # 图片
r'C:\Users\user\Desktop\2.txt', # 文件
r'C:\Users\user\Desktop\3.mp4' # 视频
]
who = '文件传输助手'
wx.SendFiles(filepath=files, who=who)
获取消息
1. 获取当前聊天窗口消息
GetAllMessage
方法用于获取微信主窗口当前聊天窗口的所有消息,返回消息对象列表
参数说明:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
savepic | bool | False | 是否自动保存聊天图片 |
savefile | bool | False | 是否自动保存聊天文件 |
savevoice | bool | False | 是否自动保存聊天语音转文字内容 |
1.1 仅获取文字消息
无需参数,直接调用GetAllMessage
方法即可获取当前聊天窗口的所有消息
from wxauto import WeChat
wx = WeChat()
# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()
# 输出消息内容
for msg in msgs:
if msg.type == 'sys':
print(f'【系统消息】{msg.content}')
elif msg.type == 'friend':
sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
print(f'{sender.rjust(20)}:{msg.content}')
elif msg.type == 'self':
print(f'{msg.sender.ljust(20)}:{msg.content}')
elif msg.type == 'time':
print(f'\n【时间消息】{msg.time}')
elif msg.type == 'recall':
print(f'【撤回消息】{msg.content}')
1.2 获取文字信息以及保存图片、文件、语音转文字内容
可使用以下三个参数自定义指定是否保存图片、文件、语音转文字内容
savepic
:是否保存聊天图片,默认为False
savefile
:是否保存聊天文件,默认为False
savevoice
:是否保存聊天语音转文字内容,默认为False
from wxauto import WeChat
wx = WeChat()
# 获取当前聊天窗口消息
msgs = wx.GetAllMessage(
savepic = True, # 保存图片
savefile = True, # 保存文件
savevoice = True # 保存语音转文字内容
)
# 输出消息内容
for msg in msgs:
if msg.type == 'sys':
print(f'【系统消息】{msg.content}')
elif msg.type == 'friend':
sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
print(f'{sender.rjust(20)}:{msg.content}')
elif msg.type == 'self':
print(f'{msg.sender.ljust(20)}:{msg.content}')
elif msg.type == 'time':
print(f'\n【时间消息】{msg.time}')
elif msg.type == 'recall':
print(f'【撤回消息】{msg.content}')
1.3 加载更多历史消息
LoadMoreMessage
方法用于加载更多历史消息,配合GetAllMessage
方法使用,实现获取更多历史消息
from wxauto import WeChat
wx = WeChat()
# 加载更多历史消息
wx.LoadMoreMessage()
# 获取当前聊天窗口消息
msgs = wx.GetAllMessage()
... # 自行构建消息处理逻辑
💡提示
LoadMoreMessage
方法加载更多历史消息时,需要保证当前聊天窗口有历史消息,否则没有效果,即触发一次“查看更多消息”
2. 获取新消息
2.1 获取主窗口新消息
GetAllNewMessage
和GetNextNewMessage
方法用于获取微信主窗口的新消息,返回消息对象列表
-
GetAllNewMessage
方法获取所有新消息from wxauto import WeChat wx = WeChat() # 获取所有新消息 msgs = wx.GetAllNewMessage()
-
GetNextNewMessage
方法获取下一条新消息from wxauto import WeChat wx = WeChat() # 获取下一条新消息 msgs = wx.GetNextNewMessage()
这两种方法获取到的msgs数据类型均为dict,结构如下:
消息格式
{
'张三': [msg1, msg2, ...],
'李四': [msg1, msg2, ...],
...
}
2.2 监听消息
GetListenMessage
方法用于获取监听消息,调用该方法之前,需要先调用AddListenChat
方法添加监听对象,然后调用GetListenMessage
方法实现消息监听
from wxauto import WeChat
wx = WeChat()
# 首先设置一个监听列表,列表元素为指定好友(或群聊)的昵称
listen_list = [
'张三',
'李四',
'工作群A',
'工作群B'
]
# 然后调用`AddListenChat`方法添加监听对象,其中可选参数`savepic`为是否保存新消息图片
for i in listen_list:
wx.AddListenChat(who=i)
msgs = wx.GetListenMessage()
for chat in msgs:
one_msgs = msgs.get(chat) # 获取消息内容
# 回复收到
for msg in one_msgs:
if msg.type == 'sys':
print(f'【系统消息】{msg.content}')
elif msg.type == 'friend':`
sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
print(f'{sender.rjust(20)}:{msg.content}')
# !!! 回复收到,此处为`chat`而不是`wx` !!!
chat.SendMsg('收到')
# 此处将msg.content传递给大模型,再由大模型返回的消息回复即可实现ai聊天
elif msg.type == 'self':
print(f'{msg.sender.ljust(20)}:{msg.content}')
elif msg.type == 'time':
print(f'\n【时间消息】{msg.time}')
elif msg.type == 'recall':
print(f'【撤回消息】{msg.content}')
💣提示
GetListenMessage
方法获取到的msgs是一个字典,键为监听对象,值为消息对象列表;值的列表与GetAllMessage
方法获取到的消息对象列表一样
添加好友
1. 发起好友申请
ddNewFriend
方法用于发起好友申请
参数说明:
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
keywords | str | / | 微信号、手机号、QQ号 |
addmsg | str | ‘你好,我是xxxx’ | 添加好友的消息 |
remark | str | None | 备注名 |
♨️注意
注:微信有一定的限制,如果频繁添加好友,可能会被限制添加好友的权限,请谨慎使用,切勿滥用!!!
from wxauto import WeChat
wx = WeChat()
keywords = '13800000000' # 微信号、手机号、QQ号
addmsg = '你好,我是xxxx' # 添加好友的消息
remark = '备注名字' # 备注名,没有则不用设置
tags = ['朋友', '同事'] # 标签列表
# 发起好友申请
wx.AddNewFriend(keywords, addmsg=addmsg, remark=remark, tags=tags)
2. 接受好友请求
2.1 获取新的好友申请对象列表
GetNewFriends
方法用于获取新的好友申请对象列表
Python – 获取新的好友申请对象列表示例代码
from wxauto import WeChat
wx = WeChat()
new = wx.GetNewFriends()
# [<wxauto New Friends Element at 0x1e95fced080 (张三: 你好,我是xxx群的张三)>,
# <wxauto New Friends Element at 0x1e95fced081 (李四: 你好,我是xxx群的李四)>]
2.2 通过好友申请对象接受好友请求
... # 接2.1代码
# 获取第一个可接受的新好友对象
new_friend1 = new[0]
print(new_friend1.name) # 获取好友申请昵称
# 张三
print(new_friend1.msg) # 获取好友申请信息
# 你好,我是xxx群的张三
# 接受好友请求,并且添加备注“备注张三”、添加标签wxauto
new_friend1.Accept(remark='备注张三', tags=['wxauto'])
# 切换回聊天页面
wx.SwitchToChat()
🚧提示
该方法接受好友请求后,并不会自动切换回聊天页面,需要配合调用
SwitchToChat
方法切换至聊天页面,否则其他有关聊天页面的方法不可使用
切换聊天窗口
1. 切换到指定好友聊天框
ChatWith
方法用于切换到指定好友聊天框
参数说明:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
who | str | / | 要打开的聊天框好友名或群名 |
from wxauto import WeChat
wx = WeChat()
# 切换到指定好友聊天框
who = '张三'
wx.ChatWith(who=who)
2. 切换微信主页面
此部分原理为点击微信左侧黑色侧边栏的相应图标按钮,切换至相应的页面。
2.1 切换到聊天页面
from wxauto import WeChat
wx = WeChat()
# 切换到聊天页面
wx.SwitchToChat()
2.2 切换到通讯录页面
from wxauto import WeChat
wx = WeChat()
# 切换到通讯录页面
wx.SwitchToContact()
获取好友信息
1. 获取粗略信息
参数说明:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
keywords | str | None | 搜索关键词 |
from wxauto import WeChat
wx = WeChat()
friend_infos = wx.GetAllFriends()
# [{'nickname': '张三', 'remark': '张总', 'tags': None},
# {'nickname': '李四', 'remark': None, 'tags': ['同事', '初中同学']},
# {'nickname': '王五', 'remark': None, 'tags': None},
# ...]
🚨注意
- 该方法运行时间取决于好友数量,约每秒6~8个好友的速度
2. 获取详细信息
参数说明:
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
n | int | None | 获取前n个好友详情信息, 默认为None,获取所有好友详情信息 |
timeout | int | 0xFFFFF | 获取好友详情信息的超时时间,单位为秒 |
from wxauto import WeChat
wx = WeChat()
friend_details = wx.GetAllFriendsDetail()
# [{'微信号:': 'abc123456',
# '地区:': '上海 浦东新区',
# '备注': '',
# '标签': 'wxauto',
# '共同群聊': '1个',
# '来源': '通过扫一扫添加',
# '昵称': '张三'},
# {'备注': '',
# '企业': '广州融创文旅城',
# '实名': '***',
# '官方商城': '🎫购滑雪票入口🎫',
# '通知': '回复时间为工作日9点-18点',
# '会员商城': '🏂热雪值兑换雪票🏂',
# '冰箱赞滑': '👬申请冰箱主理人👭',
# '全民滑雪': '购票赢黄金会籍',
# '共同群聊': '1个',
# '昵称': '广州大冰箱'},...]
🚡注意
- 该方法运行时间较长,约0.5~1秒一个好友的速度,好友多的话可将
n
或者timeout
参数设置为一个较小的值,先测试一下- 如果遇到企业微信的好友且为已离职状态,可能导致微信卡死,需重启(此为微信客户端BUG)
四、对象说明
消息对象
消息对象指的是调用GetAllMessage、GetListenMessage等方法后返回的消息对象,分为物种消息类型,分别是系统消息
时间消息
撤回消息
好友消息
自己的消息
,消息对象包含了消息的所有信息,包括消息类型、消息内容、消息发送者等。
1. 系统消息
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
type | str | 消息类型,固定为sys |
content | str | 消息内容 |
sender | str | 发送者,固定为SYS |
info | list | 原始消息信息,包含了消息的所有信息 |
control | uiautomation.Control | 该消息的uiautomation控件 |
id | str | 消息id |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'sys':
print(f'【系统消息】{msg.content}')
2. 时间消息
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
type | str | 消息类型,固定为time |
content | str | 消息内容 |
sender | str | 发送者,固定为Time |
time | str | 时间消息内容,格式为%Y-%m-%d %H:%M |
info | list | 原始消息信息,包含了消息的所有信息 |
control | uiautomation.Control | 该消息的uiautomation控件 |
id | str | 消息id |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'time':
print(f'【时间消息】{msg.time}')
3. 撤回消息
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
type | str | 消息类型,固定为recall |
content | str | 消息内容 |
sender | str | 发送者,固定为Recall |
info | list | 原始消息信息,包含了消息的所有信息 |
control | uiautomation.Control | 该消息的uiautomation控件 |
id | str | 消息id |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'recall':
print(f'【撤回消息】{msg.content}')
4. 好友消息
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
type | str | 消息类型,固定为friend |
content | str | 消息内容 |
sender | str | 发送者 |
sender_remark | str | 发送者备注名 |
info | list | 原始消息信息,包含了消息的所有信息 |
control | uiautomation.Control | 该消息的uiautomation控件 |
id | str | 消息id |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'friend':
sender = msg.sender # 这里可以将msg.sender改为msg.sender_remark,获取备注名
print(f'{sender}:{msg.content}')
支持方法
方法名 | 说明 |
---|---|
quote | 引用消息进行回复,唯一参数msg,str类型 |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'friend':
msg.quote('回复消息') # 引用消息进行回复
break
5. 自己的消息
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
type | str | 消息类型,固定为self |
content | str | 消息内容 |
sender | str | 发送者 |
info | list | 原始消息信息,包含了消息的所有信息 |
control | uiautomation.Control | 该消息的uiautomation控件 |
id | str | 消息id |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'self':
print(f'{msg.sender}:{msg.content}')
支持方法
方法名 | 说明 |
---|---|
quote | 引用消息进行回复,唯一参数msg,str类型 |
... # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
if msg.type == 'self':
msg.quote('回复消息') # 引用消息进行回复
break
聊天窗口对象
聊天窗口对象指的是监听消息模式下打开的独立聊天窗口,这个对象用于对该独立窗口的管理,包括获取聊天窗口的消息、发送消息等。
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
who | str | 当前聊天窗口的对象名 |
UiaAPI | uiautomation.Control | 当前聊天窗口的uiautomation控件 |
editbox | uiautomation.Control | 当前聊天窗口输入框的uiautomation控件 |
支持方法:
方法名 | 说明 |
---|---|
AtAll | @所有人 |
SendMsg | 发送消息 |
SendFiles | 发送文件 |
GetAllMessage | 获取消息 |
GetNewMessage | 获取新消息 |
LoadMoreMessage | 加载更多消息 |
GetGroupMembers | 获取群成员 |
会话列表对象
会话列表对象即微信左侧的会话列表,可利用该对象获取看到的信息
支持属性:
属性名 | 类型 | 说明 |
---|---|---|
name | str | 会话对象名 |
time | str | 最后一条消息的时间 |
content | str | 最后一条消息的内容 |
isnew | bool | 是否有新消息 |
from wxauto import WeChat
wx = WeChat()
sessions = wx.GetSession()
for session in sessions:
print(f"============== 【{session.name}】 ==============")
print(f"最后一条消息时间: {session.time}")
print(f"最后一条消息内容: {session.content}")
print(f"是否有新消息: {session.isnew}")
示例:
请先登录PC微信客户端
from wxauto import *
# 获取当前微信客户端
wx = WeChat()
# 获取会话列表
wx.GetSessionList()
# 向某人发送消息(以`文件传输助手`为例)
msg = '你好~'
who = '文件传输助手'
wx.SendMsg(msg, who) # 向`文件传输助手`发送消息:你好~
# 向某人发送文件(以`文件传输助手`为例,发送三个不同类型文件)
files = [
'D:/Desktop/Tests/wxauto.py',
'D:/Desktop/Tests/wxauto.png',
'D:/Desktop/Tests/files.zip'
]
who = '文件传输助手'
wx.SendFiles(filepath=files, who=who) # 向`文件传输助手`发送上述三个文件
# 下载当前聊天窗口的聊天记录及图片
msgs = wx.GetAllMessage(savepic=True) # 获取聊天记录,及自动下载图片
他会打开你的微信窗口,然后搜索文件传输助手
,将你好
发送出去,也会将文件发送出去,同时将本窗口聊天记录里的图片下载下来。
你会在你项目列表里发现新建了一个名为wxauto文件
的文件夹,里面就保存了下载下来的图片。。
免责声明
代码仅供交流学习使用,请勿用于非法用途和商业用途!如因此产生任何法律纠纷,均与作者无关!