• 【uiautomation】微信群发消息,获取全部聊天记录


    前言

    接到了一个需求:现微信有8000+好友,需要给所有好友发送一则一样的消息。网上搜索一番后,发现uiautomation 可以解决该需求,遂有此文。这是第三篇,获取聊天窗口的所有记录。

    代码在文章末尾,自取~
    更多功能的微信群发消息代码链接 :https://github.com/Frica01/Wechat_mass_msg


    知识点📖

    代码实现

    该方法主要实现获取聊天窗口中的聊天记录。想获取多少传入对应的page的数量即可。

    聊天记录输出的格式为:

    [
    	{'type':'消息的类型', 'name':'发送消息的用户昵称', 'msg':'发送的内容'},
    	{'type':'消息的类型', 'name':'发送消息的用户昵称', 'msg':'发送的内容'},
    	...
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码如下:

    运行效果如下动图所示:

    截取聊天记录返回的片段,如下

      {
        "type": "Time",
        "name": "System",
        "msg": "2:21"
      },
      {
        "type": "Other",
        "name": "\"靓仔\"",
        "msg": "撤回了一条消息"
      },
      {
        "type": "RedEnvelope",
        "name": "靓仔",
        "msg": "微信转账    点击确认收款    ¥1.00"
      },
      {
        "type": "RedEnvelope",
        "name": "System",
        "msg": "你收到了一次转账收款提醒,请在手机上查看"
      },
      {
        "type": "System",
        "name": "System",
        "msg": "该类型文件可能存在安全风险,建议先检查文件安全性后再打开。"
      },
      {
        "type": "File",
        "name": "靓仔",
        "msg": "size: 1M  ---  file_name: demo.exe"
      },
      {
        "type": "Content",
        "name": "靓仔",
        "msg": "[动画表情]"
      },
      {
      	'type': 'Cited', 
      	'name': '靓仔', 
      	'msg': '🌿 是湖南长沙中国电信大楼吗\n引用 靓仔 的消息 : \n大楼着火'
      },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    由上数据可见,
    type有多种,Time, Other, RedEnvelope, System, File, Content, Cited
    分别代表

    type释义
    Time时间
    Other撤回等
    RedEnvelope红包、转账
    System系统提示
    File文件
    Cited引用
    Content文本内容,表情包等

    完整代码

    # -*- coding: utf-8 -*-
    # @Author : Frica01
    # @Time   : 2022-09-10 15:39
    # @Name   : wechat_operation.py
    
    
    import uiautomation as auto
    
    wx_window = auto.WindowControl(Name='微信', ClassName='WeChatMainWndForPC')
    
    
    def get_chat_records(page: int = 1) -> list:
        """
        获取聊天列表的聊天记录.
    
        Args:
            page(int): 可选参数,如不指定,只获取1页聊天记录
    
        Returns:
            list
        """
        chat_records = list()
    
        def extract_msg() -> None:
            all_msgs = wx_window.ListControl(Name="消息").GetChildren()
            for msg_node in all_msgs:
                msg = msg_node.Name
                if not msg:
                    continue
                if msg_node.PaneControl().Name:
                    chat_records.append({'type': 'Time', 'name': 'System', 'msg': msg_node.PaneControl().Name})
                    continue
                if msg in ['以下为新消息', '查看更多消息', '该类型文件可能存在安全风险,建议先检查文件安全性后再打开。', '已撤回']:
                    chat_records.append({'type': 'System', 'name': 'System', 'msg': msg})
                    continue
                if '撤回了一条消息' in msg or '尝试撤回上一条消息' in msg:
                    chat_records.append(
                        {'type': 'Other', 'name': ''.join(msg.split(' ')[:-1]), 'msg': msg.split(' ')[-1]})
                    continue
                if msg in ['发出红包,请在手机上查看', '收到红包,请在手机上查看', '你发送了一次转账收款提醒,请在手机上查看', '你收到了一次转账收款提醒,请在手机上查看']:
                    chat_records.append({'type': 'RedEnvelope', 'name': 'System', 'msg': msg})
                    continue
                if '领取了你的红包' in msg:
                    _ = msg.split('领取了你的红包')
                    chat_records.append({'type': 'RedEnvelope', 'name': _[0], 'msg': _[1]})
                    continue
                name = msg_node.ButtonControl(foundIndex=1).Name
                if msg == '[文件]':
                    file_name = msg_node.PaneControl().TextControl(foundIndex=1).Name
                    size = msg_node.PaneControl().TextControl(foundIndex=2).Name
                    chat_records.append(
                        {'type': 'File', 'name': name, 'msg': f'size: {size}  ---  file_name: {file_name}'})
                    continue
                if msg == '微信转账':
                    operation = msg_node.PaneControl().TextControl(foundIndex=2).Name
                    amount = msg_node.PaneControl().TextControl(foundIndex=3).Name
                    chat_records.append(
                        {'type': 'RedEnvelope', 'name': name, 'msg': msg + f'    {operation}    ' + amount})
                    continue
                if '引用' in msg and '的消息' in msg:
                    _msg = msg_node.PaneControl().PaneControl().EditControl(foundIndex=1).Name
                    be_cited = msg_node.PaneControl().PaneControl().EditControl(foundIndex=2).Name
                    chat_records.append({'type': 'Cited', 'name': name, 'msg': _msg + '    引用    ' + be_cited})
                    continue
                if msg == '[聊天记录]':
                    if not name:
                        name = msg_node.ButtonControl(foundIndex=2).Name
                chat_records.append({'type': 'Content', 'name': name, 'msg': msg})
    
        for _ in range(page):
            wx_window.WheelUp(wheelTimes=15)
        extract_msg()
        return chat_records
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74

    后话

    如果看不懂代码,可以在下方留言~
    see you.🎈🎈

  • 相关阅读:
    5232: 【J1】【pair】平面上的最接近点对
    C语言有关内存的几个疑问,以memset以及memcpy为例
    快速挖掘设备逻辑洞方法分享
    记一次长连接断开排查过程
    我经历过的职场故事
    SpringMVC学习笔记(三)
    第4季3:Hi3518e的sensor接口引脚复用设置
    萤火商城V2.0开源版[uni-app端],轻量级前后端分离的电商系统,支持微信小程序 + H5+ 公众号 + APP
    POI知识【Java程序操作Excel】
    【云原生】微服务SpringCloud-eureka(server)集群搭建
  • 原文地址:https://blog.csdn.net/weixin_45081575/article/details/126899132