python_uiautoanimation实现自动化微信聊天

文章目录

    • ⭐前言
    • ⭐微软inspect工具定位元素
      • 💖工具查找属性
    • ⭐查找微信窗口
      • 💖命令行查找运行窗口
    • ⭐查找微信的聊天窗口
    • ⭐封装发送消息
    • ⭐定时查询消息
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享python_uiautoanimation实现自动化微信聊天。

uiautoanimation简介

uiautomation封装了微软UIAutomation API,支持自动化Win32,MFC,WPF,Modern UI(Metro UI), Qt, IE, Firefox(version<=56 or >=60

开源文档:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows?tab=readme-ov-file

python系列文章
python爬虫_基本数据类型
python爬虫_函数的使用
python爬虫_requests的使用
python爬虫_selenuim可视化质量分
python爬虫_django+vue3可视化csdn用户质量分
python爬虫_正则表达式获取天气预报并用echarts折线图显示
python爬虫_requests获取bilibili锻刀村系列的字幕并用分词划分可视化词云图展示

⭐微软inspect工具定位元素

💖工具查找属性

官方地址:https://learn.microsoft.com/zh-cn/windows/win32/winauto/inspect-objects
打开inspect点击元素即可查找属性,这里我查找微信小程序平台的窗口
在这里插入图片描述

⭐查找微信窗口

💖命令行查找运行窗口

pip 安装 automation 在scripts目录下运行automation.py

automation.py -t 0
# 打印当前激活窗口的所有控件
automation.py -r -d 1 -t 0
# 打印桌面(树的根控件 )和它的第一层子窗口(TopLevel顶层窗口)

⭐查找微信的聊天窗口

首先查找微信主窗口

import uiautomation as auto
if __name__=='__main__':
    global wechatWindow
    wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
    print('wechatWindow',wechatWindow)

查找窗口
在这里插入图片描述

⭐封装发送消息

查找输入框
在这里插入图片描述

def sendMsg(wechatWindow,msg):
    # 群聊
    edit = wechatWindow.EditControl(Name='微信小程序平台')
    prefix=""
    edit.SendKeys(prefix+msg)
    sendButton = wechatWindow.ButtonControl(Name='发送(S)')
    sendButton.Click()

⭐定时查询消息

定位消息元素
定时查找消息
遇到@回复消息

import uiautomation as auto
import json,time
import requests,json

API_KEY = "API_KEY "
SECRET_KEY = "SECRET_KEY "

def receive_commend(url, message):
    payload = json.dumps({
        "messages": [
            {
                "role": "user",
                "content": message
            }
        ]
    })
    headers = {
        'Content-Type': 'application/json'
    }
    response = requests.request("POST", url, headers=headers, data=payload)
    if response.status_code == 200:
        return response.json()['result']
    else:
        return response.text

def get_access_token():
    url = "https://aip.baidubce.com/oauth/2.0/token"
    params = {"grant_type": "client_credentials", "client_id": API_KEY, "client_secret": SECRET_KEY}
    return str(requests.post(url, params=params).json().get("access_token"))

def ai_answer(question):
    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=" + get_access_token()
    return receive_commend(url, question)


def sendMsg(wechatWindow,msg):
    # 群聊
    edit = wechatWindow.EditControl(ProcessId='微信小程序平台')
    prefix=""
    edit.SendKeys(prefix+msg)
    sendButton = wechatWindow.ButtonControl(Name='发送(S)')
    sendButton.Click()

def writeJson(data,name):
    with open("./db/"+name, 'w', encoding='utf-8') as write_f:
        write_f.write(json.dumps(data, indent=4, ensure_ascii=False))

def saveOldChatJson(data):
    writeJson(data,'oldChat.json')

def saveNewChatJson(data):
    writeJson(data,'newChat.json')


def openNewJson():
    with open("./db/newChat.json", 'r', encoding='utf-8') as open_f:
        content = open_f.read()
        readJson = json.loads(content)
        return readJson

def openOldJson():
    with open("./db/oldChat.json", 'r', encoding='utf-8') as open_f:
        content = open_f.read()
        readJson = json.loads(content)
        return readJson


def getMsg(wechatWindow):
    oldJson=openOldJson()
    newChatFileJson=openNewJson()
    wechatWindow.SetFocus()
    messages = wechatWindow.ListControl(Name='消息')
    replyRes = []
    chatRes=[]
    # 备份
    newJson=oldJson
    markFont = '@robot\u2005'
    sendTime='empty_time'
    isCall = '否'
    isFinish = '否'
    # 新的聊天记录
    newChatJson={}
    print('messages',messages)
    map_index=0
    max_len=len(messages.GetChildren())
    for i in range(1):
        if max_len <=0:
            break
        message=messages.GetChildren()[max_len-1]
        #     跳过

        print('message',message)
        content = message.Name
        print('content',content)

        if content in ["查看更多", "以下为新消息","以下是新消息"]:
            print('匹配新消息')
            continue
        details = message.GetChildren()[0].GetChildren()
        if len(details) == 0:
            sendTime = content
            continue
        name=''
        detail=''
        me=''
        print('details', details)
        nickname, detail, me = details
        name = nickname.Name

        print('nickname, detail, me',nickname, detail, me)
        if me.Name:
            name = me.Name
        if name == markFont:
            continue
        if not (content == "[图片]" or content.startswith("[语音]")):
            details = detail.GetChildren()
            if len(details) == 0:
                continue
            detail = details[-1].GetChildren()[0].GetChildren()[0].GetChildren()[0]
            details = detail.GetChildren()

            if len(details) != 0:
                link_title = details[0].Name
                link_content = details[1].Name
                content += link_title+'/n'+link_content
        recieveMsg=content.strip()
        # 本人 聊天跳过(出现在newChat.json则跳过)
        if  sendTime in newChatFileJson.keys() \
            or isinstance(sendTime,str) \
                and sendTime in oldJson.keys() \
                and'isFinish' in oldJson[sendTime].keys() \
                and oldJson[sendTime]['isFinish'] == '是'\
                and oldJson[sendTime]['content']==recieveMsg:
            print('time empty___',oldJson[sendTime])
            continue
        elif(markFont in recieveMsg and name != markFont ):
            isCall='是'
            askQuestion=recieveMsg.replace(markFont,'')
            print(askQuestion)
            if askQuestion:
                prefix='@'+name+'\u2005关于“'+askQuestion+'”的回复: '
                sendMsg(wechatWindow,prefix+ai_answer(askQuestion))
                isFinish='是'
                # 写入数据
                replyRes.append([sendTime, name, recieveMsg, isCall, isFinish])
        #       新的聊天记录
        chatRes.append([sendTime, name, recieveMsg])


    # 替换 旧消息
    for item in replyRes:
        timeItem=item[0]
        if isinstance(timeItem,str):
            # 已回复的消息
            newJson[str(timeItem)]={
                "name":item[1],
                "content":item[2],
                "isFinish":item[4]
            }
    # 替换
    for item in chatRes:
        timeItem=item[0]
        if isinstance(timeItem,str):
            # 新的消息回复
            newChatJson[str(timeItem)]={
                "name":item[1],
                "content":item[2]
            }
    # 已回复的记录
    saveOldChatJson(newJson)
    # 新的消息回复
    saveNewChatJson(newChatJson)
    re_run()

def re_run():
    time.sleep(3)
    global wechatWindow
    getMsg(wechatWindow)

if __name__=='__main__':
    global wechatWindow
    wechatWindow = auto.WindowControl(searchDepth=1, Name="微信", ClassName='WeChatMainWndForPC')
    print('wechatWindow',wechatWindow)
    getMsg(wechatWindow)



定时轮询查找消息调用chatgpt回复
在这里插入图片描述

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
在这里插入图片描述

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

平价头戴式蓝牙耳机有哪些?四款公认平价性能超强品牌机型推荐

在追求高品质音乐体验的同时&#xff0c;许多消费者希望找到价格亲民的头戴式蓝牙耳机&#xff0c;市场上不乏性能卓越、价格实惠的产品&#xff0c;它们凭借出色的音质、舒适的佩戴体验和可靠的续航能力赢得了用户的青睐&#xff0c;那么在众多的头戴式蓝牙耳机内&#xff0c;…

提高数据集成稳定性:EMQX Platform 端到端规则调试指南

自 5.7.0 版本起&#xff0c;EMQX 支持了 SQL 调试&#xff0c;并支持在数据集成全流程中进行规则调试&#xff0c;使用户能够在开发阶段就全面验证和优化规则&#xff0c;确保它们在生产环境中的稳定高效运行。 点击此处下载 EMQX 最新版本&#xff1a;https://www.emqx.com/z…

移动开发(三):使用.NET MAUI打包第一个安卓APK完整过程

目录 一、修改AndroidManifest.xml 配置APP基本信息权限 二、修改项目属性调整输出Android包格式为APK 三、项目发布 四、APP分发 五、总结 之前给大家介绍过使用使用.NET MAUI开发第一个安卓APP,今天给大家介绍如何打包成APK,然后安装到安卓手机正常运行。这里还是沿用…

java序列化对象后读取数据错误的问题

今天学到了对象的序列化&#xff0c;就是将对象写入到文件中去&#xff0c;大家要直到我们普通的输入输出文件只是把数据的值写入了文件&#xff0c;而没有把数据的类型与之绑定&#xff0c;比如我向文件中写入100&#xff0c;那么这是字符串”100“还是整数100还是高精度浮点数…

算法.图论-建图/拓扑排序及其拓展

文章目录 建图的三种方式邻接矩阵邻接表链式前向星 拓扑排序拓扑排序基础原理介绍拓扑排序步骤解析拓扑排序模板leetcode-课程表 拓扑排序拓展食物链计数喧闹与富有并行课程 建图的三种方式 我们建图的三种方式分别是邻接矩阵, 邻接矩阵, 链式前向星 邻接矩阵 假设我们的点的…

Android14请求动态申请存储权限

Android14请求动态申请存储权限 Android14和Android15存储权限有增加多了选择部分&#xff0c;还是全部。一个小小的存储权限真的被它玩出了花来。本来Android13就将存储权限进行了3个细分&#xff0c;是图片&#xff0c;音频还是视频文件。 步骤一&#xff1a;AndroidManife…

24年蓝桥杯及攻防世界赛题-MISC-2

11 Railfence fliglifcpooaae_hgggrnee_o{cr} 随波逐流编码工具 分为5栏时,解密结果为:flag{railfence_cipher_gogogo} 12 Caesar rxms{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz} mode1 #12: flag{you_have_learned_caesar_encryption} 随波逐流编码工具 13 base64 base64解…

【machine learning-十-梯度下降-学习率】

学习率 学习率不同的学习率 在梯度下降算法中&#xff0c;学习率的选择很重要&#xff0c;不恰当的选择&#xff0c;甚至可能导致损失发散&#xff0c;而非收敛&#xff0c;下面就看一下学习率的影响。 学习率 学习率是下图中的红框圈出来的部分&#xff0c; 学习率是模型的超…

虹科干货 | CAN/CAN FD故障揭秘:快速排查与解决技巧

是否在处理CAN总线问题时感到头疼&#xff1f;是否在寻找简单直接的方法来解决那些看似复杂的连接故障&#xff1f;本文将为您提供实用技巧&#xff0c;让您能够轻松应对这些难题。 CAN总线因其高效、可靠的数据交换能力&#xff0c;在汽车、工业控制、航空航天等多个关键领域得…

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…

Linux Vim编辑器常用命令

目录 一、命令模式快捷键 二、编辑/输入模式快捷键 三、编辑模式切换到命令模式 四、搜索命令 注&#xff1a;本章内容全部基于Centos7进行操作&#xff0c;查阅本章节内容前请确保您当前所在的Linux系统版本&#xff0c;且具有足够的权限执行操作。 一、命令模式快捷键 二…

图像生成大模型imagen

Imagen 是由谷歌研究团队开发的一种先进的图像生成大模型。它基于文本描述生成高质量的图像&#xff0c;是人工智能在生成视觉内容方面的一大突破。 Imagen 的主要特点包括&#xff1a; 1. 高分辨率和高质量&#xff1a;Imagen 生成的图像具有高分辨率和高质量&#xff0c;细…

springboot宠物智慧医院-计算机毕业设计源码99362

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3微信开发者工具 1.4小程序框架以及目录结构介绍 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2…

模拟电路分析基础知识总结笔记(电子电路分析与设计前置知识)

必备条件 电子电路的直流分析电子电路的正弦稳态分析RC电路的瞬态分析戴维南定理和诺顿定理拉普拉斯变换&#xff08;看不懂&#xff0c;根本看不懂&#xff09; 电子电路的直流分析 欧姆定律 ​ 在恒定温度下&#xff0c;电压与电流成正比&#xff0c;电压与电阻成正比&am…

对 JavaScript 原型的理解

笔者看了一些有关 JavaScript 原型的文章有感而发&#xff0c;就将所感所悟画了下来如果有理解错误和不足的地方&#xff0c;欢迎各位大佬指出&#xff0c;笔者感激不尽

企业热门进销存管理系统源码 助力中小企业实现低成本实现信息化 带源代码包以及搭建部署教程

系统概述 这款企业热门进销存管理系统是专为中小企业设计开发的综合性管理平台。它涵盖了采购、销售、库存管理等核心业务流程&#xff0c;能够实现企业内部各个环节的紧密连接和协同运作。通过信息化手段&#xff0c;系统能够实时记录和监控企业的业务数据&#xff0c;为企业…

微服务保护学习笔记(五)Sentinel授权规则、获取origin、自定义异常结果、规则持久化

文章目录 前言4 授权规则4.1 基本原理4.2 获取origin4.3 配置授权规则 5 自定义异常结果6 规则持久化 前言 微服务保护学习笔记(一)雪崩问题及解决方案、Sentinel介绍与安装 微服务保护学习笔记(二)簇点链路、流控操作、流控模式(关联、链路) 微服务保护学习笔记(三)流控效果(…

【STL】string 基础,应用与操作

string 1.string相关介绍 STL&#xff08;标准模板库&#xff09;中的string容器是C标准库提供的用于处理和操作字符串的类&#xff0c;位于头文件中。std::string提供了比传统的C风格字符串&#xff08;字符数组&#xff09;更方便和安全的功能&#xff0c;具有动态内存管理…

Redis常见应用场景

目录 一、实现博客点赞功能 二、实现博客点赞用户列表功能 三、好友关注和取关以及求共同关注 四、实现关注推送 1、拉模式 2、推模式 3、推拉结合 四、三种模式对比 这里简单记录一下&#xff0c;没有实现方法&#xff0c;只是帮助记忆 一、实现博客点赞功能 可以通…

六、JSON

文章目录 1. 什么是JSON1.1 JSON 在 JavaScript 中的使用1.1.1 json 的定义1.1.2 json 的访问1.1.3 json 的两个常用方法 1.2、JSON 在 java 中的使用1.2.1、javaBean 和 json 的互转1.2.2、List 和 json 的互转1.2.3、map 和 json 的互转 1. 什么是JSON 1.1 JSON 在 JavaScrip…