0


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

背景

目前已有许多微信客户端的自动化工具,可供我们自动获取聊天记录、发送消息等等。不过微信网页版现在已无法登录,因此一些python库如itchat、wxpy等已经无法使用了(基于网页)。
现在有大佬开发出了一个好玩的微信自动化python库——wxauto。wxauto基于uiautomation、win32gui等自动化工具,利用windows桌面协议模拟用户的鼠标、键盘事件,实现对微信PC端的自动化操作,可供我们用于开发微信聊天机器人、群管理机器人等等。

github地址:https://github.com/cluic/wxauto

项目准备

 1. 微信PC客户端

(注:这里最好把微信客户端升级至较新版本)

2. python3.x
3. wxauto

pip install wxauto -i https://pypi.tuna.tsinghua.edu.cn/simple

具体方法

1. 获取默认窗口的聊天记录

不指定好友或微信群时,获取微信客户端当前显示的窗口聊天记录。获取范围是当前窗口滚动条所能达到的范围。

from wxauto import*

wx = WeChat()# 获取当前微信客户端
wx.GetSessionList()# 获取会话列表defget_default_messages():# 调用wxauto中的方法:GetAllMessage
    msgs = wx.GetAllMessage
    for msg in msgs:print('%s : %s'%(msg[0], msg[1]))if __name__ =='__main__':
    get_default_messages()

2. 获取指定好友或群聊天记录

若想指定获取某人或者某个微信群的聊天记录,wxauto中有一个ChatWith的方法,可以指定获取的聊天窗口:

defChatWith(self, who, RollTimes=None):'''
        打开某个聊天框
        who : 要打开的聊天框好友名,str;  * 最好完整匹配,不完全匹配只会选取搜索框第一个
        RollTimes : 默认向下滚动多少次,再进行搜索
        '''
        self.UiaAPI.SwitchToThisWindow()  
        RollTimes =10ifnot RollTimes else RollTimes
        # 当前显示的聊天列表中没找到指定名称的好友或群时,会滚动聊天列表界面,继续寻找defroll_to(who=who, RollTimes=RollTimes):for i inrange(RollTimes):if who notin self.GetSessionList()[:-1]:
                    self.SessionList.WheelDown(wheelTimes=3, waitTime=0.1*i)else:
                    time.sleep(0.5)# 这是点击客户端聊天列表中指定的窗口
                    self.SessionList.ListItemControl(Name=who).Click(simulateMove=False)return1return0
        rollresult = roll_to()if rollresult:return1else:
            self.Search(who)# 当前显示的聊天列表中没找到指定名称的好友或群时,直接在搜索框中搜索return roll_to(RollTimes=1)

整理后代码如下:

from wxauto import*

wx = WeChat()
wx.GetSessionList()defget_single_messages(name):
    wx.ChatWith(name)
    msgs = wx.GetAllMessage
    for msg in msgs:print('%s : %s'%(msg[0], msg[1]))defget_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 ="好友昵称"
    get_single_messages(name)

    names =['好友昵称','微信群']
    get_multi_messages(names)

实际上,“获取指定好友或群消息”这一功能也是从方法1中扩展而来,原理很简单。ChatWith中的self.SessionList.ListItemControl(Name=who).Click()就是模拟用户鼠标,点击指定名称的聊天item,使得该名称的聊天窗口成为当前窗口,再调用wx.GetAllMessage获取聊天记录。

3. 获取更多聊天记录

如果不满足于获取当前窗口滚动条范围内的聊天记录,想要获取更多的,我们可以使用wxauto中的LoadMoreMessage()。不过官方的方法是直接在当前展示的窗口向上滚动一定的距离,经过试验后发现,有时候方法失效,无法拿到更多消息。
本人在此方法中做了改进:

(1)先定位到聊天窗口顶部的“查看更多消息”;
(2)然后点击“查看更多消息”,加载出更早的聊天记录;
(3)调用wx.GetAllMessage获取聊天记录。

改进后的获取更多聊天记录的方法如下:

defrollToTop(self):"""
    注意,本方法采用发送键盘事件来使聊天窗口跳转到顶部,因此先模拟鼠标点击微信聊天窗口,将其变为当前活跃窗口。不然发送键盘事件可能会失灵
    """# 计算窗口中央的位置
    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)# 按键盘上的“Home”键,跳转至窗口顶部

    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类中,因为需要调用WeChat类中的一些变量。
main方法中调用方法,获取更多聊天记录:

from wxauto import*

wx = WeChat()
wx.GetSessionList()defget_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 ="好友昵称"
    get_more_messages(name)
标签: python 微信 自动化

本文转载自: https://blog.csdn.net/qq_37401585/article/details/132253543
版权归原作者 青春小尾巴- 所有, 如有侵权,请联系我们删除。

“python微信PC端自动化-获取聊天记录”的评论:

还没有评论