Python

【Pythonで業務改善】PyAutoGUIでマウスとキーボードを操作する

本記事ではPyAutoGUIの使い方について解説します。

Python周りには便利なライブラリが豊富にあり、よく使われるOfficeなどのソフトを内部で操作することができます。

しかしながら、それ以外の部分でどうしてもマウスやキーボードの操作を自動化しなければならない場面があります。

そんな時にPyAutoGUIが便利です。

カーソル操作が便利
 ⇒マウスの操作は不確定要素が多いため、できる限りカーソルを移動させる方法を採用した方が動作が安定する


ショートカットキーの対応
 ⇒テキストの入力もコピー&ペーストでできてしまうので汎用性に優れる


画像で目的のアイコンも認識可
 ⇒認識率は100%ではないのでリスクあるが面白い技術

 

使ってみた感想は以上です。

マウスとキーボードに関係した操作であれば一通り自動化でき、スクリーンショットなんかも自動でできてしまいます。

本記事ではPyAutoGUIで実際にマウスとキーボードを操作する例を2例紹介し、便利なコマンドの一覧も紹介します。

準備

インストール方法

pip install pyautogui

インポート

import pyautogui as pg

セキュリティ設定

Macではセキュリティ上、デフォルトでリモート操作が禁止されています。

システム環境設定からセキュリティーとプライバシー ⇒ アクセシビリティーを選択して、「ターミナル」、「Python.app」、「Excel」にチェックをつけてください。

①デスクトップ上にあるフォルダを右クリックして「開く」を押す

座標の把握

デスクトップ右上にフォルダを設置してマウスを合わせた状態で以下のコードを実行して見てください。

mouse_x,mouse_y = pg.position()
print('x_pos:y_pos',mouse_x,mouse_y)

x_pos:y_pos 1396 57

このようにx,yの座標が表示されました。

数値はモニタの解像度によって変わるので違う数字が表示されても問題ありません。

クリック動作

pg.rightClick(座標)で右クリックです。

※左クリックはpg.Click()です

pg.rightClick(x=1396,y=57)

フォルダ上で右クリックされました。

リスト上を操作して選択するまで

pg.press(‘down’)でリストを上から下へ選択

「開く」はリストの一番上にあるので、press(‘down’)を一回実行すれば選択されます。

press(‘enter’)でエンターキーを押すのと同等の役割をするのでフォルダが開かれます。

pg.press('down')
pg.press('enter')

実行コードの全体

import pyautogui as pg

pg.rightClick(x=1396,y=57)
pg.press('down')
pg.press('enter')

②Excelファイルを開いて名前をつけて保存する

操作毎に数秒の間隔を置く設定

今回はExcelを起動する時間など、不確定な待機時間が発生するのであらかじめ操作毎に間隔を置く設定をします。

pg.PAUSE = 2.5

ただし、全ての操作で待ち時間が発生するので、特に時間がかかりそうな実行文がある時はtimeライブラリのsleepで停止されるのも手です。

import time
time.sleep(5)

Excelアプリの座標を調べる

先ほどと同様に該当するアイコンの位置を調べておきます。

x_pos:y_pos 640 880 と表示されました。

mouse_x,mouse_y = pg.position()
print('x_pos:y_pos',mouse_x,mouse_y)

windowsの場合はwindowsキーを押して、excelと入力するようにすればExcelが開けます。

pg.press('win')
pg.write('excel')

ショートカットキーを使う

pg.hotkeyはキーボードの同時押しを再現します。

よく使う例としては「CTL + C」などがあります。

今回はMacでドッグを表示/非表示するための「Option+command+d」を実行します。

pg.hotkey('option', 'command','d')

クリックしてExcelを起動

次にExcelアイコンのところへ移動しクリックを実行します。

するとExcelファイルが開きます。

pg.click(x=640,y=880)

エンターの実行で新規ファイルが開きます。

pg.press('enter')

ファイル名を入力して保存するまで

保存動作をしてみます。

pg.hotkey(‘commad’,’s’)で「command+s」のショートカットを実行できます。

pg.hotkey('command','s')

ファイル名の入力画面に移動するので、pg.write(‘ファイル名’)として入力操作ができます。

