Python uiautomation获取微信内容!聊天记录、聊天列表、全都可获取

news2024/12/25 13:18:35

Python uiautomation 是一个用于自动化 GUI 测试和操作的库,它可以模拟用户操作来执行各种任务。
通过这个库,可以使用Python脚本模拟人工点击,人工操作界面。本文使用 Python uiautomation 进行微信电脑版的操作。

以下是本次实验的版本号。

你需要安装 uiautomation

pip install uiautomation

示例代码

import time
import uiautomation as auto
import re
from plyer import notification
 
notification_history = {}  # 历史消息
 
def check_wechat_messages():
 
    # 获取微信窗口
    wechat_win = auto.WindowControl(Name="微信", ClassName="WeChatMainWndForPC")
 
    shoukuanWin = wechat_win.ListControl(Name="会话")
    bbb = shoukuanWin.GetChildren()
 
    for chatMsg in bbb:
        if "条新消息" in chatMsg.Name:
 
            # 计算消息条数
            match = re.match(r'([a-zA-Z0-9]+)(\d+)条新消息', chatMsg.Name)
 
            if match:
                nickname = match.group(1)
                message_count = int(match.group(2))
 
                printInfo = f"{nickname} 给你发送了 {message_count} 条消息"
                print(printInfo)
                print("------------")
 
                # 获取消息列表控件
                xiaoxis = wechat_win.ListControl(Name="消息")
                 
                # 获取消息列表控件的子控件
                xiaoxi_children = xiaoxis.GetChildren()
 
                # 获取最后一个子控件
                last_xiaoxi = xiaoxi_children[-1]
 
                # 打印最后一条消息的内容
                print(last_xiaoxi.Name)
 
                # 在指定时间内不重发
                last_notification_time = notification_history.get((nickname, message_count), 0)
                current_time = time.time()
 
                if current_time - last_notification_time > 15:
 
                    # 依次发送
                    notification_title = f"来自 {nickname} 的 {message_count} 条消息"
                    notification_message = f"{last_xiaoxi.Name}"
 
                    notification.notify(
                        title=notification_title,
                        message=notification_message,
                        app_name="WeChat"
                    )
 
                    # 更新日志
                    notification_history[(nickname, message_count)] = current_time
 
if __name__ == "__main__":
    try:
        while True:
            check_wechat_messages()
            time.sleep(2)  #2秒检测一次UI组件
    except KeyboardInterrupt:
        print("程序退出~")
    except Exception as e:
        print(f"程序执行出现了问题: {str(e)}")

代码解析:

以上代码使用 uiautomation 实时获取微信聊天列表的消息状态,一旦有消息发过来,就会获取到发送人的微信昵称以及发送的消息内容、消息个数。

每2秒获取一次UI控件的内容,实测挂在后台对CPU和内存占用并无明显影响,结合Python uiautomation的各种用法,可以做成自动回复的功能。使用这款软件,可以获取到微信电脑版大部分控件的内容。例如:微信聊天列表、群名称、好友微信昵称、群人数、微信号等。 

还可以获取到群内的每一条聊天内容,获取到你跟好友的聊天记录。 

只要 UISpy.exe 可获取到的控件内容,那么你用 Python就可以获取到。

拓展

还可以用来做收款监控。将【微信收款助手】这个公众号单独窗口出来,然后监控这个窗口。

妥妥的实现了一个PC收款监控。可以用来做收款码的支付回调。

import uiautomation as auto
import re
import time
 
def get_children_at_depth(control, target_depth, current_depth=0):
    children = control.GetChildren()
    result = []
 
    for child in children:
        if current_depth == target_depth:
            result.append(child)
        else:
            result.extend(get_children_at_depth(child, target_depth, current_depth + 1))
 
    return result
 
