找回密码
 会员注册
查看: 12|回复: 0

python微信PC端自动化-获取聊天记录

[复制链接]

3

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2024-9-7 21:21:58 | 显示全部楼层 |阅读模式
背景目前已有许多微信客户端的自动化工具,可供我们自动获取聊天记录、发送消息等等。不过微信网页版现在已无法登录,因此一些python库如itchat、wxpy等已经无法使用了(基于网页)。现在有大佬开发出了一个好玩的微信自动化python库——wxauto。wxauto基于uiautomation、win32gui等自动化工具,利用windows桌面协议模拟用户的鼠标、键盘事件,实现对微信PC端的自动化操作,可供我们用于开发微信聊天机器人、群管理机器人等等。github地址:https://github.com/cluic/wxauto项目准备1.微信PC客户端(注:这里最好把微信客户端升级至较新版本)2.python3.x3.wxautopipinstallwxauto-ihttps://pypi.tuna.tsinghua.edu.cn/simple具体方法1.获取默认窗口的聊天记录不指定好友或微信群时,获取微信客户端当前显示的窗口聊天记录。获取范围是当前窗口滚动条所能达到的范围。fromwxautoimport*wx=WeChat()#获取当前微信客户端wx.GetSessionList()#获取会话列表defget_default_messages():#调用wxauto中的方法:GetAllMessagemsgs=wx.GetAllMessageformsginmsgs:print('%s:%s'%(msg[0],msg[1]))if__name__=='__main__': get_default_messages()123456789101112132.获取指定好友或群聊天记录若想指定获取某人或者某个微信群的聊天记录,wxauto中有一个ChatWith的方法,可以指定获取的聊天窗口:defChatWith(self,who,RollTimes=None):'''打开某个聊天框who:要打开的聊天框好友名,str;*最好完整匹配,不完全匹配只会选取搜索框第一个RollTimes:默认向下滚动多少次,再进行搜索'''self.UiaAPI.SwitchToThisWindow()RollTimes=10ifnotRollTimeselseRollTimes#当前显示的聊天列表中没找到指定名称的好友或群时,会滚动聊天列表界面,继续寻找defroll_to(who=who,RollTimes=RollTimes):foriinrange(RollTimes):ifwhonotinself.GetSessionList()[:-1]:self.SessionList.WheelDown(wheelTimes=3,waitTime=0.1*i)else:time.sleep(0.5)#这是点击客户端聊天列表中指定的窗口self.SessionList.ListItemControl(Name=who).Click(simulateMove=False)return1return0rollresult=roll_to()ifrollresult:return1else:self.Search(who)#当前显示的聊天列表中没找到指定名称的好友或群时,直接在搜索框中搜索returnroll_to(RollTimes=1)12345678910111213141516171819202122232425'运行运行整理后代码如下:fromwxautoimport*wx=WeChat()wx.GetSessionList()defget_single_messages(name):wx.ChatWith(name)msgs=wx.GetAllMessageformsginmsgs:print('%s:%s'%(msg[0],msg[1]))defget_multi_messages(names):fornameinnames:wx.ChatWith(name)msgs=wx.GetAllMessageformsginmsgs:print('%s:%s'%(msg[0],msg[1]))if__name__=='__main__':name="好友昵称"get_single_messages(name)names=['好友昵称','微信群']get_multi_messages(names)123456789101112131415161718192021222324252627实际上,“获取指定好友或群消息”这一功能也是从方法1中扩展而来,原理很简单。ChatWith中的self.SessionList.ListItemControl(Name=who).Click()就是模拟用户鼠标,点击指定名称的聊天item,使得该名称的聊天窗口成为当前窗口,再调用wx.GetAllMessage获取聊天记录。3.获取更多聊天记录如果不满足于获取当前窗口滚动条范围内的聊天记录,想要获取更多的,我们可以使用wxauto中的LoadMoreMessage()。不过官方的方法是直接在当前展示的窗口向上滚动一定的距离,经过试验后发现,有时候方法失效,无法拿到更多消息。本人在此方法中做了改进:(1)先定位到聊天窗口顶部的“查看更多消息”;(2)然后点击“查看更多消息”,加载出更早的聊天记录;(3)调用wx.GetAllMessage获取聊天记录。改进后的获取更多聊天记录的方法如下:defrollToTop(self): """ 注意,本方法采用发送键盘事件来使聊天窗口跳转到顶部,因此先模拟鼠标点击微信聊天窗口,将其变为当前活跃窗口。不然发送键盘事件可能会失灵"""#计算窗口中央的位置rect=self.UiaAPI.BoundingRectanglex=rect.right-100center_y=rect.top+rect.height()//2#定位至窗口顶端uia.Click(x,center_y)self.MsgList.SendKeys('{Home}',waitTime=1)#按键盘上的“Home”键,跳转至窗口顶部children=self.MsgList.GetChildren()#遍历所有子元素forchildinchildren:ifchild.ControlType==uia.ControlType.ButtonControlandchild.Name=='查看更多消息':child.Click()breakuia.Click(x,center_y)1234567891011121314151617181920注意,rollToTop方法需要添加到wxauto.py中的WeChat类中,因为需要调用WeChat类中的一些变量。main方法中调用方法,获取更多聊天记录:fromwxautoimport*wx=WeChat()wx.GetSessionList()defget_more_messages(name):wx.ChatWith(name)wx.rollToTop()msgs=wx.GetAllMessageformsginmsgs:print('%s:%s'%(msg[0],msg[1]))if__name__=='__main__':name="好友昵称"get_more_messages(name)1234567891011121314151617
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-11 02:40 , Processed in 0.441084 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表