py实现win自动化自动登陆qq

系列文章目录

py实现win自动化自动登陆qq


文章目录

  • 系列文章目录
  • 前言
  • 一、上代码?
  • 总结


前言

之前都是网页自动化感觉太容易了,就来尝尝win自动化,就先写了一个qq登陆的,这个是拿到className 然后进行点击等。


一、上代码?

示例:

import psutil
import time
import os
from pywinauto import Application
from pywinauto.findwindows import find_window
from pywinauto.timings import WaitUntil
from pywinauto import mouseclass QQAutomator:def __init__(self):self.app = Noneself.main_window = Noneself.qq_path = r'D:\itveteranISTool\itveteranExe\qq\QQ.exe'def kill_qq_process(self):"""终止QQ相关进程"""for proc in psutil.process_iter(['pid', 'name']):if proc.info['name'] and proc.info['name'].lower() in ('qq.exe', 'qqschat.exe'):try:proc.kill()time.sleep(1)print(f"已终止进程:{proc.info['name']}")except Exception as e:print(f"终止失败:{e}")def find_qq_window(self, timeout=30):"""定位QQ窗口并打印详细信息"""start_time = time.time()while time.time() - start_time < timeout:try:window = self.app.window(class_name="Chrome_WidgetWin_1",control_type="Pane",title_re=".*QQ.*")if window.exists():self._print_window_details(window)return windowexcept Exception as e:print(f"窗口定位尝试失败:{str(e)}")time.sleep(1)return Nonedef _print_window_details(self, window):"""打印窗口详细信息"""print("=" * 60)print(f"窗口句柄: {window.handle}")print(f"窗口标题: {window.window_text()}")print(f"类名: {window.class_name()}")print(f"坐标范围: {window.rectangle()}")print("控件层次结构:")self._print_control_tree(window, level=0)print("=" * 60)def _print_control_tree(self, control, level=0, max_depth=3):"""递归打印控件树结构"""if level > max_depth:returnprefix = "  " * level + "└─ "try:info = f"{prefix}[{control.friendly_class_name()}] {control.element_info.name}"print(info)for child in control.children():self._print_control_tree(child, level + 1, max_depth)except:passdef click_button(self, button_title, retry=3):"""优化后的点击方法"""for attempt in range(retry):try:# 更精准的定位方式btn = self.main_window.child_window(title=button_title,control_type="Button",found_index=0).wait('ready', timeout=5)if btn.is_visible() and btn.is_enabled():print(f"点击按钮 [{button_title}] (第{attempt+1}次尝试)")btn.click_input()return True# 新增调试信息print(f"按钮状态:visible={btn.is_visible()}, enabled={btn.is_enabled()}")except Exception as e:print(f"按钮定位失败: {str(e)}")time.sleep(2)return Falsedef run(self):"""修复后的主流程"""self.kill_qq_process()if not os.path.exists(self.qq_path):print("路径无效!")returntry:# 增加启动等待self.app = Application(backend='uia').start(self.qq_path)time.sleep(1)  # 等待主进程初始化# 增强窗口定位self.main_window = self.find_qq_window(timeout=40)if not self.main_window:print("窗口定位失败,尝试备用方案...")qq_procs = [p for p in psutil.process_iter() if 'qq' in p.name().lower()]if qq_procs:hwnd = find_window(process=qq_procs[0].pid)self.main_window = self.app.window(handle=hwnd)if not self.main_window:print("❌ 无法定位窗口,退出程序")return# 打印调试信息print("="*40)self.main_window.print_control_identifiers()print("="*40)# 保存控件树self.main_window.print_control_identifiers(filename='control_tree.txt')# 执行点击操作# if self.click_button("添加账号"):#     print("已触发添加账号操作")#     time.sleep(3)  # 等待弹窗if self.click_button("登录"):print("登录请求已发送")self._verify_login()except Exception as e:print(f"主流程异常: {str(e)}")import tracebacktraceback.print_exc()def _verify_login(self):"""修复后的登录验证"""try:print("正在验证登录状态...")WaitUntil(30, 2, lambda: any(p.info['name'] and p.info['name'].lower() in ('qq.exe', 'qqlite.exe')for p in psutil.process_iter(['name'])))print("✅ 检测到QQ主进程,登录成功!")# 附加验证:检测主窗口变化main_window = self.app.window(class_name="Chrome_WidgetWin_0")if main_window.exists():print("✅ 检测到QQ主界面窗口")except TimeoutError:print("❌ 登录验证超时,可能原因:")print("1. 账号密码错误")print("2. 需要处理验证码")print("3. 网络连接异常")current_procs = [p.name() for p in psutil.process_iter()]print(f"当前运行进程:{current_procs}")if __name__ == "__main__":automator = QQAutomator()automator.run()