def process_last_child_information(previous_info):
    weixin = auto.WindowControl(Name="微信收款助手", ClassName="ChatWnd")
    xiaoxi = weixin.ListControl(Name="消息")
 
    target_depth = 5
    depth_5_children = get_children_at_depth(xiaoxi, target_depth)
 
    # 正则表达式模式
    pattern = r'收款到账通知(\d+月\d+日 \d+:\d+)收款金额¥([0-9.]+)汇总'
 
    last_child = None
 
    for child in depth_5_children:
        match = re.search(pattern, child.Name)
        if match:
            last_child = child  # 保存最后一条子控件的引用
 
    # 在循环结束后,提取最后一条子控件的信息
    if last_child:
        match = re.search(pattern, last_child.Name)
        if match:
            date_time = match.group(1)
            amount = match.group(2)
 
            # 监听下一笔
            if (date_time, amount) != previous_info:
                print("收款回调:")
                print(date_time)
                print("金额:", amount)
                print("正在等待下一笔...")
                print("----------")
 
                previous_info = (date_time, amount)
 
    return previous_info
 
# 循环
previous_info = None
 
while True:
    previous_info = process_last_child_information(previous_info)
    # 每2秒执行一次循环
    time.sleep(2)

请勿使用这种技术用于非法行为,仅供大家开发一写小工具自己用。

如果使用这种技术来进行违法行为所带来的责任自行负责,与工具、教程作者、发布的平台无关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1224485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM虚拟机:通过日志学习PS+PO垃圾回收器

