RPAの代替としてのPyAutoGUI

PythonのPyAutoGUIを使うと、マウス移動、クリック、キーボード操作、画像認識が可能です。これにより、パソコン操作のほとんどすべてを自動化できます。
RPAの代替として使えます。

インストール

pip install pyautogui

基本

次のようにして使用します。
import pyautogui

マウス

マウス移動(絶対)

pyautogui.moveTo(x, y)

マウス移動(相対)

pyautogui.move(x, y)
pyautogui.moveRel(x, y)

移動時間

「duration」で移動時間(秒)を指定できます。
pyautogui.moveTo(x, y, duration=num_seconds)

マウスドラッグ

ドラッグします。相対座標です。
pyautogui.dragTo(x, y, button=’left’)

クリック

クリックします。絶対座標です。引数なしの場合はその場でクリックします。
pyautogui.click()
pyautogui.click(x, y)
pyautogui.rightClick(x, y)
pyautogui.doubleClick(x, y)

画像をクリック

画像検索には「locateOnScreen」などを使用しますが、「click」の引数に画像ファイルを指定するとその中心をクリックします。
pyautogui.click(image_path)

ダウン、アップ

pyautogui.mouseDown(x, y)
pyautogui.mouseUp(x, y)

キーの入力

通常

順にキーを押します。日本語の場合はうまくいかないことがありますので、クリップボードに入れて貼り付けるのが良い方法です。
pyautogui.typewrite([‘a’, ‘b’, ‘c’])

ホットキー

同時にキーを押します。
pyautogui.hotkey(‘ctrl’, ‘v’)

ダイアログ

アラート

pyautogui.alert(‘文字列表示’)

コンファーム

pyautogui.confirm(‘OKとキャンセル’)

プロンプト

キャンセルを押した場合は「None」が返ります。
pyautogui.prompt(‘文字列入力’)

スクリーンショット

通常

画面全体のスクリーンショットを撮り、Pillowのイメージオブジェクトを返します。
im = pyautogui.screenshot()

「region」を使用すると範囲を指定できます。
im = pyautogui.screenshot(region=(x0, y0, x1, y1))

保存

画面全体のスクリーンショットを撮り、ファイル名を付けて保存します。拡張子に応じた形式で保存されます。
pyautogui.screenshot(“all.png”)
pyautogui.screenshot(“all.jpg”)

画像検索

画面上にあるボタンなどをクリックする場合などに使用できます。
ボタンなどのスクリーンショットを画像として保存しておき、これを指定することでクリックが可能です。
通常は最初に見つけた画像が対象となります。

画像の座標を取得

指定した画像ファイルと同じ画像を画面上から探し、上下左右の座標を返します。
location = pyautogui.locateOnScreen(image_path)
x, y = pyautogui.center(location)

画像の中心座標を取得

中心の座標を返します。クリックする場合はこれを使用します。
x, y = pyautogui.locateCenterOnScreen(image_path)

画像の中心をクリック

画像の中心をクリックします。シンプルな記述方法です。
pyautogui.click(image_path)

画像検索の挙動

次のようにすると上下左右の座標を取得できます。
location = pyautogui.locateOnScreen(“button.png”)
print(location) # Box(left=106, top=185, width=96, height=50)
次のようにすると中心座標を取得できます。
location = pyautogui.locateCenterOnScreen(“button.png”)
print(location) # Point(x=154, y=210)
次のようにすると合致する画像全てを取得します。
location = pyautogui.locateAllOnScreen(“button.png”)
print(location) #
print(list(location)) # [Box(left=106, top=185, width=96, height=50)]

テクニック

待機

処理が早すぎるとボタンのクリックを「空振り」してしまうことがありますので、「sleep」を使用して待機します。
import time
time.sleep(3)
画像を検索してクリックするような処理の場合は、以下のような関数を使用すると「sleep」不要で素早く処理できます。

def click_image(image_path, timeout=10, interval=0.5):
    """
    指定された画像を探索し、見つかったらクリックする。
    タイムアウトまでに画像が見つからなければ処理終了。
    """
    start_time = time.time()
    print(f"画像探索開始: {image_path}")
    while time.time() - start_time < timeout:
        try:
            location = pyautogui.locateOnScreen(image_path)  # 画像探索 (例外対策)
            if location:  # 画像が見つかった場合
                center = pyautogui.center(location)  # 中心座標を取得
                pyautogui.click(center)  # 中心をクリック
                print(f"画像が見つかりました。クリックしました: {center}")
                return  # 処理成功で終了
        except pyautogui.ImageNotFoundException as e:
            print(f"画像探索失敗: {e}")  # エラーを通知
        time.sleep(interval)  # 再探索まで待機
    print(f"タイムアウトで画像が見つかりませんでした: {image_path}")

文字列の入力

「typewrite」を使用すると文字の入力ができますが、日本語だとうまくいかないことがあります。クリップボードに入れてペーストすると良いでしょう。

import pyautogui
import time
import pyperclip
text = "こんにちは"
pyperclip.copy(text)
time.sleep(3)
pyautogui.hotkey('ctrl', 'v')

コメント

タイトルとURLをコピーしました