※寿司打の利用規約違反では無いかと指摘を受けました。
現在寿司打を運営されている方に使って大丈夫か聞いております。
このようなツールを使ってランキングに登録はしないでください。
※筆者はqiitaを使うのが初めてです。至らない点があると思いますが、ご了承ください。
コードもめちゃくちゃ変で、汚いですが、気が向いたら直します()
こんにちは。
突然ですが皆さん
寿司打
してますか?
タイピング練習をしたことがある人なら、ほとんどの人がこのゲームをプレイしたことがあるはずです。
寿司打はブラウザゲームです。
なので、PythonでHTMLを取得すればかんたんに自動化できるのではないかと思い、作ることにしました。
私はHTMLを取得しようとしていたのですが、
実は寿司打はWebGLという技術が使われていて、
文字を画像として表示しているようです。
そこで、方針変更です。
画像認識しましょう。
まず、スタートボタン、おすすめボタンを押します。
import pyautogui
import time
x,y=pyautogui.locateCenterOnScreen("susida.png")
print(x)
print(y)
pyautogui.click(x, y+100)
print("スタートボタンを押しました。")
time.sleep(1)
pyautogui.click(x, y+100)
print("おすすめを押しました。")
time.sleep(1)
pyautogui.typewrite(" ")
print("開始します。")
time.sleep(2)
絶対座標で指定してしまうと、ウィンドウサイズなどで変わってしまうので、
susida.pngからの相対座標を使うことにしました。
←susida.png
そして、その座標をpyautoguiでクリックします。
pyautoguiのインストールは、
pip install pyautogui
です。
次に、画像認識部分です。
import pyocr
import pyocr.builders
from PIL import Image
import sys
import cv2
i=1
result=0
tools=pyocr.get_available_tools()
if len(tools) == 0:
print("OCRツールが見つかりませんでした。")
sys.exit(1)
tool=tools[0]
while(i<201):
sc=pyautogui.screenshot(region=(x-110, y+85, 210, 25))
sc.save("original.png")
original=cv2.imread("original.png",0)
threshold=100
ret, img_thresh = cv2.threshold(original, threshold, 255, cv2.THRESH_BINARY)
cv2.imwrite("gray.png", img_thresh)
hanten = cv2.imread("gray.png")
hanten2=cv2.bitwise_not(hanten)
cv2.imwrite("sushida_sc.png", hanten2)
img_org=Image.open("sushida_sc.png")
builder = pyocr.builders.TextBuilder()
tmp=result
result=tool.image_to_string(img_org, lang="eng", builder=builder)
if(tmp != result):
print(i,"皿目:",result)
pyautogui.typewrite(result)
i=i+1
time.sleep(0.3)
画像認識には、pyocrを使っています。
導入方法はこちらをご覧ください↓
https://gammasoft.jp/blog/ocr-by-python/
まず、普通にローマ字のところをスクショします。
しかし、これでは背景が透けていて、認識精度が低くなります。
なので、2値化します。
さらにそれを色反転させて、文字を黒にします。
認識したものをpyautoguiで打ち込めば、寿司打の自動化完了です。
200で止めているのは、寿司打は食べすぎるとエラーが出るからです。
以下に全文を載せます。
import pyautogui
import time
import pyocr
import pyocr.builders
from PIL import Image
import sys
import cv2
i=1
result=0
tools=pyocr.get_available_tools()
if len(tools) == 0:
print("OCRツールが見つかりませんでした。")
sys.exit(1)
tool=tools[0]
x,y=pyautogui.locateCenterOnScreen("susida.png")
print(x)
print(y)
pyautogui.click(x, y+100)
print("スタートボタンを押しました。")
time.sleep(1)
pyautogui.click(x, y+100)
print("おすすめを押しました。")
time.sleep(1)
pyautogui.typewrite(" ")
print("開始します。")
time.sleep(2)
while(i<201):
sc=pyautogui.screenshot(region=(x-110, y+85, 210, 25))
sc.save("original.png")
original=cv2.imread("original.png",0)
threshold=100
ret, img_thresh = cv2.threshold(original, threshold, 255, cv2.THRESH_BINARY)
cv2.imwrite("gray.png", img_thresh)
hanten = cv2.imread("gray.png")
hanten2=cv2.bitwise_not(hanten)
cv2.imwrite("sushida_sc.png", hanten2)
img_org=Image.open("sushida_sc.png")
builder = pyocr.builders.TextBuilder()
tmp=result
result=tool.image_to_string(img_org, lang="eng", builder=builder)
if(tmp != result):
print(i,"皿目:",result)
pyautogui.typewrite(result)
i=i+1
time.sleep(0.3)