Mac前提です。
最近ブラウザゲーやスマホゲーを、手空きの時間にポチポチすることがあります。この手のゲームって、体力みたいなのがあることがよくありますね。一定時間たたないと、行動ができない。でまぁ、レベル上げみたいなことをするには時間がかかる…のですが、そうしょっちゅうゲームをやるわけにもいきませんし、どうせ単純作業なのだから、なんとか楽に自動化モドキくらいのことはできないものかな、と思いました。
マウスによる原始的な自動化
結論としては、マウスエミュレータで簡単なスクリプトを組み、特定のマウスパターンを実行させるようにすれば、労なくちょっとした稼ぎくらいはできるなと思います。よくある画像認識などを一切しない、原始的な方法ではありますが、それだけにシンプルで実装が簡単であり、その割にけっこう使えます(画像認識も、完全一致であればスクリーンキャプチャ+cmpですぐできます)。
Macでは、cliclickというたいへん便利なCLIのソフトがあって、これを使うとシェルスクリプトでちょこちょこっと簡単に指定したマウスのパターンを実行するプログラムが組めます。Androidのゲームについては、Androidエミュレータを起動しなくてはならないのが手間といえば手間です。iOSのゲームは、私はエミュレータを使っていないのでコメントできませんが、多分たくさんあるでしょう(適当)。
…本当にマウスの軌跡を覚えさせるだけなら、App StoreにあるRepeaterというアプリを使えば、そのとおりに軌跡を覚えてくれるので、まぁこういうのを使うのもよいかと思います。プログラミングしなくて済む方法ではあります。
GenymotionでAndroidゲームをMacで起動する
ブラウザゲーの場合は、何も問題ありません。ブラウザを立ち上げればよいだけです。しかしAndroidのゲームの場合、まずPC上で動かす必要があります。つまり、Androidのエミュレータが必要です。エミュレータはなんでもよいのですが、私は「Genymotion」を使っています。これについては、以前Windows版の記事を書きました(「WindowsアプリのGenymotionでAndroid 4.3を動かす : 或る阿呆の記」)。Mac版もあって、問題なく使用することができます。ただ、多分最新のOSはまだあまり安定していないのではないかと思い、私はNexus 7(2012)のAndroid 4.3として常用しています。
cliclickのインストールと使用
PCでゲームを起動する準備ができたら、cliclickを使って自動化を試みます。まずは何はともあれインストールですが、Homebrewで一発でインストールできるので、それが一番良いでしょう。
$ brew install cliclick
インストールしたら実験をします。
$ cliclick -w 5000 c:26,12; cliclick c:26,12
このコマンドを実行すると、まず左上メニューバーのAppleマークがクリックされ、「このMacについて」とか「環境設定」とかのメニュー項目が表示されます。そして、5秒後に再びAppleマークがクリックされ、メニューを閉じます。
その挙動から類推できると思いますが、上記コマンドの意味は、まず -w 5000 で、クリック後5000ms待て(wait)という意味になります。デフォルトは20msです。次に、c:26,12 は、もっとも左上を座標(0,0)としたときの、(26,12)座標をクリックせよ、という意味です。そのほか、ダブルクリックがdcだったりドラッグ・アンド・ドロップがdd->duだったり、色々用意されており、詳細は cliclick -h で閲覧することができます。非常に簡単です。
以上より、cliclickをシェルスクリプトに組み込んで楽々とマウスパターンを自動化させることができるわけです。
ノウハウっぽいこと
座標位置を指定するだけという簡便な実装なので、常に同じ環境になるようにすることが肝となります。ちょっとしたアクシデントですぐにパターンが通用しなくなってしまうのも困りモノです(そんな方法だからこそすぐに実装できるとも言えます)。
使用するウィンドウを最大化する
ブラウザにせよAndroidエミュレータにせよ、ウィンドウの位置と大きさが常に同じでないといけません。もっとも簡便なやり方は、ウィンドウの最大化でしょう。最大化すれば、毎回同じ大きさになります。しかしながら、OSXの最大化(今だとフルスクリーンになりがちですが、Altを押しながらで通常の最大化になります)は「いい感じにでっかくする」だけだったりします。それだとまだ不安定なので、できれば画面いっぱいに最大化したい。これはBetterTouchToolでWindow Snapping Settingsを設定することにより実現するのが最も簡便でしょうか。
異なる解像度のマシンでソースを共有する
たとえば1920x1080ワイドのMac miniと、1366x768のMBAで、同じソースコードを用いたい場合、それぞれで当然指定すべき座標位置が変わるので、それを考慮しないといけません。これは簡単にできる場合が多いのではないか。というのも、恐らくゲーム画面はウィンドウの中央に配置されるのがたいていでしょうから。MBAのX座標位置はMac miniに比べて、(1920 - 1366)/2 = 277 ほど小さい、と考えられます。
というわけで、hostname あたりを調べるなどしてまずマシンの判別を行い、補正値を考慮した式にすれば、一つの式で二つのマシンに対応できるようになります。たとえばMac miniを補正値0、MBAの補正値を277として、シェルスクリプトでは以下のようにX座標を表現できます。
X=$(( X - HOSEI ))
まぁもうちょっとちゃんとやるのであれば、AppleScriptを使って必ず同じポジションで同じサイズになるようにするのが一番よいと思います。AppleScriptについて書くと長くなるので、方法は割愛します。ググればいっぱいでてきます。
同じ座標を何度もクリック
ちょっとしたイレギュラーでもうパターンが崩れてしまいます。といってあまり頑張っては本末転倒です。楽に少しでもロバストにする試みとして、同じ座標を複数回クリックするとよいかもしれません。何かの拍子で最初のクリックがきかなかった場合でも、2回、3回と繰り返せば少なくとも1回はヒットするだろう、という考え方です。とにかく会話画面を飛ばしたいなど、連続クリックをしても問題ない場合に使えます。コンピュータなので1000回連打なども可です(20ms * 1000 = 20s クリックし続ける)。
ログイン対応
朝になるとログイン画面になったりするゲームもあります。といっても、どうせ確認ボタンを押したりログインボーナスを確認したりといった程度だと思うので、割と簡単に対応できるゲームが多いのではないかなと。たとえば下記のようにすると、朝5時になってから最初の1回は、画面の任意の座標を100回ほどクリック連打して、ログイン画面を飛ばします。
FIVE=0
HOUR=$(date +%H)
if [ $HOUR -eq 5 ]; then
if [ $FIVE -eq 0 ]; then
for jj in $(seq 100)
do
cliclick c:935,676
done
FIVE=1
fi
fi
使い勝手
実装に大して時間がかからない割に(といいつつ各種チューニングで休日を潰しました。まぁ楽しかったので…)、意外と効率よく稼ぎができるゲームもあるので、忙しい社会人には良いと思います。夜寝る前に動かしておいて、朝起きたら多少稼げているとなんとなく嬉しいです。まぁ、あまりお行儀がよいとは言えませんけれど…。昔、RPGでコントローラのボタンをセロテープで止めて自動レベルアップ!とかそういうのに憧れていたことを思い出しました。
コメント