RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

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

初めに

皆さんこんにちは。mosyoryです。

今回はPythonのPyAutoGUIを使用してマウスやキーボードを操作する方法をご紹介します。
関数で使用する引数の全ての解説は行っていないので予めご了承ください。

PyAutoGUIとは

PyAutoGUIとは、マウスやキーボードを操作するGUI自動化のPythonのライブラリです。
Windows, macOS, Linuxで使用することができ、Python2, 3のどちらでも動作します。

pyautogui.readthedocs.io

今回はWindows環境でPython3を使用した例を紹介します。

PyAutoGUIのインストール

PyAutoGUIはコマンドプロンプトで下記を実行するだけで簡単にインストール出来ます。

pip install pyautogui

正しくインストール出来たか確認したい場合は「pip list」を実行してください。
PyAutoGUIとそのバージョンが表示されていれば、インストールが出来ています。

> pip list
Package           Version
----------------- --------
PyAutoGUI         0.9.53

※pipはPythonのパッケージ管理ツールです。
 Python3.4以上なら標準で付属していますので別途インストールする必要はありません。

Pythonは既にインストールされている前提で進めますので、まだの方はPython公式サイトからPython3.xのバージョンをインストールしてください。本記事ではPython3.9を使用します。

www.python.org

Pythonのバージョンを確認したい方は、コマンドプロンプトから「python -V」を実行してください。

> python -V
Python 3.9.1

マウス操作

まずは、PythonがPyAutoGUIを使えるようインポートしましょう。

import pyautogui

画面のサイズの確認

マウスの位置は、X/Y座標で表されます。
画面の左上を座標(0, 0)とし右に進むほどX座標、下に進むほどY座標が増加します。
画面が1920×1080の場合、右下の座標は(1919, 1079)になります。
マウス操作の際に座標を使用するため、最初に画面のサイズを確認しておくと良いでしょう。

print(pyautogui.size())

マウスカーソルの移動

カーソル移動は、moveTo()を使用します。引数に与えたX/Y座標にカーソルが移動します。

# 座標(500, 600)に移動
pyautogui.moveTo(500, 600)

座標のみを与えた場合は、Pythonを実行して一瞬でカーソルが移動します。
人間が動かしている様にゆっくりと移動させたい場合は、durationで移動時間を指定しましょう。

# 3秒かけて座標(500, 600)に移動
pyautogui.moveTo(500, 600, duration=3)

今のマウスカーソルの位置から相対的に移動させたいときは、move()を使います。

# 2秒かけて現在のカーソルの位置から上に200移動
pyautogui.move(0, -200, duration=2)

マウスのドラッグ

ドラッグには、dragTo(), またはdrag()を使用します。
カーソル移動で使用したmoveTo()と同様にdragTo()が指定した座標へ、drag()が現在地からの相対的なドラッグを行います。
ドラッグでは引数に座標や移動時間に加え、どのマウスボタンを押し続けるかを指定します。
ボタンはleft, middle, rightの3つです。

# 左ボタンを押しながら、2秒かけて座標(100, 300)にマウスをドラッグ
pyautogui.dragTo(100, 300, duration=2, button="left")
# 右ボタンを押しながら、3秒かけて右に50, 下に100の座標までマウスをドラッグ
pyautogui.drag(50, 100, duration=3, button="right")

引数に秒数を指定しないとmoveTo()と同様に一瞬で移動し、ドラッグとして認識されないことがあります。
そのため、移動時間を引数に指定したうえで実行することをお勧めします。

クリック

click()を使用することでクリックが出来ます。
引数にクリックをする座標、クリックするボタン、回数や間隔を指定出来ます。
何も指定しなかった場合は現在のカーソルの位置で左クリックを1回行います。

# 現在のカーソルの位置で左クリックを1回
pyautogui.click()
# 座標(20, 100)で右クリックを1回
pyautogui.click(20, 100, button="right")
# 現在のカーソルの位置で0.5秒の間隔で左クリックを3回
pyautogui.click(button="left", clicks=3, interval=0.5)

座標を指定した場合、カーソルを移動させた後クリックを行います。
そのため下のコードは同じ結果となります。

# moveTo()でカーソルを移動させてクリック
pyautogui.moveTo(100, 100)
pyautogui.click()
# click()でカーソルを移動させてクリック
pyautogui.click(100, 100)

キーボード操作

文字の入力

write()に文字列を与えることで入力を行います。
入力速度はとても速く50文字程度の文字列は約0.1秒で入力が終えます。
意図的に遅らせたいのであればintervalを指定することで次の文字を入力するまでの間隔を空けることができます。
write()は一文字のキーのみ入力できるため、EnterやShiftの様な特殊キーを押したい場合は次に紹介する関数を使用してください。

# 0.5秒の間隔でenterという文字列を入力 (Enterキーは押されない)
pyautogui.write("enter", interval=0.5)

# 下記の文章も約0.1秒で入力が終えます
pyautogui.write("It was created using the Python module pyautogui.")

