背景
目前已有許多微信客戶(hù)端的自動(dòng)化工具,可供我們自動(dòng)獲取聊天記錄、發(fā)送消息等等。不過(guò)微信網(wǎng)頁(yè)版現(xiàn)在已無(wú)法登錄,因此一些python庫(kù)如itchat、wxpy等已經(jīng)無(wú)法使用了(基于網(wǎng)頁(yè))。
現(xiàn)在有大佬開(kāi)發(fā)出了一個(gè)好玩的微信自動(dòng)化python庫(kù)——wxauto。wxauto基于uiautomation、win32gui等自動(dòng)化工具,利用windows桌面協(xié)議模擬用戶(hù)的鼠標(biāo)、鍵盤(pán)事件,實(shí)現(xiàn)對(duì)微信PC端的自動(dòng)化操作,可供我們用于開(kāi)發(fā)微信聊天機(jī)器人、群管理機(jī)器人等等。github地址:https://github.com/cluic/wxauto
項(xiàng)目準(zhǔn)備
1. 微信PC客戶(hù)端
(注:這里最好把微信客戶(hù)端升級(jí)至較新版本)
2. python3.x
3. wxauto
pip install wxauto -i https://pypi.tuna.tsinghua.edu.cn/simple
具體方法
1. 獲取默認(rèn)窗口的聊天記錄
不指定好友或微信群時(shí),獲取微信客戶(hù)端當(dāng)前顯示的窗口聊天記錄。獲取范圍是當(dāng)前窗口滾動(dòng)條所能達(dá)到的范圍。
from wxauto import *
wx = WeChat() # 獲取當(dāng)前微信客戶(hù)端
wx.GetSessionList() # 獲取會(huì)話(huà)列表
def get_default_messages():
# 調(diào)用wxauto中的方法:GetAllMessage
msgs = wx.GetAllMessage
for msg in msgs:
print('%s : %s' % (msg[0], msg[1]))
if __name__ == '__main__':
get_default_messages()
2. 獲取指定好友或群聊天記錄
若想指定獲取某人或者某個(gè)微信群的聊天記錄,wxauto中有一個(gè)ChatWith的方法,可以指定獲取的聊天窗口:
def ChatWith(self, who, RollTimes=None):
'''
打開(kāi)某個(gè)聊天框
who : 要打開(kāi)的聊天框好友名,str; * 最好完整匹配,不完全匹配只會(huì)選取搜索框第一個(gè)
RollTimes : 默認(rèn)向下滾動(dòng)多少次,再進(jìn)行搜索
'''
self.UiaAPI.SwitchToThisWindow()
RollTimes = 10 if not RollTimes else RollTimes
# 當(dāng)前顯示的聊天列表中沒(méi)找到指定名稱(chēng)的好友或群時(shí),會(huì)滾動(dòng)聊天列表界面,繼續(xù)尋找
def roll_to(who=who, RollTimes=RollTimes):
for i in range(RollTimes):
if who not in self.GetSessionList()[:-1]:
self.SessionList.WheelDown(wheelTimes=3, waitTime=0.1*i)
else:
time.sleep(0.5)
# 這是點(diǎn)擊客戶(hù)端聊天列表中指定的窗口
self.SessionList.ListItemControl(Name=who).Click(simulateMove=False)
return 1
return 0
rollresult = roll_to()
if rollresult:
return 1
else:
self.Search(who) # 當(dāng)前顯示的聊天列表中沒(méi)找到指定名稱(chēng)的好友或群時(shí),直接在搜索框中搜索
return roll_to(RollTimes=1)
整理后代碼如下:
from wxauto import *
wx = WeChat()
wx.GetSessionList()
def get_single_messages(name):
wx.ChatWith(name)
msgs = wx.GetAllMessage
for msg in msgs:
print('%s : %s' % (msg[0], msg[1]))
def get_multi_messages(names):
for name in names:
wx.ChatWith(name)
msgs = wx.GetAllMessage
for msg in msgs:
print('%s : %s' % (msg[0], msg[1]))
if __name__ == '__main__':
name = "好友昵稱(chēng)"
get_single_messages(name)
names = ['好友昵稱(chēng)', '微信群']
get_multi_messages(names)
實(shí)際上,“獲取指定好友或群消息”這一功能也是從方法1中擴(kuò)展而來(lái),原理很簡(jiǎn)單。ChatWith中的self.SessionList.ListItemControl(Name=who).Click()就是模擬用戶(hù)鼠標(biāo),點(diǎn)擊指定名稱(chēng)的聊天item,使得該名稱(chēng)的聊天窗口成為當(dāng)前窗口,再調(diào)用wx.GetAllMessage獲取聊天記錄。
3. 獲取更多聊天記錄
如果不滿(mǎn)足于獲取當(dāng)前窗口滾動(dòng)條范圍內(nèi)的聊天記錄,想要獲取更多的,我們可以使用wxauto中的LoadMoreMessage()。不過(guò)官方的方法是直接在當(dāng)前展示的窗口向上滾動(dòng)一定的距離,經(jīng)過(guò)試驗(yàn)后發(fā)現(xiàn),有時(shí)候方法失效,無(wú)法拿到更多消息。
本人在此方法中做了改進(jìn):
(1)先定位到聊天窗口頂部的“查看更多消息”;
(2)然后點(diǎn)擊“查看更多消息”,加載出更早的聊天記錄;
(3)調(diào)用wx.GetAllMessage獲取聊天記錄。
改進(jìn)后的獲取更多聊天記錄的方法如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-772068.html
def rollToTop(self):
"""
注意,本方法采用發(fā)送鍵盤(pán)事件來(lái)使聊天窗口跳轉(zhuǎn)到頂部,因此先模擬鼠標(biāo)點(diǎn)擊微信聊天窗口,將其變?yōu)楫?dāng)前活躍窗口。不然發(fā)送鍵盤(pán)事件可能會(huì)失靈
"""
# 計(jì)算窗口中央的位置
rect = self.UiaAPI.BoundingRectangle
x = rect.right - 100
center_y = rect.top + rect.height() // 2
# 定位至窗口頂端
uia.Click(x, center_y)
self.MsgList.SendKeys('{Home}', waitTime=1) # 按鍵盤(pán)上的“Home”鍵,跳轉(zhuǎn)至窗口頂部
children = self.MsgList.GetChildren()
# 遍歷所有子元素
for child in children:
if child.ControlType == uia.ControlType.ButtonControl and child.Name == '查看更多消息':
child.Click()
break
uia.Click(x, center_y)
注意,rollToTop方法需要添加到wxauto.py中的WeChat類(lèi)中,因?yàn)樾枰{(diào)用WeChat類(lèi)中的一些變量。
main方法中調(diào)用方法,獲取更多聊天記錄:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772068.html
from wxauto import *
wx = WeChat()
wx.GetSessionList()
def get_more_messages(name):
wx.ChatWith(name)
wx.rollToTop()
msgs = wx.GetAllMessage
for msg in msgs:
print('%s : %s' % (msg[0], msg[1]))
if __name__ == '__main__':
name = "好友昵稱(chēng)"
get_more_messages(name)
到了這里,關(guān)于python微信PC端自動(dòng)化-獲取聊天記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!