はじめに
PyAutoGUIで最近2段階認証時にスマホなどに送られてくるコードの入力待機をするために、ある画像が表示されている間は待機する処理が必要となったので、書いておきます。
今回以外のPyAutoGUIでの画像認識によるクリックや待機処理をする方法は以下のページにまとめています。
動作テスト環境
OS: Windows 10 Pro 64bit
言語: Python 3.11.5
ライブラリ:PyAutoGUI 0.9.54
コード
画像が表示されている間は待機する処理
import time
import pyautogui
def wait_while_img_is_displayed(*images, **options):
"""
PyAutoGUIの画像認識で、指定の画像が表示されている間は待機する関数
Parameters
----------
*images: str
画像ファイル名を列挙したもの
wait_limit: int
画像が表示されなくなるまで待機する時間。時間内に消えなかったらFalseを返す
grayscale: bool
画像認識時のグレースケールONOFF
confidence: float
画像認識時の一致率
"""
# 可変長引数を代入
wait_limit = options.pop('wait_limit', 60) * 5 # 待機時間(int)
gray_scale = options.pop('grayscale', True) # 画像認識時のグレースケールONOFF
confidence = options.pop('confidence', 0.8) # 画像認識時の判定度合い
get_img = [True for _ in range(len(images))]
# 待機時間ループ
for _ in range(wait_limit):
# 複数画像設定時のループ
for i, img in enumerate(images):
try:
# 画像認識しなければget_imgをFalseにする
if pyautogui.locateOnScreen(f'./{img}', grayscale=gray_scale, confidence=confidence) is None:
get_img[i] = False
except pyautogui.ImageNotFoundException:
get_img[i] = False
# get_imgがすべてFalseになったらループを抜ける
if not any(get_img):
return True
# 0.2秒待機
time.sleep(0.2)
return False
- 基本的には最初に示したリンク先にある画像待機処理と同じ構成で、複数画像に対応した処理にしました。
- 判定において、列挙した複数画像のいずれかが画面表示されていれば、
get_img
の配列内にTrue
が存在することになるため、not any(get_img)
で全てがFalse
になっているかを判定条件としています
- ちなみにall関数とany関数による要素の真偽判定は以下の組み合わせとなります。
すべて | どれか | |
---|---|---|
True | all(list) |
any(list) |
False | not any(list) |
not all(list) |
使用例
- 最初から絶対に画面に指定の画像が表示されている状態で始まるわけではないので、最初に示したリンク先にある画像待機処理と組み合わせます。
- 1. 画像が表示されるまで待機 -> 2. その画像が表示されている間は待機の2段階で使用する想定となっています。
# 1. 画像が表示されるまで待機(2段階認証画面が表示されるまで)
wait_img("wait00.png", "wait01.png")
# 2. 画像が表示されなくなるまで待機(2段階認証の入力が完了するまで)
wait_while_img_is_displayed("wait00.png", "wait01.png")