特殊キーの入力

特殊キーを入力したい場合はpress()に、enterの様な予め決められている文字列を与える必要があります。

# Enterキーを入力 (enterという文字列は入力されない)
pyautogui.press("enter")

使用することができる特殊キーについては、こちらの一覧をご覧下さい。

pyautogui.readthedocs.io

キーの同時入力

複数のキーを同時に入力する方法は2つあります。
1つ目は、keyDown()とkeyUp()を組み合わせる方法です。
keyDown()がキーを押してそのまま離さない動作、keyUp()が押していたキーを離す動作のイメージです。
ただkeyDown()をしても、そのキーが入力され続けるわけではないので注意してください。

# ctrlを押した状態で、aを押す。
pyautogui.keyDown("ctrl")
pyautogui.keyDown("a")
pyautogui.keyUp("a")
pyautogui.keyUp("ctrl")

2つ目は、hotkey()を使用する方法です。
こちらは引数に指定したキーを順番に押し逆順で離していきます。
keyDown()とkeyUp()の場合だとキーの数が増えると行数が増えてしまいますが、hotkey()だと1行で書くことができます。

# shiftを押した状態でbとcを入力
pyautogui.hotkey("shift", "b", "c")

# 上の例をkeyDown(), keyUp()で書いた場合
pyautogui.keyDown("shift")
pyautogui.keyDown("b")
pyautogui.keyDown("c")
pyautogui.keyUp("c")
pyautogui.keyUp("b")
pyautogui.keyUp("shift")

「@」「^」「:」が入力できない場合

キーボードのレイアウトによっては、特定の文字が意図したものとは違う入力がされる場合があります。 筆者は「@」「^」「:」を入力したら、Shiftも一緒に押した状態の「`」「~」「*」になってしまいました。

# 「@^:」を入力したつもりだが「`~*」が入力されている
pyautogui.write("@^:")

「@」「^」「:」を使用したい場合は、_pyautogui_win.pyというファイルを直接修正して回避する方法があります。
※修正する場合は自己責任でお願い致します。

def _keyDown(key):
    (省略)
    needsShift = pyautogui.isShiftCharacter(key)

    # 以下3行を追加
    if key == '@': needsShift = False
    if key == '^': needsShift = False
    if key == ':': needsShift = False

    """
    # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start.
    if key in keyboardMapping.keys():
    (省略)

if文でShiftは不要であるという処理を追加することで「@」「^」「:」が入力できるようになりました。
筆者は_pyautogui_win.pyが以下のパスにありましたが、Pythonのインストール先によって異なるのでご自身の環境に合わせて探してみてください。

C:\Users\ユーザ名\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyautogui\_pyautogui_win.py

緊急停止させたい場合

「何らかの理由で実行中のプログラムを停止させたいが、実行中のPythonがマウスやキーボードを動かしているせいで停止ボタンを押せない」という様な時が来るかもしれません。そんな時はfail-safeモードを使用しましょう。
このモードはマウスカーソルを画面の一番左上(座標(0, 0)の場所)に移動させると起動しプログラムを停止させます。
PyAutoGUIがマウスやキーボードを操作してる最中でもマウス操作やキー入力は受け付けてくれるので、自分でマウスを画面左上まで動かしましょう。

メモを作成してみる

最後にメモ帳を開いて保存するまでの例をご紹介します。
4行目で設定しているpyautogui.PAUSEはPyAutoGUIが操作をした後の待機時間です。
これを設定しないとメモ帳の起動が完了する前に文字の入力が始まってしまうので、1秒間の待機時間を設定しています。

import pyautogui

# 処理を実行するたびに1秒待機
pyautogui.PAUSE = 1.0

# 画面のサイズを取得
width, height = pyautogui.size()

# スタートボタン付近にカーソルを移動しクリック
pyautogui.moveTo(5, height-5, duration=1)
pyautogui.click()

# メモ帳のアプリを検索し、エンターで起動
pyautogui.write("memo")
pyautogui.press("enter")

# 文字を入力
pyautogui.write("It was created using the Python module pyautogui.")

# Ctrl+S で保存
pyautogui.hotkey("ctrl", "s")

# ファイル名を入力し、エンターキーで保存
pyautogui.write("Python.txt", interval=0.25)
pyautogui.press("enter")

終わりに

PythonのPyAutoGUIでマウスとキーボードを操作する方法を紹介しました。
単純な定型作業であれば、Pythonに任せることでちょっとだけ楽な思いができるかもしれませんね。
今回はマウスでクリックする場所が事前に分かった状態で行っておりましたが、画像認識の機能を使うことでもう少し柔軟な操作が行えるようになります。
ご興味のある方は是非試してみてください。

参考サイト

Welcome to PyAutoGUI’s documentation! — PyAutoGUI documentation

Some characters are not working with German layout keyboard · Issue #46 · asweigart/pyautogui · GitHub


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.