還記得小時候玩Game的時候,為了重複性的練功,會下載按鍵精靈這樣的工具程式來編排巨集指令,讓遊戲角色自動練功,釋放雙手。 PyAutoGUI就是這樣的東西,也許有人不知道按鍵精靈是怎樣的程式,但簡單來說,就是透過程式,來模擬人類操作滑鼠、鍵盤的行為,來達到自動化。 而PyAutoGUI,使用了python這樣的語言,讓使用者可以不只控制鍵盤滑鼠、還能透過比對畫面上的圖片,來做出滑鼠的點選。是不是相當有趣,而且這樣很貼近使用者的上層開發工具,也可以同時跟其他套件:例如 – Selenium等結合。做出更厲害的自動化腳本。 Show 在開始之前,請確認你已經有Python開發的環境與工具,若你還沒準備好,可以參考這篇,安裝好開發環境再回來繼續學習。 Python超好用基本開發工具 – Anaconda + Atom Editor with Packages 另外,若您想要的是透過自動化程式控制瀏覽器,下面這篇也可以參考 Python自動化工具 – Selenium 機器人般的瀏覽器 什麼是PyAutoGui? 除了一般的功能以外,主要PyAutoGUI 控制自動化的方式可以分成下面四個類別: Mouse 控制滑鼠移動、左鍵、右鍵等。 Keyboard 模擬按鍵、組合鍵。關於按鍵的控制,這邊有更詳細的說明。 Message Box 可以控制用JavaScript樣式的訊息對話框,這邊有更詳盡的說明。 Screenshot 透過螢幕擷取、比對圖片找出位置,進行其他滑鼠鍵盤的搭配控制。 如何安裝? 安裝的方式非常簡單,若您也是使用下面這篇的教學方法所建立的開發環境 Python超好用基本開發工具 – Anaconda + Atom Editor with Packages 恭喜你,那安裝的方式非常簡單。 只要在虛擬環境的終端機內,輸入
任選其中一種即可, 等它跑完就完成了。 開始試用 PyAutoGUI最常用的一定是控制滑鼠鼠標移動,但是在移動之前,我們必須要先知道滑鼠回報的位置。因此我們可以先撰寫下面的程式碼,透過displayMousePosition() 的function 來持續回報滑鼠座標,如此一來就能逐步記錄你想點擊的按鈕或圖片位置。
按下F5 執行,接著可以試試看移動滑鼠,就能很明顯看到視窗裡面的座標數值不停的變化。 X ,Y 值就是滑鼠在你的螢幕上的位置;如此一來,就能把你要控制的地方,預先做個紀錄。 這個function會不停地回報滑鼠位置接下來我們試試看,以Twitter的註冊頁面為例子,初步了解一下如何應用pyAutoGUI 進行程式撰寫。 先抓出各個按鈕在螢幕上X,Y座標用下面的程式碼,測試一下
果然,滑鼠自動移動到註冊按鈕的位置,並且完成自動點擊。如此一來就能搭配下面的指令查找表,來組合出更多的應用了。 常用指令查找表 下面連結是官方的說明文件 – Cheat-Sheet https://pyautogui.readthedocs.io/en/latest/quickstart.html#cheat-sheet Cheat Sheet結論 相較於其他自動化的套件;如Selenium或Scrapy,這個pyAutoGUI更多了一點人味,可以透過滑鼠的移動,甚至自己加上亂數的等待秒數,或是產生非線性的滑鼠移動軌跡,都能大大的模擬出真人操作的感覺,在某些特別防備機器人網站,能讓自動化擁有更多的彈性。 另外,視覺化與直觀的編程思路,也讓新手或是一般非程式設計人員更容易切入自動化的領域。 若能整合其他工具,例如Selenium等,幾乎在網頁自動化的領域上,涵蓋了各種應用情境。總之,若您有在用Python或有自動化的需求; PyAutoGUI 實在是非常推薦,讓人非學不可且容易上手的套件。 使用電腦的過程中,與桌面應用程式互動,例如針對特定位置連點兩下開啟檔案,或是對特定圖示進行點按,已經是平常不過的事,倘若這些操作流程需要重複操作,可能會造成使用者的困擾、增加工作量,甚至是大幅降低對工作或生活的熱忱,有鑑於此,我們需要一個自動化的機制,協助我們完成重複的工作,讓人們專注在更重要的事情上。本文中,我們將使用PyAutoGUI,讓程式進行基本的圖片辨識,取得圖片在電腦螢幕上的座標,進行互動,亦可透過取得座標的 RGB 值,來判斷何時應該對畫面進行點擊與互動,達到自動化的目標。
前言PyAutoGUI是一個跨平台(cross-platform)的圖形化使用者介面(Graphical User Interface,GUI)自動化 Python 套件與模組,協助使用者透過程式控制電腦的滑鼠(Mouse)和鍵盤(Keyboard),除此之外,還能在桌面環境輸出訊息框(Message Box)以及螢幕截圖(Screenshot)。 本文使用的測試環境為Windows10教育版、Python 3.8以上版本,同時提供兩個案例說明:開啟小算盤(計算機),自動讀取按鈕截圖,判斷按鈕是否在螢幕畫面當中,同時取得該按鈕的座標,進行點擊;開啟網頁休閒遊戲的頁面,決定合適的點擊座標,取得RGB值,藉以判斷何時應該點擊,以及設定點擊的間隔時間。
前置作業進行自動化程式撰寫前,需要先安裝案例中所用到的套件;讀者若有習慣的安裝方式,可以自行客製化。
套件安裝指令 pip install pyautogui opencv-python opencv-contrib-python keyboard
參考函式列表圖1 滑鼠功能
圖2 鍵盤功能
圖3 訊息框與截圖功能
如果需要透過 PyAutoGUI來按下鍵盤,以下提供按鍵名稱(key_name)參考:
圖4 PyAutoGUI的key_name列表
匯入模組使用套件與模組 import pyautogui, cv2 from time import sleep, time import keyboard from IPython.display import clear_output
自動使用小算盤(計算機)我們需要對部分按鈕進行截圖,幫助程式辨識該按鈕的中心點座標: 圖5 依需求取得按鈕的截圖
圖6 本案例所選擇的按鈕圖片,存放在專案的images資料夾當中
程式碼 '''自動使用計算機補充: 此時計算機應該明顯出現在桌面上,不然會有判斷錯誤的問題 設定 confidence 是為了解決圖像誤差的問題(可參考 OpenCV 關於 confidence 的說明)。由於每個人電腦的解析度與色彩設定不盡相同,若是將按鈕截圖與他人分享,可能會造成辨識上的誤差,此時可以修改該值,來完成比對;如果還是無法正常比對,建議自行截圖,此時圖片最接近本機的設定。''' # 設定每一個動作,都暫停若干秒pyautogui.PAUSE = 0.1 # 比對所有圖片,取得顯示在桌面的圖片物件btn_0_location = pyautogui.locateOnScreen('images/0.png', confidence=0.9)btn_1_location = pyautogui.locateOnScreen('images/1.png', confidence=0.9)btn_2_location = pyautogui.locateOnScreen('images/2.png', confidence=0.9)btn_3_location = pyautogui.locateOnScreen('images/3.png', confidence=0.9)btn_5_location = pyautogui.locateOnScreen('images/5.png', confidence=0.9)btn_6_location = pyautogui.locateOnScreen('images/6.png', confidence=0.9)btn_7_location = pyautogui.locateOnScreen('images/7.png', confidence=0.9)btn_8_location = pyautogui.locateOnScreen('images/8.png', confidence=0.9)btn_plus_location = pyautogui.locateOnScreen('images/plus.png', confidence=0.9)btn_multiply_location = pyautogui.locateOnScreen('images/multiply.png', confidence=0.9)btn_subtract_location = pyautogui.locateOnScreen('images/subtract.png', confidence=0.9)btn_equal_location = pyautogui.locateOnScreen('images/equal.png', confidence=0.9)btn_dot_location = pyautogui.locateOnScreen('images/dot.png', confidence=0.9) # 取得每一個圖片的座標資訊btn_0_point = pyautogui.center(btn_0_location)btn_1_point = pyautogui.center(btn_1_location)btn_2_point = pyautogui.center(btn_2_location)btn_3_point = pyautogui.center(btn_3_location)btn_5_point = pyautogui.center(btn_5_location)btn_6_point = pyautogui.center(btn_6_location)btn_7_point = pyautogui.center(btn_7_location)btn_8_point = pyautogui.center(btn_8_location) # 取得每一個圖片的中心點btn_plus_point = pyautogui.center(btn_plus_location)btn_subtract_point = pyautogui.center(btn_subtract_location)btn_multiply_point = pyautogui.center(btn_multiply_location)btn_equal_point = pyautogui.center(btn_equal_location)btn_dot_point = pyautogui.center(btn_dot_location) # 按下 250pyautogui.click(btn_2_point.x, btn_2_point.y)pyautogui.click(btn_5_point.x, btn_5_point.y)pyautogui.click(btn_0_point.x, btn_0_point.y) # 按下 xpyautogui.click(btn_multiply_point.x, btn_multiply_point.y) # 按下 2pyautogui.click(btn_2_point.x, btn_2_point.y) # 按下 +pyautogui.click(btn_plus_point.x, btn_plus_point.y) # 按下 38pyautogui.click(btn_3_point.x, btn_3_point.y)pyautogui.click(btn_8_point.x, btn_8_point.y) # 按下 -pyautogui.click(btn_subtract_point.x, btn_subtract_point.y) # 按下 17.8686pyautogui.click(btn_1_point.x, btn_1_point.y)pyautogui.click(btn_7_point.x, btn_7_point.y)pyautogui.click(btn_dot_point.x, btn_dot_point.y)pyautogui.click(btn_8_point.x, btn_8_point.y)pyautogui.click(btn_6_point.x, btn_6_point.y)pyautogui.click(btn_8_point.x, btn_8_point.y)pyautogui.click(btn_6_point.x, btn_6_point.y) # 按下 =pyautogui.click(btn_equal_point.x, btn_equal_point.y)
圖7 希望你的計算結果,跟我一樣
取得螢幕畫面上的座標與RGB值建議額外開啟終端機(Terminal)視窗執行,可以方便檢視當前滑鼠游標位置的狀態: 程式碼 import pyautogui ''' 取得滑鼠游標的座標與色碼 補充: 建議另開 Terminal 執行 ''' pyautogui.displayMousePosition()
自動遊玩網頁版「太鼓達人」模擬器網路上有一個非官方的網頁版太鼓達人模擬器,支援單人或雙人線上同步遊玩。由於個人對類似遊戲並不擅長,為了讓自己實現「一鍵遊玩」的夢想,於是撰寫了遊戲自動化的程式,供大家參考。
圖8 網頁版太鼓達人模擬器,支援線上對戰
圖9 取得打擊圖示的RGB
圖10 設定滑鼠定點,之後會在此處連續點擊
程式碼 ''' 打擊遊戲
範例網址: https://taiko.bui.pm/
(請先取得參考用的座標、色碼)
Red, Green, Blue 橘色圖示: (243, 71, 40) 藍色圖示: (101, 189, 187) 連打區域: (243, 181, 0)
滑鼠定點 (x=519, y=455) '''
# 設定每一個動作後,都暫停若干秒 pyautogui.PAUSE = 0.1
# 固定打擊點 01 listPoint01 = [519, 455]
# 點擊 def click(): # 每次點擊都會重新取得滑鼠定點的 RGB 值 coord01 = pyautogui.pixel( listPoint01[0], listPoint01[1] )
# [0] 代表 Red,[1] 代表 Green,[2] 代表 Blue if coord01[0] == 243 and coord01[1] == 71: # 若 R = 243, G = 71 pyautogui.press('j') # 右邊內側橘色 elif coord01[0] == 101 and coord01[1] == 189: # 若 R = 101, G = 189 pyautogui.press('k') # 右邊外側藍色 elif coord01[0] == 243 and coord01[1] == 181: # 若 R = 243, G = 181 pyautogui.press('d') # 左邊外側藍色 pyautogui.press('f') # 左邊內側橘色 pyautogui.press('j') # 右邊內側橘色 pyautogui.press('k') # 右邊外側藍色
''' 主程式區域 ''' if __name__ == "__main__": while True: # 當我們按下 ctrl 鍵時,自動點擊 if keyboard.is_pressed('ctrl'): click()
圖11 《鬼滅之刃》片頭曲「紅蓮華」透過程式自動化操作的結果
後記本文以PyAutoGUI作為自動化模組套件,除了讀取圖片,比對螢幕畫面當中的按鈕,並取得該按鈕在螢幕畫面的中心點座標,自動點擊小算盤(計算機),以及不斷取得指定座標的RGB值,來判斷該按下哪一個按鍵,達到自動進行遊戲的目的。 自動化可以減少重複的操作,讓使用者有時間專注在重要的事物上。希望大家在實作的過程中,能夠得到新的啟發,舉一反三、觸類旁通,開發出更方便、更有趣、更有幫助的自動化程式。
參考資料[1] Welcome to PyAutoGUI’s documentation! https://pyautogui.readthedocs.io/en/latest/index.html
[2] PyAutoGUI : 使用Python控制電腦 https://yanwei-liu.medium.com/pyautogui-%E4%BD%BF%E7%94%A8python%E6%93%8D%E6%8E%A7%E9%9B%BB%E8%85%A6-662cc3b18b80 |