[Python] 305 pyautogui 画面内の画像を一定時間おきにクリック 改良版

while文でより完成度を高めました。目的のアイコンが出現するまでwhile文内でループします。1分毎にチェックするので、クリック後の待機時間も設定不要です。

ネット通販の在庫チェックはselenium等を使ったクローリングよりもpyautoguiの画像認識の方が断然楽ですが、見つけ次第注文するとなると微妙です。

私自身は在庫チェックにはクローリングを利用し、注文は人力です。自動発注はやろうと思えばできるはずですが、そこは一線を引いています。

import pyautogui as gui
import time

time.sleep(2)

c = 0
while gui.locateCenterOnScreen("user_icon.png"):
    i = 0
    while not gui.locateCenterOnScreen("point_icon.png",confidence=.8):
        print(f"アイコンなし {i}分経過 {c}回クリック済み")
        time.sleep(60)
        i = i + 1
    else:
        ret = gui.locateCenterOnScreen("point_icon.png",confidence=.8)
        gui.moveTo(ret)
        gui.click()

        print(f"クリック完了 {c+1}回目")
        c = c + 1

[Python] 304 pyautogui 画面内の画像をクリックする際の精度調整

[macOS Catalina 10.15.7]

pyautoguiを使って画面内画像をクリックする際、精度を下げないと全く認識してくれないことがあります。

そのような場合はopenCV(Open Source Computer Vision Library, intelが開発)をpipでインストールし、画像認識精度(confidence)や色(白黒にする場合はgrayscale=True)を調整します。

macOSのメールアプリを起動し、各ボックスの未開封メールを開けて最後にアプリを閉じるコードを書いてみました。

このメールアプリの場合は、一度ウィンドウの空白部分をクリックしてアクティブにしないとメールボックスをクリックできませんでした。

またメールを受信するアイコンを正確に認識できず少しずれたところをクリックするため、ここだけ精度を0.9に上げています。

全体的に精度を下げており画面の状態によっては誤動作の恐れがあるので、慎重に扱うべきですね。

pyautoguiでデジタル書籍をpdf化するのも容易でしょう。すでにその種のコードは広まっているかと思いますが、kindle書籍のバックアップを取るコードを自分で書いてみたいです。

import pyautogui as gui
import time

# メールアプリを起動する
ret = gui.locateCenterOnScreen("mail.png", grayscale=True, confidence=.6)
gui.click(ret)

time.sleep(4)

# メールを受信する
ret_recieve = gui.locateCenterOnScreen("recieve.png", grayscale=True, confidence=.9)
gui.click(ret_recieve)

time.sleep(3)

box_list = ["gmail","gmail2"]

for box in box_list:
    # メールボックスを開ける
    ret2 = gui.locateCenterOnScreen(f"{box}.png", grayscale=True, confidence=.6)
    gui.moveTo(ret2)
    gui.click()

    time.sleep(1)
    
    # 画面上端にカーソルを移動し隠れているメニューバーを表示させる
    gui.moveTo(100,0)

    time.sleep(1)

    # メニューバーのメールボックスをクリックしてプルダウンさせる
    ret3 = gui.locateCenterOnScreen("メールボックス.png", grayscale=True, confidence=.6)
    gui.moveTo(ret3)
    gui.click()

    time.sleep(1)

    # 未開封メールを全て開ける
    ret4 = gui.locateCenterOnScreen("open.png", grayscale=True, confidence=.6)
    gui.click(ret4)

    time.sleep(1)

    # アプリの空白部分をクリックしてウィンドウをアクティブにする
    gui.moveTo(250,50)
    gui.click()

    time.sleep(1)

# メールアプリのアイコンを右クリックする
ret5 = gui.locateCenterOnScreen("mail.png", grayscale=True, confidence=.6)
gui.rightClick(ret5)

time.sleep(1)

# 終了をクリックする
ret6 = gui.locateCenterOnScreen("終了.png", grayscale=True, confidence=.6)
gui.click(ret6)