我们刚才设置参数的时候看到了-XXPrintGCDetails表示输出详细的GC处理日志,那么我们如何理解这个日志呢?日志是有规则的,我们需要按照这个规则来理解日志中的内容,它有两个格式,一个格式是GC的格式(新生代&…

JavaEE进阶(1)Java EE 简述(Java EE 发展历程、什么是Web开发? Web网站的工作流程、什么是框架?Java EE 框架学习概览)

目录 Java EE 简述 Java EE 发展历程 什么是Web开发? Web网站的工作流程 什么是框架 框架的定义 源于建筑行业的类比 框架的作用 Java EE 框架学习概览 1. Spring 2. Spring Boot 3. Spring MVC 4. Mybatis 框架之间的关系 Java EE 简述 Java EE是Java平台的企…

谈谈如何写作(二)

序言 没有什么比一套好理论更有用了。——库尔特勒温 谈谈如何写作系列今天进入第二篇,第一篇请速戳:谈谈如何写作(一) 今天,博主从如何写报告讲起。 Q:如何写报告 如何写报告呢? 当每位盆友接到…

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS

802.11-2020协议学习__专题__TxTime-Calculation__HR/DSSS 16.2.2 PPDU format16.2.2.1 General16.2.2.2 Long PPDU format16.2.2.3 Short PPDU format 16.3.4 HR/DSSS TXTIME calculation PREV: TBD NEXT: TBD 16.2.2 PPDU format 16.2.2.1 General 定…

【2023春李宏毅机器学习】生成式学习的两种策略

文章目录 1 各个击破2 一步到位3 两种策略的对比 生成式学习的两种策略:各个击破、一步到位 对于文本生成:把每一个生成的元素称为token,中文当中token指的是字,英文中的token指的是word piece。比如对于unbreakable,他…

统计量及抽样分布

1.常用统计量 (1)样本均值 反映总体X数学期望的信息,是最常用的统计量。 (2)样本方差 反映总体X方差的信息。 (3)样本变异系数 反映总体变异系数C的信息,用来刻画离散程度。 &am…

数据结构与算法【堆】的Java实现

前言 之前已经说过堆的特点了,具体文章在数据结构与算法【队列】的Java实现-CSDN博客。因此直接实现堆的其他功能。 建堆 所谓建堆,就是将一个初始的堆变为大顶堆或是小顶堆。这里以大顶堆为例。展示如何建堆。 找到最后一个非叶子节点从后向前&…

RT-Thread基于STM32H743的网络通信调试

使用STM32H743开发网络通信,本以为会很简单,实际却遇到好多问题,记录一下,以备后续查看。 1.新建工程,系统版本选择的是4.1.1,芯片型号是STM32H743IIK6. 2.修改系统时钟,使用外部25MHz晶振&…

linux环境下启动应用的不同方式对比分析

大家好,我是G探险者。 平时我们在Linux环境下启动Java应用程序时。可能会选择在前台或后台运行它们。但是这两者启动命令的各种参数含义是什么意思呢,今天我们就来聊聊,并分析一下他们的特点。 1. 前台启动 参数: java: Java程…

图像分类(二) 全面解读复现ZFNet

网络详解 前言:ZF网络是2013年提出的,网上有很多关于它的介绍和讲解,但是很多内容讲的不太好(个人感觉),于是花时间收集了一些资料,整理了一些比较好的文章,从头到尾把ZFNet说了一遍…

ControlNet原理及应用

《Adding Conditional Control to Text-to-Image Diffusion Models》 目录 1.背景介绍 2.原理详解 2.1 Controlnet 2.2 用于Stable Diffusion的ControlNet 2.3 训练 2.4 推理 3.实验结果 3.1 定性结果 3.2 消融实验 3.3 和之前结果比较 3.4 数据集大小的影响 4.结…

最常用的结构体初始化方式

结构体最常用的初始化方式就是用memset把这块区域清0 注意不能这么写 STU stu[5]; stu (STU*)malloc(sizeof(stu)); 数组名不允许被赋值,它只是个表达式

【Python】Loguru模块更简洁的日志记录库

Loguru: 更优雅的日志记录解决方案! loguru 是一个Python 简易且强大的第三方日志记录库,该库旨在通过添加一系列有用的功能来解决标准记录器的注意事项,从而减少 Python 日志记录的痛苦。 使用自带自带的 logging 模块的话,则需要…

ZHUTI主提2024春夏 聆听「宁静的声音」

将自然艺术触达生活 生活与艺术实践活动 ZHUTI主提2024春夏艺术活动「宁静的声音」,将自然艺术真实的触达生活为核心,将原野聚会、黑胶音乐、插花、咖啡、食物、舞蹈、服装等艺术与生活的元素组合在这场芦苇荡中,用一场兼具无穷畅想和独特审…

μC/OS-II---事件标志组管理1(os_flag.c)

目录 事件标志组创建事件标志组删除事件标志组获取/等待当任务要与多个事件同步时,就要使用事件标志组。一个事件标志就是一个二值信号,事件标志组是若干二值信号的组合。使用事件标志组同步任务分为独立性同步和关联性同步。事件标志组创建 flags:事件标志组的初始值。OS_F…

Python中的实例属性和类属性

在这篇文章中,我们将探讨Python中的类是如何工作的,主要介绍实例和类的属性。这些属性是什么,它们之间的区别,以及创建和利用它们的python方法。 类属性与实例属性 首先,我们需要知道什么是实例。实例是属于类的对象。…

麒麟 ZYJ 服务器软件适配 参考示例

一、zyj 环境简介 1. ZYJ 概述 国产化 SMZYJ 是由国家 BM 主管部门鉴定并批准生产使用的国内自主开发的 整机 JM 国标设备,设备采用了自主设备基础硬件(飞腾、国科微等)、安全硬 件自主固件(昆仑等)自主 SM 专用操作…

Linux嵌入式I2C协议笔记

硬件: 1.I2C结构 在一个SOC中有一个或者多个I2C控制器,一个I2C控制器可以连接一个或多个I2C设备。 I2C总线需要两条线,时钟线SCL和数据线SDA 2.I2C传输数据格式 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。结束信号(P):SCL为高电平时,SDA…

【算法萌新闯力扣】:找到所有数组中消失对数字

力扣热题:找到所有数组中消失对数字 开篇 这两天刚交了蓝桥杯的报名费,刷题的积极性高涨。算上打卡题,今天刷了10道算法题了,题目都比较简单,挑选了一道还不错的题目与大家分享。 题目链接:448.找到所有数组中消失对…

【C++】类和对象(7)--友元, static成员

目录 一 友元 1 友元概念 2 友元函数 3 友元类 二 static成员 1 概念 2 用法 3 static成员特性 4 例题 一 友元 1 友元概念 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以 友元不宜多用。 …