Python 自動化 程式

還記得小時候玩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 值就是滑鼠在你的螢幕上的位置;如此一來,就能把你要控制的地方,預先做個紀錄。

Python 自動化 程式
Python 自動化 程式
這個function會不停地回報滑鼠位置

接下來我們試試看,以Twitter的註冊頁面為例子,初步了解一下如何應用pyAutoGUI 進行程式撰寫。

Python 自動化 程式
Python 自動化 程式
先抓出各個按鈕在螢幕上X,Y座標

用下面的程式碼,測試一下

import pyautogui

#暫停10秒,等待網頁視窗安置好
pyautogui.PAUSE=10
#滑鼠移動到註冊
#移動到 1951 , 792 花 1 秒的時間移動過去
pyautogui.moveTo(1951,792,1)
#滑鼠左鍵點擊一下
pyautogui.click()

#暫停1秒,等待網頁載入
pyautogui.PAUSE=1

果然,滑鼠自動移動到註冊按鈕的位置,並且完成自動點擊。如此一來就能搭配下面的指令查找表,來組合出更多的應用了。

常用指令查找表

下面連結是官方的說明文件 – Cheat-Sheet

https://pyautogui.readthedocs.io/en/latest/quickstart.html#cheat-sheet

Python 自動化 程式
Python 自動化 程式
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

 

參考函式列表

Python 自動化 程式

圖1 滑鼠功能

 

Python 自動化 程式

圖2 鍵盤功能

 

Python 自動化 程式

圖3 訊息框與截圖功能

 

如果需要透過 PyAutoGUI來按下鍵盤,以下提供按鍵名稱(key_name)參考:

 

Python 自動化 程式

圖4 PyAutoGUI的key_name列表

 

匯入模組

使用套件與模組

import pyautogui, cv2

from time import sleep, time

import keyboard

from IPython.display import clear_output

 

自動使用小算盤(計算機)

  我們需要對部分按鈕進行截圖,幫助程式辨識該按鈕的中心點座標:

Python 自動化 程式

圖5 依需求取得按鈕的截圖

 

Python 自動化 程式

圖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)

 

 

Python 自動化 程式

圖7 希望你的計算結果,跟我一樣

 

取得螢幕畫面上的座標與RGB值

  建議額外開啟終端機(Terminal)視窗執行,可以方便檢視當前滑鼠游標位置的狀態:

程式碼

import pyautogui

'''

取得滑鼠游標的座標與色碼

補充: 建議另開 Terminal 執行

'''

pyautogui.displayMousePosition()

 

自動遊玩網頁版「太鼓達人」模擬器

  網路上有一個非官方的網頁版太鼓達人模擬器,支援單人或雙人線上同步遊玩。由於個人對類似遊戲並不擅長,為了讓自己實現「一鍵遊玩」的夢想,於是撰寫了遊戲自動化的程式,供大家參考。

 

Python 自動化 程式

圖8 網頁版太鼓達人模擬器,支援線上對戰

 

Python 自動化 程式

圖9 取得打擊圖示的RGB

 

Python 自動化 程式

圖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()

 

 

Python 自動化 程式

圖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