項目地址: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 WeChatwx = WeChat()# 發送消息給文件傳輸助手
msg = 'hello, wxauto!'
who = '文件傳輸助手'
wx.SendMsg(msg=msg, who=who)
1.2 附帶@群好友的消息
from wxauto import WeChatwx = 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 WeChatwx = 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 WeChatwx = 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 WeChatwx = 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 WeChatwx = WeChat()# 加載更多歷史消息
wx.LoadMoreMessage()# 獲取當前聊天窗口消息
msgs = wx.GetAllMessage()
... # 自行構建消息處理邏輯
💡提示
LoadMoreMessage
方法加載更多歷史消息時,需要保證當前聊天窗口有歷史消息,否則沒有效果,即觸發一次“查看更多消息”
2. 獲取新消息
2.1 獲取主窗口新消息
GetAllNewMessage
和GetNextNewMessage
方法用于獲取微信主窗口的新消息,返回消息對象列表
-
GetAllNewMessage
方法獲取所有新消息from wxauto import WeChatwx = WeChat()# 獲取所有新消息 msgs = wx.GetAllNewMessage()
-
GetNextNewMessage
方法獲取下一條新消息from wxauto import WeChatwx = WeChat()# 獲取下一條新消息 msgs = wx.GetNextNewMessage()
這兩種方法獲取到的msgs數據類型均為dict,結構如下:
消息格式
{'張三': [msg1, msg2, ...],'李四': [msg1, msg2, ...],...
}
2.2 監聽消息
GetListenMessage
方法用于獲取監聽消息,調用該方法之前,需要先調用AddListenChat
方法添加監聽對象,然后調用GetListenMessage
方法實現消息監聽
from wxauto import WeChatwx = 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 WeChatwx = 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 WeChatwx = 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 WeChatwx = WeChat()# 切換到指定好友聊天框
who = '張三'
wx.ChatWith(who=who)
2. 切換微信主頁面
此部分原理為點擊微信左側黑色側邊欄的相應圖標按鈕,切換至相應的頁面。
2.1 切換到聊天頁面
from wxauto import WeChatwx = WeChat()# 切換到聊天頁面
wx.SwitchToChat()
2.2 切換到通訊錄頁面
from wxauto import WeChatwx = WeChat()# 切換到通訊錄頁面
wx.SwitchToContact()
獲取好友信息
1. 獲取粗略信息
參數說明:
參數名 | 類型 | 默認值 | 說明 |
---|---|---|---|
keywords | str | None | 搜索關鍵詞 |
from wxauto import WeChatwx = 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 WeChatwx = 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 WeChatwx = 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文件
的文件夾,里面就保存了下載下來的圖片。。
免責聲明
代碼僅供交流學習使用,請勿用于非法用途和商業用途!如因此產生任何法律糾紛,均與作者無關!