Python & OpenCvでゴールデンクッキーを乱獲しようPart2
Part1はこちら。
前回の記事でテンプレートマッチングでゴールデンクッキーの座標を特定できる事がわかったので、乱獲するスクリプトを実装してみた。
使用するファイルを以下に示す。
gc.png
は前回使用した検出対象であるゴールデンクッキーの画像である。
gc_click.py
は今回実装したゴールデンクッキーをクリックするスクリプトである。内容を以下に示す。
# Golden Cookie Clicker.
import time
import cv2
import pyautogui
pyautogui.FAILSAFE = False
gc = cv2.imread('./gc.png', cv2.IMREAD_GRAYSCALE)
gc_dx, gc_dy = map(lambda x: int(x / 2), gc.shape)
gc_click_interval = 25
cookie_x, cookie_y = 400, 600
def screenshot():
ss = './ss.png'
pyautogui.screenshot(ss)
return cv2.imread(ss, cv2.IMREAD_GRAYSCALE)
def click_cookie():
pyautogui.click(cookie_x, cookie_y)
def click_golden_cookie():
img = screenshot()
result = cv2.matchTemplate(img, gc, cv2.TM_CCOEFF)
_, _, _, (x, y) = cv2.minMaxLoc(result)
pyautogui.click(x + gc_dx, y + gc_dy)
if __name__ == '__main__':
time.sleep(5)
while pyautogui.position() != (0, 0):
click_golden_cookie()
start = time.time()
while time.time() - start < gc_click_interval:
click_cookie()
if pyautogui.position() != (cookie_x, cookie_y):
time.sleep(10)
break
実装
pyautogui
今回はスクリーンショット取得とマウス操作のためにpyautogui
を使用した。
screenshot()
スクリーンショット取得し、OpenCvのグレースケール画像を返す関数。
click_cookie()
画面左側の大きいクッキーをクリックする関数。
クッキーの絶対座標はcookie_x, cookie_y
で定義してあり、環境に応じて事前に設定する必要がある。
click_golden_cookie()
ゴールデンクッキーをクリックする関数。
スクリーンショットから、最もゴールデンクッキーらしい座標をクリックする。
前回の調査で、存在しない場合は施設「Idleverse」をクリックすることが分かっている。「Idleverse」を購入しても問題ないと考え、ゴールデンクッキーの有無にかかわらずクリックを行う処理とした。
main
メインループは次のようになっている。
5秒間スリープ
マウスが画面左上`(0, 0)`にない間:
ゴールデンクッキーをクリック
25秒間の間:
クッキーをクリック
もし、マウスが動かされたら:
10秒処理を中断し、メインループに戻る
マウスを画面左上に持っていくまでプログラムは継続する。マウスを動かせば10秒間プログラムが中断するため、一時的に施設など購入することができる。
めでたし。1
See also
[1] ゴールデンクッキーだけで10^63枚のオーダーに届くとは思えないが。