こんにちは、fuyutsuki(@Fuyutsuki)です。
マウスやキーボードを自動操作することで、PC操作を効率化したいと思ったことはありませんか?
こういったPCの自動操作にはPythonのライブラリであるPyAutoGUIを使うことが有用です。
PyAutoGUIについて私はかなりの試行錯誤を繰り返してきました。
PyAutoGUIを使い込んでいる私だからこそ言える注意事項もあるかと思いますのでぜひご参考ください。
Pythonの仮想環境構築
例によっていつものようにこちらの記事でPythonの仮想環境を構築します。
上記の記事で解説しているように、作成したバッチファイルをダブルクリックするだけで仮想環境構築が完了するので、まだチェックしていない方はぜひ見てみてください。
今回は以下のようなバッチファイルを作成し、Pythonの仮想環境構築を行いましょう。
@echo off
rem スクリプトが置かれている場所をカレントディレクトリにする。
cd /d %~dp0
rem 念のためvirtualenvのインストールとpipのアップグレードを行う。
pip install virtualenv
python -m pip install --upgrade pip
rem venvの環境を構築する。
python -m venv venv
call ./venv/Scripts/activate
python -m pip install --upgrade pip
rem 各パッケージをインストール
pip install pyautogui
pip install pyperclip
pip install opencv-python
pause
後ほど説明しますが、
opencvは画像認識する際に必要になります。厳密には、画像認識の精度を指定する際に必要になるライブラリです。
PyAutoGUIの基本操作
PyAutoGUIを使う上での心得
PyAutoGUIを使う上での基本的な心構えとして先に3点述べます。
各操作の間に時間を空けてあげると動作が安定する。
少なくとも0.1秒、安定させたいなら1秒、画像認識を行う際には3~5秒ほど必要になることもあります。どの程度時間を空ければ良いのかに関しては、PCの処理能力に依存します。
例えばキーボードを操作させるにしても全く時間を空けないとPCのスペック次第では処理が追いつきません。
あくまで人間の動きを真似ているのだということを心に留めておきましょう。
この”時間を空ける”という操作はPythonではtime.sleep()を使うことで実現します。
import pyautogui
import time
# ~~PyAutoGUIで何らかの操作を行う~~
time.sleep(1) # 1秒間処理を止める
マウス操作(画像認識)を行わずにキーボード操作にした方が安定する。
画像認識でマウス操作をする時の注意点は以下の通りです。
- 不意にポップアップ通知などが表示されてしまうとエラーになります。
- 画像認識させる画像を撮影する際に意図していない線などが画像に入っていたり、あまりにも狭い領域を撮影していたりするとエラーになります。
- PCやディスプレイが変わった場合にも注意が必要で、再度画像を撮りなおさないと画像認識をしてくれなくなります。
アプリに応じてキーボードショットカットを調べることで、キーボードで操作を完結するようにしましょう。
PCをディスプレイに繋いでいる方は注意が必要。
例えばあるアプリの操作を自動化することを想定します。
そもそも、デフォルトでPyAutoGUIの画像認識はデュアルディスプレイに対応していません。
pip installした際のPyAutoGUIのライブラリのコードをいじれば画像認識をデュアルディスプレイに対応させることもできますが、それでも画像認識させた後にその場所をクリックしようとするとエラーとなります。
if文をネストさせることで対応する方法もありますが、保守性の観点からあまりおすすめできるものではありません。
PyAutoGUIは極力使わない
PyAutoGUIの解説をするのに何を言っているんだと思われるかもしれませんが、PyAutoGUIを使用するのは最終手段です。
例えばアプリを操作するのであればアプリに対応したライブラリを使用するべきです。
Excelであればopenpyxl、PowerPointであればpython-pptxというライブラリがあります。
こういったアプリ対応のライブラリを使用する方がtime.sleep()関数で時間を空けなくても動作が安定します。結果的に処理が終わる時間が短くて済みます。
また、パソコンに何かしらトラブルがありキーボード入力が効かないといった場合だと、PyAutoGUIではエラーとなりますが、アプリ対応のライブラリであれば多少のトラブルは関係なく動作します。
PyAutoGUIを使用するのは、ライブラリが用意されていないアプリの操作を自動化したいといった、他に手段がない局面で使用しましょう。
マウスの自動操作
カーソルを好きな場所に移動
PC画面上の座標(x,y)をクリックします。
import pyautogui as pg
pg.moveTo(5, 30 , 1) # x=5, y=30の位置に1秒かけて移動
ここでいう座標は、画面の左上を(0, 0)とします。画面の右方向にいくにつれてxが増加し、画面の下方向にいくにつれてyが増加します。
xとyの上限は、画面のサイズに依存します。pg.size()関数を使用することで、PC画面のサイズを取得することができます。
import pyautogui as pg
pg.size() # PC画面のサイズを取得する
カーソルを好きな場所に移動する方法について解説しましたが、実際はこれから紹介するように、クリックしたい座標の位置を先に確認することの方が多いと思います。
クリックしたい座標の位置を先に確認する
import pyautogui as pg
# クリックしたい位置の座標を確認
x,y = pg.position()
print(x,y)
# 上記でわかった座標をクリック
pg.click(x, y) # 左クリック
pg.rightClick # 右クリック
pg.doubleClick # ダブルクリック
# 上記でわかった座標にドラッグ
pg.dragTo(x,y) # 座標(x,y)まで(絶対座標)
pg.drag(x,y) # 現在の位置から右にx,下にy(相対座標)
pyautogui.position()で事前にクリックしたい場所を把握することができます。
一度把握したら次からは座標を確認しなくて済むようになります。
ただし、PCが変わったりディスプレイが変わったりすると、当然ながら座標も変わってしまうため注意が必要です。
キーボードの自動操作
前述しているように、キーボード操作は使用する機会が多いです。
文字の入力
文字の入力は日本語には非対応です。そのため、クリップボードを操作するpyperclipを利用して日本語を入力します。
import pyautogui as pg
# 文字を入力
pg.typewrite('Hello')
# 日本語を入力する場合はクリップボードにコピーしておく。
pyperclip.copy('こんにちは')
# Ctrl+vで貼り付け
pg.hotkey('ctrl', 'v')
キーボードの操作
使用する機会が多いのはpg.press()関数とpg.hotkey()関数です。
import pyautogui as pg
#キーボードの'enter'を押す
pg.press('enter')
# キーボードを同時押しする。
pg.hotkey('ctrl', 'shift', 'esc')
頻繁に使用するキーを表にまとめました。他に試したいキー入力があればこちらの公式ドキュメントを確認しましょう。
CtrlキーやShiftキーなどでエラーになるなと思ったら、Ctrlキーでは’ctrl’ではなく’ctrlright’や’ctrlleft’を試してみると良いかもしれません。
ファンクションキー | ‘fn’, ‘f1’, ‘f2’など |
Ctrlキー | ‘ctrl’, ‘ctrlright’, ‘ctrlleft’ |
Shiftキー | ‘shift’, ‘shiftright’, ‘shiftleft’ |
Altキー | ‘alt’, ‘altright’, ‘atlleft’ |
Enterキー | ‘enter’ |
Winキー(Windows) | ‘win’, ‘winright’, ‘winleft’ |
Commandキー(Mac) | ‘command’ |
Optionキー(Mac) | ‘option’ |
PageUpキー / PageDownキー | ‘pageup’, ‘pagedown’ |
Deleteキー / BackSpaceキー | ‘delete’, ‘backspace’ |
矢印キー(→←↓↑) | ‘right’, ‘left’, ‘down’, ‘up’ |
Tabキー | ‘tab’ |
Escキー | ‘esc’ |
Volumeキー | ‘volumemute’, ‘volumeup’, ‘volumedown’ |
Pauseキー | ‘pause’ |
キーボードショートカットを覚えよう
例えばPyAutoGUIを使ってPCをスリープモードにしたいと思ったときはどうするでしょうか?
マウスを動かしてWinボタンをクリック-電源ボタンをクリック-スリープボタンをクリック、とするかもしれません。
しかし、PyAutoGUIの場合はマウスで操作するよりもキーボードで操作する方が動作が安定します。
PCをスリープモードにする場合は下記のようにコードを記述しましょう。
import pyautogui as pg
import time
pg.hotkey('win','x') # 'win'キーと'x'を同時押し
time.sleep(3) # 時間を空ける
pg.press('u') # 'u'を押す
time.sleep(3) # 時間を空ける
pg.press('s') # 's'を押す
このように、Windowsや各アプリのキーボードショートカットで操作するように心掛けましょう。
キーボードショートカットが分からない!という方は自分がしたい操作のショートカットをググっても良いですし、
下記画像の“スリープ(S)”といったように、どのキーを押せば良いのか示してくれていることが多いです。
画像認識
マウス操作をする際に、pg.position()関数で毎回座標を確認するのはあまりに面倒です。
そのため、マウス操作をする際にはこれから紹介するように画像認識によって座標を決定するという手法を取ることが多いです。
例えば、Adobe Acrobat Reader DCで画像認識を試してみましょう。以下のような画面の時に、ホームボタンをクリックしたいとします。
Adobe Acrobat Reader DCにはPythonのライブラリが用意されていないため、PyAutoGUIで試してみましょう。
まず、クリックしたいホームボタンの写真をスクリーンショットします。
ここで気を付けたいのは、画像に余計な線を入れないようにすることです。
今回で言うとホームボタンの下に黒線(ツール画面を開いているため今はツールボタンの下にある黒線)が入らないように気を付ける必要があります。
スクリーンショットした画像はPC内に保存しておきます。
その後、以下のようにPythonコードを記述します。
import pyautogui as pg
import time
icon_path = 'XXXXXX' # 保存した画像のパス
icon = pg.locateOnScreen(icon_path)
if icon != None:
time.sleep(1)
x, y = pg.center(icon) # 画像の中心の座標を取得
time.sleep(1)
pg.click(x,y) # 画像の場所をクリック
画像認識が成功すればiconに画像の座標が入ります。
while文の無限ループを使って画像認識に成功するまで無限ループする、といったこともできますね。
画面遷移には時間がかかりますから、画面遷移を完了後、つまり画像認識に成功後に次の処理を行うといったことができます。
画像認識に失敗する時の対処法
画像認識に失敗するときがあります。画像に余計な線が入っていないかをまずはチェックしますが、それでもダメなときは画質が悪いなどの問題があるのかもしれません。
そういったときは以下のようにPythonコードを記述することで、画像認識が成功することがあります。
import pyautogui as pg
import opencv
icon = pg.locateOnScreen(icon_path, grayscale = True, confidence = .8)
何かしらのアップデートで画像の色と実際の色が異なっているときにはgrayscale = Trueとしてみると良いかもしれません。
また、grayscaleとすることで、画像認識の速度も向上します。その一方で、grayscale = Trueとすると、誤った画像認識をしてしまう可能性もあるため注意しましょう。
値を下げるほどいい加減に画像認識するようになります。スクリーンショットの画像が狭い領域だと、このconfidenceの値を下げる必要が出てくる可能性があります。
値を下げすぎると間違った画像認識をしてしまう可能性もあるため、注意が必要です。
PyAutoGUI実践編
困ったときはFaleSafe機能
PyAutoGUIにはFaleSafe機能というものがあります。
マウスやキーボードを自動で操作させるため、プログラムを中止しようとしても中止ボタンが押せないといったことが起こりえるんですよね。
そういったときにプログラムを止めるために用意された方法です。
これにより実行中のプログラムを止めることができます。
PyAutoGUI実践編のコードを記述
簡単ではありますが、実際に使う場面を想定してPyAutoGUIのコードを記述します。
骨組みとなるコードを記述していますので、後はご自由に拡張してください。
先程のAdobe Acrobat Reader DCでの画像認識と同様のイメージでコードを確認してください。
また別の記事で紹介しようと思いますが、オブジェクト指向でコードを記述してみます。
以下のようにvirtualenv環境構築の.batファイルをダブルクリックしてvenvの仮想環境を構築します。
今回は、main.pyとautogui,pyを作ります。
画像認識用に必要な画像は事前にスクリーンショットし、pictureフォルダに保存します。
main.pyは以下のように記述します。
from autogui import AutoGUI
if __name__ == '__main__':
try:
# ~~何かしらの処理を実行~~
# 画像認識してクリック
AutoGUI().action()
# 画像認識できるまで無限ループ
AutoGUI().loop_action()
# ~~何かしらの処理を実行~~
except Exception as e:
print('エラー発生',e)
finally:
print('main.py_try文終了')
autogui.pyは以下のように記述します。
self.ICON_PATHにはpictureフォルダのパスになるよう書き換えましょう。
import pyautogui as pg
import pyperclip
import time
import subprocess
import glob
class AutoGUI:
def __init__(self):
self.ICON_PATH = 'XXXXXXXXX' # pictureフォルダのパスに書き換える。
self.num = 2
# 画像認識に成功したら画像の座標をクリック。
def action(self):
time.sleep(3)
#閉じたPDFを再度開くのウィンドウが表示されたらバツをクリック。
self.close_pdf_open_check()
time.sleep(1)
p_start = pg.locateOnScreen(self.START_PATH)
time.sleep(1)
if p_start != None:
assert type(p_start) is not type(None)
time.sleep(1)
x, y = pg.center(p_start)
time.sleep(1)
pg.click(x,y)
#画像が見つからなかったらエラーメッセージを表示。
elif p_start == None:
pg.alert('エラーです。画像を確認できませんでした。')
# 無限ループ。
def loop_action(self):
loop = True
try:
while loop:
finish_judge = pg.locateOnScreen(self.ICON_PATH, grayscale=True, confidence=.9)
if finish_judge is not None:
time.sleep(1)
loop = False
# ~~次に行う何らかの処理を記述する~~
continue
elif finish_judge is None:
wait_times = 1 * self.num
time.sleep(wait_times)
continue
except Exception as e1:
print('e1',e1)
finally:
print('try文e1終了')
その後、VS Codeなどで実行しましょう。
今回はVS Codeでmain.pyを開き「実行とデバッグ」をクリックします。
今回紹介したコードはあくまで骨組みです。
autogui.pyとmain.pyを分けたのは、一言で言うならコードが縦に長くなると可読性及び保守性が落ちるためです。
まとめ:pyautoguiでRPAを簡単に始めよう
今回の記事ではマウスやキーボードを自動操作することで、PC操作を効率化するための方法について解説しました。
結論として、PCの自動操作にはPythonのライブラリであるPyAutoGUIを使うことが有用です。
また、PyAutoGUIを使い込んでいる私だからこそ言える注意点についても解説してきました。
PyAutoGUIはアイデア次第で、あらゆる操作を自動化できるポテンシャルを秘めています。
遊び心を大切に色々と試してみてください。
また、プログラミングを学習したいと思っている方はこちらの記事で紹介しているように、買い切り型のオンライン動画学習サービスUdemyがおすすめです。講師の方々のレベルがとても高いことが特長です。
独学でプログラミング学習をするなら、まずおすすめしたいのがUdemyです。オンライン動画買い切り形式で、実務レベルのスキルを習得できます。定期的に80~90%OFFセールが実施されていますよ。
\ セール中は80~90%OFFで購入可能/
30日間返金保証
最後まで読んでいただきありがとうございました。
ではまた、次の記事で!
コメント