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.pswp.cn/web/79175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79175.shtml
英文地址,請注明出處:http://en.pswp.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 以其簡潔易讀的語法、豐富的庫和框架生態系統,以及強大的跨領域適用性,在計算機領域占據了舉足輕重…