总结

携知云~ 携手创造知识~ 科技是第一生产力,卷起来

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

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

相关文章

动态创建链表(头插法、尾插法)

今天我们来学习动态创建链表&#xff01;&#xff01;&#xff01; 动态创建链表&#xff1a;分为头插法和尾插法 头插法&#xff08;动态创建&#xff09;&#xff1a; 头插法就是让新节点变成头 代码如下 吐血了&#xff1a;这边有个非常重要的知识点&#xff0c;这边第三…

Dp通用套路(闫式)

闫式dp分析法&#xff1a; 从集合角度来分析DP问题。 核心思想&#xff1a; DP是一种求有限集中的最值或者个数问题 由于集合中元素的数量都是指数级别的&#xff0c;直接用定义去求&#xff0c;把每种方案都用dfs暴力枚举一遍&#xff0c;时间复杂度很高&#xff0c;此时用…

33、前台搜索功能怎么实现?

输入搜索的东西&#xff0c;如果为空 如果有 前端是提交表单&#xff0c;方式是 post 后端接受 调用 mybatisplus的categoryService.getById 用户在搜索框内输入关键字之后&#xff0c;执行 js 中的 load方法&#xff0c;前端提交表单&#xff0c; 后端 controller 中的loa…

Spring Boot 框架概述

1. 简介 Spring Boot 是由 Pivotal 团队开发的一个用于简化 Spring 应用开发的框架。它通过提供默认配置、嵌入式服务器和自动配置等特性&#xff0c;让开发者能够更快速地构建独立的、生产级别的 Spring 应用。 Spring Boot 的主要特点包括&#xff1a; 快速创建独立的 Spri…

机器学习第二讲:对比传统编程:解决复杂规则场景

机器学习第二讲&#xff1a;对比传统编程&#xff1a;解决复杂规则场景 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1a;超详细手把手指南 一、场景…

Jackson Databind

Jackson Databind 是 Java 生态中处理 JSON 数据的核心库之一&#xff0c;主要用于实现 Java 对象与 JSON 数据之间的序列化与反序列化。它是 Jackson 库家族的一部分&#xff0c;通常与 jackson-core 和 jackson-annotations 一起使用&#xff0c;共同完成 JSON 处理任务。 核…

MySQL 中的事务隔离级别有哪些?

MySQL 支持四种标准的事务隔离级别&#xff0c;从低到高依次为&#xff1a;读未提交&#xff08;READ UNCOMMITTED&#xff09;、读已提交&#xff08;READ COMMITTED&#xff09;、可重复读&#xff08;REPEATABLE READ&#xff09; 和 串行化&#xff08;SERIALIZABLE&#x…

RAG优化知识库检索(1):基础概念与架构

1. 引言 大语言模型(LLM)常常面临着知识时效性、幻觉生成、定制化难等挑战,检索增强生成(Retrieval-Augmented Generation, RAG)技术作为解决这些问题的有效方案,正在成为AI应用开发的标准架构。 本文将从基础概念入手,全面介绍RAG技术的核心原理、标准架构与组件,以及评…

安卓工程build.gradle中的Groovy的常见知识点

文章目录 变量定义函数定义函数调用闭包参数APK输出配置多channel配置依赖配置关键总结常见混淆点groovy高度兼容java 变量定义 def debugCdnUrl "\"http://xxx\"" //变量赋值函数定义 def getTime() { // 函数定义&#xff08;def 是 Groovy 中定义变…

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

作者&#xff1a;裘文成&#xff08;翊韬&#xff09; 摘要 随着企业全球化业务的扩展&#xff0c;如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控&#xff0c;已成为关键挑战。 本文聚焦于阿里云高性能日志采集…

