4
Help us understand the problem. What are the problem?

posted at

updated at

すばらしきpyautogui

pyautoguiとは

ざっくり、「マウス操作」や「キーボード入力」を自動操作するためのモジュールという感じです。

例えば、デスクトップに表示している画面上で特定の表示がされた時は勝手にクリックされてほしいなぁなどと人生の中で一度は思うことがあるのではないでしょうか(身近な例で言うと、僕は料理系の動画が好きなので参考程度に観ている最中で動画と一緒に進めていると、広告のスキップなどで自動にしてくれと思うことが多々あります。)

今回は僕の悩みを自動的な操作で解決してくれるのが、pyautoguiになります。

実際に動かしてみる

実行環境については以下の通りです

macbook air
Python 3.9.6
PyAutoGUI==0.9.53
opencv-python==4.5.5.64
Pillow==9.0.1

などで、とりあえずどれにおいても新しめのものをインストールしたつもりです。
python3.9についてはちょっと不服(個人的には3.8が安定しているのではないかと思っています。あんまり調べていないので確証はないですが。。。)

とりあえず実行環境通りに全部インストールしてみましょう

python3のインストールについては、python3 installとかで調べていただくとわかりやすい記事とかたくさん出てくるので公式ページだけ貼っておきます。

モジュールたちについてはpipコマンドでインストールできます。

pip3 pyautogui==0.9.53
pip3 opencv-python==4.5.5.64
pip3 Pillow==9.0.1

メインディッシュの前の準備

さて、準備ができたところでさっそくmainのソースコードを、、、
と、その前に画像認識するのにそのサンプルがないと認識なんてできるわけないじゃないかということで、何かサンプルの画像保存しときましょう。例えば、Youtubeの広告をスキップのボタンとかどうですかね?(スクショで大丈夫です)

メインディッシュ

お待たせしました、ようやくmain.pyの紹介に移ります。
以下が、ソースコード全容です。

import pyautogui as pag

ad_png_path = "ad1.png"

# 同時押しのhotkeyメソッドでは、ウィンドウの切り替えができなかったので人間の動きを再現
pag.keyDown("command")
pag.press("tab")
pag.keyUp("command")

while True:
    try:
        if pag.locateOnScreen(ad_png_path, confidence=0.8) is None:
            continue
        else:
            # 広告位置にカーソル移動&スキップ
            icon_loc = pag.locateOnScreen(ad_png_path, confidence=0.8)
            x, y = pag.center(icon_loc)
            # x,yともに2で割らないと正しい座標をクリックできない(mac環境だけらしい)
            pag.click(x / 2, y / 2)
    except KeyboardInterrupt:
        exit("強制終了しました。(正常)")
    except:
        pass

どうでしょうか?
意外にも短すぎますね。画像認識といってもモジュールを使えば簡単に実現できてしまいます。
python様様です。

一個前の手順で保存した画像のファイル名だけad1.pngじゃなくても良いので、しっかりコードとファイル名で合わせるようにしてください。

詰まった点としては、ターミナルでpythonを実行すると思うのですが最初はクリック(pyautogui.click()メソッドを使用)することでyoutubeのタブに飛んでいましたが、せっかくならと言うことでcmd + tabのショートカットキー使ってアプリケーション間移動しようとしてpyautogui.hotkey(cmd, tab)で実行しましたがうまくいかない。

なんでやねんと思いながら、試行錯誤すること数分、、
hotkey()メソッドが同時押しということに気づきました。最初から気づいてはいましたがコンピュータの同時押しというのは人間よりも正確であることを考慮漏れしていました。ということで人間っぽい動きをしてもらうことに。

pyautogui.keyDown("command")でcmdキーを押したまま
pyautogui.press("tab")でtabキーを一回押して
pyautogui.keyUp("command")でcmdキーを離す。

これで僕たち人間がやっている動作と同じですね。

また、別の問題にもぶつかりました。
pyautogui.locateOnScreen()メソッドで取得した画像の座標をそのまま使用しても意図したところをクリックしてくれないということです。
これはx,yともに2で割らないと正しい座標をクリックできない(たぶんmac環境だけらしい)ということです。
確かに、取得した座標を確認すると画面サイズの2倍の値になっていたのでいつまで経っても気づかないところでした。

そして、最後の問題はmacのセキュリティの問題でした。

設定 > セキュリティとプライバシー > 画面収録 から iterm
設定 > セキュリティとプライバシー > アクセシビリティ から iterm

をそれぞれ許可しないと実際に動作させても何も行わずに処理が終了してしまいました。(macに標準搭載のターミナルだとこの手順いらないかもしれません)

最後に

以上で、特定の画像が画面上に表示されるとそこに勝手にカーソルが移動して、クリックをしてくれるというツールの出来上がりです。

これで布団に入りながらでもyoutube見放題ですね!
あ、ただしフルスクリーンモードでは認識してくれないので、シアター標準サイズで試してみてくださいね。

一応、リポジトリ置いておきます。
よしなに使ってみてください。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
4
Help us understand the problem. What are the problem?