interval=で時間を設定するとその時間をかけて入力がされていきます。

pg.write('test.xlsx', interval=0.5)

このやり方の場合、日本語が対応していないようなのでもう一つの方法も紹介します。

pyperclipをインポートして内部的にテキストをコピーしておき、hotkeyの「command+v」で貼り付けというやり方です。

import pyperclip
pyperclip.copy('test.xlsx')
pg.hotkey('command','v')

ファイル名が入力されたらEnterキーの操作で完了です。

pg.press('enter')

Macの場合は最後にドッグの表示を非表示にするためもう一度「option+command+d」のショートカットを起動して元に戻して完了です。

pg.hotkey('option', 'command','d')

動作が一通り終わったことを確認するためpg.alertでメッセージボックスを表示させることもできます。

pg.alert('終了しました')

実行コードの全体

import pyautogui as pg
import pyperclip

pg.PAUSE = 2.5
pg.hotkey('option', 'command','d')
pg.click(x=640,y=880, interval=1)
pg.press('enter')
pg.hotkey('command','s')
pyperclip.copy('test.xlsx')
pg.hotkey('command','v')
pg.press('enter')
pg.hotkey('option', 'command','d')
pg.alert('終了しました')

その他の機能

クリック

pg.click(x=700, y=700, clicks=1, interval=1, button='left')

ダブルクリック

pg.doubleClick()

マウスの位置を移動する

絶対座標への移動

マウスカーソルをx=100, y=100の座標へ5秒間かけて移動させる。

pg.moveTo(100, 100, duration=5)

相対座標への移動

pg.moveRel(100, 100, duration=5)

上方向の移動

pg.mouseUp(x=100, y=100, button='left')

下方向の移動

pg.mouseDown(x=100, y=100, button='left')

スクロール

pg.scroll(10, x=100, y=100)

ドラッグ

絶対座標へのドラッグ

左クリックして5秒かけてx=100px、y=200pxへドラッグします。

pyautogui.dragTo(100, 200, 5, button='left')

相対座標へのドラッグ

右クリックして2秒かけてx=100px、y=200px分ドラッグします。

pg.dragRel(100, 200, 2, button='right')

スクリーンショットを撮る

sc = pg.screenshot()
sc.save('test.png')

範囲を指定して撮ることもできます。

sc = pg.screenshot(region=(100, 150, 200, 250))

左上のx座標=100, 左上のy座標=150 の位置から幅200, 高さ=250

文字を入力する

引数のinterval=で入力にかける時間のインターバルを調整できます。

pg.write('test.xlsx', interval=0.5)

画像を認識して座標を取得する

confidence=でマッチング度合を調整できます。

grayscale=Trueではグレースケールでの探索によって。処理速度が向上するようです。

x, y = pg.locateCenterOnScreen('図1.png',confidence=.5,grayscale=True)

locateOnScreenでは左上のx座標, 左上のy座標, 幅, 高さのタプルを返します。

※locateCenterではタプルから中心のx,y座標を求めています

p = pg.locateOnScreen('図1.png',confidence=.5,grayscale=True)
x, y = pg.center(p)
pg.click(x, y)

1キー毎のタイピング入力

途中で左へ2回カーソルが移動するので結果は「cdab」となります。

pg.typewrite(['a', 'b', 'left', 'left', 'c', 'd'])

途中で処理を承認する方法

pg.alert(text='処理が終わったらOK', title='確認', button='OK')
pg.confirm(text='処理が終わったらOK', title='確認', buttons=['OK', 'Cancel'])

FailSafe 機能の設定

FailSafe (フェールセーフ)とは思わぬ操作をしてしまった際に、処理を中断(または続行)させる仕組みのことです。

FailSafeを有効にした場合、処理中に画面左上、(0,0)座標にマウスポインタを移動させる事で処理を終了させる事ができます。

pg.FAILSAFE = True
ABOUT ME
Mickey@コーヒー好きエンジニア
【製造業×プログラミング×AI】Python/VBAを活用した業務改善、Streamlit/Plotlyを活用したWebアプリ開発について初心者向けに発信中|Wordpressブログを運営しながらHTML/CSSの勉強中|趣味は自家焙煎コーヒー作り|noteでは焙煎理論を発信