deep seek简介和解析

deepseek大合集&#xff0c;百度链接:https://pan.baidu.com/s/10EqPTg0dTat1UT6I-OlFtg?pwdw896 提取码:w896 一篇文章带你全面了解deep seek 目录 一、deep seek是什么 DeepSeek-R1开源推理模型&#xff0c;具有以下特点&#xff1a; 技术优势&#xff1a; 市场定位&…

在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置

在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置如下图所示 将DemClearDTCLimitation参数改成DEM_ALL_SUPPORTED_DTCS 此时0x14 服务就可以支持单个DTC的故障清除&#xff0c; 如果配置成 DEM_ONLY_CLEAR_ALL_DTCS 则只能够用0x14服务清楚所有DTC。

Redis面试 实战贴 后面持续更新链接

redis是使用C语言写的。 面试问题列表&#xff1a; Redis支持哪些数据类型&#xff1f;各适用于什么场景&#xff1f; Redis为什么采用单线程模型&#xff1f;优势与瓶颈是什么&#xff1f; RDB和AOF持久化的区别&#xff1f;如何选择&#xff1f;混合持久化如何实现&#x…

Selenium自动化测试工具常见函数

目录 前言 一、什么是自动化&#xff1f; 二、元素的定位 三、测试对象的操作 3.1输入文本send_keys() 3.2按钮点击click() 3.3清除文本clear() 3.4获取文本信息text 3.5获取页面的title与URL 四、窗口 4.1窗口的切换switch_to.window() 4.2窗口大小设置 …

seata 1.5.2 升级到2.1.0版本

一、部署1.5.2 1、解压缩 tar -xvf apache-seata-***-incubating-bin.tar.gz 2、修改conf下的application.yml 只需要修改seata下的此配置&#xff0c;然后再nacos中添加其它配置&#xff0c;下面是application.yml的配置&#xff1a; server:port: 7091spring:applic…

Vue知识框架

一、Vue 基础核心 1. 响应式原理 数据驱动&#xff1a;通过 data 定义响应式数据&#xff0c;视图自动同步数据变化。 2、核心机制 Object.defineProperty&#xff08;Vue 2.x&#xff09;或 Proxy&#xff08;Vue 3.x&#xff09;实现数据劫持。依赖收集&#xff1a;追踪…

Nginx静态资源增加权限验证

Nginx静态资源增加权限验证 一、前言二、解决思路2.1、方式一2.2、方式二三、代码3.1、方式一3.1.1、前端代码3.1.2、后端代码3.1.3、Nginx调整3.1.4、注意事项3.2.方式二四、参考资料一、前言 在项目开发的过程中,项目初期,及大部分小型项目都是使用共享磁盘进行静态文件的…

分析NVIDIA的股价和业绩暴涨的原因

NVIDIA自2016年以来股价与业绩的持续高增长&#xff0c;是多重因素共同作用的结果。作为芯片行业的领军企业&#xff0c;NVIDIA抓住了技术、战略、市场与行业趋势的机遇。以下从技术创新、战略布局、市场需求、财务表现及外部环境等维度&#xff0c;深入分析其成功原因&#xf…

更换芯片后因匝数比变化,在长距离传输时出现通讯问题。我将从匝数比对信号传输的影响、阻抗匹配等方面分析可能原因,并给出相应解决方案。

匝数比影响信号幅度与相位&#xff1a;原 HM1188 芯片匝数比 1:1&#xff0c;信号在变压器原副边传输时幅度基本不变&#xff1b;更换为 XT1188 芯片&#xff08;匝数比 1:2&#xff09;后&#xff0c;根据变压器原理&#xff0c;副边输出信号幅度会变为原边的 2 倍。短距离 10…

Python引领前后端创新变革,重塑数字世界架构

引言:Python 在前后端开发的崭新时代 在当今数字化时代,软件开发领域持续创新,而 Python 作为一门功能强大、应用广泛的编程语言,正引领着前后端开发的变革浪潮。Python 以其简洁易读的语法、丰富的库和框架生态系统,以及强大的跨领域适用性,在计算机领域占据了举足轻重…