還記得小時候玩Game的時候,為了重複性的練功,會下載按鍵精靈這樣的工具程式來編排巨集指令,讓遊戲角色自動練功,釋放雙手。 PyAutoGUI就是這樣的東西,也許有人不知道按鍵精靈是怎樣的程式,但簡單來說,就是透過程式,來模擬人類操作滑鼠、鍵盤的行為,來達到自動化。 而PyAutoGUI,使用了python這樣的語言,讓使用者可以不只控制鍵盤滑鼠、還能透過比對畫面上的圖片,來做出滑鼠的點選。是不是相當有趣,而且這樣很貼近使用者的上層開發工具,也可以同時跟其他套件:例如 – Selenium等結合。做出更厲害的自動化腳本。
在開始之前,請確認你已經有Python開發的環境與工具,若你還沒準備好,可以參考這篇,安裝好開發環境再回來繼續學習。
Python超好用基本開發工具 – Anaconda + Atom Editor with Packages
另外,若您想要的是透過自動化程式控制瀏覽器,下面這篇也可以參考
Python自動化工具 – Selenium 機器人般的瀏覽器
什麼是PyAutoGui?
除了一般的功能以外,主要PyAutoGUI 控制自動化的方式可以分成下面四個類別:
Mouse
控制滑鼠移動、左鍵、右鍵等。
Keyboard
模擬按鍵、組合鍵。關於按鍵的控制,這邊有更詳細的說明。
Message Box
可以控制用JavaScript樣式的訊息對話框,這邊有更詳盡的說明。
Screenshot
透過螢幕擷取、比對圖片找出位置,進行其他滑鼠鍵盤的搭配控制。
如何安裝?
安裝的方式非常簡單,若您也是使用下面這篇的教學方法所建立的開發環境
Python超好用基本開發工具 – Anaconda + Atom Editor with Packages
恭喜你,那安裝的方式非常簡單。
只要在虛擬環境的終端機內,輸入
pip install pyautogui 或是 conda install -c conda-forge pyautogui任選其中一種即可, 等它跑完就完成了。
開始試用
PyAutoGUI最常用的一定是控制滑鼠鼠標移動,但是在移動之前,我們必須要先知道滑鼠回報的位置。因此我們可以先撰寫下面的程式碼,透過displayMousePosition() 的function 來持續回報滑鼠座標,如此一來就能逐步記錄你想點擊的按鈕或圖片位置。
import pyautogui pyautogui.displayMousePosition()按下F5 執行,接著可以試試看移動滑鼠,就能很明顯看到視窗裡面的座標數值不停的變化。 X ,Y 值就是滑鼠在你的螢幕上的位置;如此一來,就能把你要控制的地方,預先做個紀錄。
這個function會不停地回報滑鼠位置接下來我們試試看,以Twitter的註冊頁面為例子,初步了解一下如何應用pyAutoGUI 進行程式撰寫。
先抓出各個按鈕在螢幕上X,Y座標用下面的程式碼,測試一下
import pyautogui #暫停10秒,等待網頁視窗安置好 pyautogui.PAUSE=10 #滑鼠移動到註冊 #移動到 1951 , 792 花 1 秒的時間移動過去 pyautogui.moveTo(1951,792,1) #滑鼠左鍵點擊一下 pyautogui.click() #暫停1秒,等待網頁載入 pyautogui.PAUSE=1果然,滑鼠自動移動到註冊按鈕的位置,並且完成自動點擊。如此一來就能搭配下面的指令查找表,來組合出更多的應用了。
常用指令查找表
下面連結是官方的說明文件 – Cheat-Sheet
//pyautogui.readthedocs.io/en/latest/quickstart.html#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 設定滑鼠定點,之後會在此處連續點擊
程式碼
'''
打擊遊戲
範例網址: //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!
//pyautogui.readthedocs.io/en/latest/index.html
[2] PyAutoGUI : 使用Python控制電腦
//yanwei-liu.medium.com/pyautogui-%E4%BD%BF%E7%94%A8python%E6%93%8D%E6%8E%A7%E9%9B%BB%E8%85%A6-662cc3b18b80