技术探索:利用Python库wxauto实现Windows微信客户端的全面自动化管理

项目地址: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

参数说明:

参数类型默认值说明
msgstr/要发送的文字内容
whostrNone要发送给谁,默认则发送给当前打开的页面
clearboolTrue是否清除原本聊天编辑框的内容
atlist,strNone要@的人,可以是一个人或多个人,格式为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参数说明:
参数名类型默认值说明
filepathstr | list/指定文件路径,单个文件str,多个文件list
whostrNone要发送给谁,默认则发送给当前打开的页面
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方法用于获取微信主窗口当前聊天窗口的所有消息,返回消息对象列表

参数说明:

参数名类型默认值说明
savepicboolFalse是否自动保存聊天图片
savefileboolFalse是否自动保存聊天文件
savevoiceboolFalse是否自动保存聊天语音转文字内容
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 获取主窗口新消息

GetAllNewMessageGetNextNewMessage方法用于获取微信主窗口的新消息,返回消息对象列表

  • 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}')

💣提示

  1. GetListenMessage方法获取到的msgs是一个字典,键为监听对象,值为消息对象列表;值的列表与GetAllMessage方法获取到的消息对象列表一样

添加好友

1. 发起好友申请

ddNewFriend方法用于发起好友申请

参数说明:

参数类型默认值说明
keywordsstr/微信号、手机号、QQ号
addmsgstr‘你好,我是xxxx’添加好友的消息
remarkstrNone备注名

♨️注意

注:微信有一定的限制,如果频繁添加好友,可能会被限制添加好友的权限,请谨慎使用,切勿滥用!!!

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方法用于切换到指定好友聊天框

参数说明:

参数名类型默认值说明
whostr/要打开的聊天框好友名或群名
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. 获取粗略信息

参数说明:

参数名类型默认值说明
keywordsstrNone搜索关键词
from wxauto import WeChat

wx = WeChat()

friend_infos = wx.GetAllFriends()
# [{'nickname': '张三', 'remark': '张总', 'tags': None},
#  {'nickname': '李四', 'remark': None, 'tags': ['同事', '初中同学']},
#  {'nickname': '王五', 'remark': None, 'tags': None},
# ...]

🚨注意

  1. 该方法运行时间取决于好友数量,约每秒6~8个好友的速度
2. 获取详细信息

参数说明:

参数名类型默认值说明
nintNone获取前n个好友详情信息, 默认为None,获取所有好友详情信息
timeoutint0xFFFFF获取好友详情信息的超时时间,单位为秒
from wxauto import WeChat

wx = WeChat()

friend_details = wx.GetAllFriendsDetail()
# [{'微信号:': 'abc123456',
#   '地区:': '上海 浦东新区',
#   '备注': '',
#   '标签': 'wxauto',
#   '共同群聊': '1个',
#   '来源': '通过扫一扫添加',
#   '昵称': '张三'},
# {'备注': '',
#  '企业': '广州融创文旅城',
#  '实名': '***',
#  '官方商城': '🎫购滑雪票入口🎫',
#  '通知': '回复时间为工作日9点-18点',
#  '会员商城': '🏂热雪值兑换雪票🏂',
#  '冰箱赞滑': '👬申请冰箱主理人👭',
#  '全民滑雪': '购票赢黄金会籍',
#  '共同群聊': '1个',
#  '昵称': '广州大冰箱'},...]

🚡注意

  1. 该方法运行时间较长,约0.5~1秒一个好友的速度,好友多的话可将n或者timeout参数设置为一个较小的值,先测试一下
  2. 如果遇到企业微信的好友且为已离职状态,可能导致微信卡死,需重启(此为微信客户端BUG)

四、对象说明

消息对象

消息对象指的是调用GetAllMessage、GetListenMessage等方法后返回的消息对象,分为物种消息类型,分别是系统消息 时间消息 撤回消息 好友消息 自己的消息,消息对象包含了消息的所有信息,包括消息类型、消息内容、消息发送者等。

1. 系统消息

支持属性:

属性名类型说明
typestr消息类型,固定为sys
contentstr消息内容
senderstr发送者,固定为SYS
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'sys':
        print(f'【系统消息】{msg.content}')
2. 时间消息

支持属性:

属性名类型说明
typestr消息类型,固定为time
contentstr消息内容
senderstr发送者,固定为Time
timestr时间消息内容,格式为%Y-%m-%d %H:%M
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'time':
        print(f'【时间消息】{msg.time}')
3. 撤回消息

支持属性:

属性名类型说明
typestr消息类型,固定为recall
contentstr消息内容
senderstr发送者,固定为Recall
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息id
...  # 此处省略wx对象的初始化
msgs = wx.GetAllMessage()
for msg in msgs:
    if msg.type == 'recall':
        print(f'【撤回消息】{msg.content}')
4. 好友消息

支持属性:

属性名类型说明
typestr消息类型,固定为friend
contentstr消息内容
senderstr发送者
sender_remarkstr发送者备注名
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息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. 自己的消息

支持属性:

属性名类型说明
typestr消息类型,固定为self
contentstr消息内容
senderstr发送者
infolist原始消息信息,包含了消息的所有信息
controluiautomation.Control该消息的uiautomation控件
idstr消息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

聊天窗口对象

聊天窗口对象指的是监听消息模式下打开的独立聊天窗口,这个对象用于对该独立窗口的管理,包括获取聊天窗口的消息、发送消息等。

支持属性:

属性名类型说明
whostr当前聊天窗口的对象名
UiaAPIuiautomation.Control当前聊天窗口的uiautomation控件
editboxuiautomation.Control当前聊天窗口输入框的uiautomation控件

支持方法:

方法名说明
AtAll@所有人
SendMsg发送消息
SendFiles发送文件
GetAllMessage获取消息
GetNewMessage获取新消息
LoadMoreMessage加载更多消息
GetGroupMembers获取群成员

会话列表对象

会话列表对象即微信左侧的会话列表,可利用该对象获取看到的信息

支持属性:

属性名类型说明
namestr会话对象名
timestr最后一条消息的时间
contentstr最后一条消息的内容
isnewbool是否有新消息
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文件的文件夹,里面就保存了下载下来的图片。。

免责声明

代码仅供交流学习使用,请勿用于非法用途和商业用途!如因此产生任何法律纠纷,均与作者无关!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值