初めてのPython
これまでPCの自動化作業には専らUWSCを使ってたため、興味はあれど中々学習の機会がなかったPythonですが、UWSCの現状もありどこかで始めないとと思っていたところ、先日始めたスクスタ(ラブライブの音ソシャゲー)のおかげで同ゲームのMVを自動再生したいという動機が生まれたのでこの機会にPythonを始めてみました。
内容の都合上、ほぼNoxやBluestacksといったAndroidエミュを使ったソシャゲの自動化マクロの話になります。
#環境
Windows10 64bit
Python3.8 64bit
Bluestacks4
AndroidエミュはNoxと迷ったのですが、Noxはリップシンクが10フレほどズレるのでBluestacksを利用しました。
##pyautoguiのインストール
pip install pyautogui
Pythonでの自動化には外せないらしい。
##設計
動作はシンプルに下の画面でMVボタンを押し、
画面が遷移した先で再生ボタンを押す。
あとは曲が終わり、また画像1のMVボタンが表示されるまでループさせる。
##コード
定数宣言部
MAIN_PATH=".\\MVPlay\\"
FILE_TYPE="*.png"
X:int=0
Y:int=1
メインコード
# coding:utf-8
import pyautogui
import glob
import time
from pydef import*
def counterModeSerial(i:int,maxcount:int):
if i>=maxcount:
return 0
else:
return i+1
def main(files:list,loopmode:int,waittime:int):
i:int=0
while True:
loc=pyautogui.locateCenterOnScreen(files[i])
if not(loc==None):
time.sleep(waittime)
pyautogui.click(loc[X],loc[Y])
i=counterModeSerial(i,len(files)-1)
time.sleep(waittime)
flist=glob.glob(MAIN_PATH+FILE_TYPE)
main(flist,0,0.5)
タップさせたいコンポーネントの画像をトリミングしてフォルダに突っ込めばシーケンシャルに実行されるように。
今回のケースではMVとか再生のボタンの画像になります。
MVPlayフォルダを作って中にpngファイルを置けばファイル名でソートされる順番で「認識→タップ→次のファイル→認識...最後の画像を認識したら最初に戻る」を繰り返します。
終了処理を入れてないのでデバッガで起動した場合以外はタスクマネージャーからプロセスをkillする必要があります。
フォルダに画像を突っ込めば画像認識とクリックそして次の状態への遷移をやってくれるので、このままでも2Dソシャゲの周回程度なら十分対応できそうですね。
#雑感
参照や変数宣言を除けばほぼ10行ほどのコードで動くのは流石だと思いました、簡易でパワフルだと言われるだけのことはあると思います。
locateOnScreen関数がマルチディスプレイに対応しておらず、プライマリディスプレイしかチェックしてくれない(作業モニタをセカンダリに入れ替えてなんとかしましたが)画像認識が遅い等の不満点もちらほら見られましたが、総じて使いやすかったです。
ただインデントで入れ子を表現するのだけは少し怖いと思うのはおっさんだからですかね、きれいなインデントが強制されるので可読性が上がると言う利点もあるのでしょうか。
#最後に
取り敢えずの目標は達成されましたが、これだと一曲のみのループしかできない上、ボタン押下時にマウスカーソルとアクティブウィンドウが持って行かれるので、ADB経由でコマンドを送信する等そこら辺も改良していきたいと思います。