系列文章目錄
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()
總結
攜知云~ 攜手創造知識~ 科技是第一生產力,卷起來