【コード9行のみ!】寿司打に自動回答する最強チートツールを開発しよう

  • 寿司打で簡単に高得点を取ることができるツールを開発したい
  • 寿司打のチートツールを作って知り合いに自慢したい
  • 画像認識を利用した独自のアプリを作ることができるようになりたい

ネットで寿司打の自動回答ツールについて調べてみると、手順が多かったり少し難しいものが多いと感じています。

そこでこの記事では、直観的に簡単にアプリを作成できるSikuliXという最強ツールを利用して寿司打の自動回答ツールの作り方を説明します。

この記事を読めば、寿司打で高得点を取ることができる画像認識機能を利用したアプリを簡単に作ることが出来ます。

なんと、たった9行のソースコードで自動回答できるようになっています!

また、このアプリ開発を通じて、画像認識を利用した別のツールを作成することができるようになります。

今回作成する寿司打の自動回答ツールのイメージは次の動画を見てみてください。

「寿司打」の自動回答プログラム
寿司打の自動回答プログラムのソースコード(全9行)
# 変更を検知したら呼び出すメソッド
def typeSushida(event):
    type(r.text())

# ユーザに監視するエリアを指定させる
# 今回は入力欄を指定する
r = 

# プログラムの処理継続時間
observeDuration = 90

# 入力する文字が変わった場合typeSushidaを呼び出す
r.onChange(100, typeSushida)
r.observeInBackground(FOREVER)

wait(observeDuration)
r.stopObserver()
print('finish!')

目次

本記事は次の順番で寿司打の自動回答アプリの作り方を次の2つのステップで説明していきます。

  1. SikuliXをダウンロードする
  2. 寿司打の自動回答ツールを開発する

ステップ1:SikuliXをダウンロードする

今回作成する寿司打自動回答ツールは、SikuliX(シクリ)で開発します。

開発言語はPythonで行っていきます。

SikuliXは次のような特徴を持ったアプリ開発用の無料ツールです。

  • 画像認識の機能を持ち、容易に画像認識を利用したプログラムを利用できる
  • 様々なプログラミング言語をサポートしている
    • Python 、Ruby 、JavaScript 、Javaなどをサポート
  • 画像に含まれる文字を認識する機能(OCR)を備えている

SikuliXのダウンロード・起動方法

最新のSikuliXを次のサイトからダウンロードしてください。

“Download the ready to use sikulixide-x.x.x …”を押してお使いのOSにあったファイルをダウンロードしてください。

ダウンロードしたファイル(.jarファイル)を開いてください。次のような画面が開かれると思います。
ファイルが開けない場合

SikuliXにはバージョン8以降のJavaをインストールする必要があります。

Javaをインストールしていない場合は、次のサイトからインストールするようにしてください。

表示されたサイトの「無料Javaのダウンロード」を押してダウンロードするようにしてください。

ステップ2:寿司打の自動回答ツールを開発する

そもそもですが寿司打とはタイピング練習用のブラウザゲームです。

『寿司打』はローマ字入力用のタイピング練習ゲームです。

回転寿司のお皿が流れてしまう前に画面の文字をタイプして、どれだけモトを取れるか(= たくさん食べられるか)を競います。

無料&ブラウザで遊べますので、ちょっとした空き時間の練習や暇つぶしにどうぞ。複数の入力に対応しており、表示されているキー以外にもお好みの打ち方でタイピングいただけます。

寿司打

ランキング形式で自分のタイピング能力が1万人中何番かということが表示されます。

本記事では「お手軽 3,000円コース」を例に説明していきます。

寿司打の自動回答ツール開発

寿司打の自動回答ツールの開発方法について次の手順で説明していきます。

  1. タイピングする文字のエリアを指定する
  2. プログラムの処理の継続時間を指定する
  3. 文字を読み取って自動でタイピングする

①:タイピングする文字のエリアを指定する

ツールを開発する際に、タイピングする文字が画面上のどこに表示されるのかを指定する必要があります。

具体的には次の画像の黄色枠で囲っている文字が読み取り対象です。(上の場合だと、”miti”が読み取り対象)

この"miti"を読み取って、自動入力するプログラムを作成していきます。

実際にエリアを指定する方法は次の通りです。

SikuliXのRegionを押下する
エリアを選択できる画面(薄暗い画面)となるので、文字が表示されているエリアを選択する
すると選択したエリアを表す画像がコード上に表示される( “r” に文字が表示されるエリアの情報が格納される)

②:プログラムの処理の継続時間を指定する

次は処理の継続時間を決めていきます。

「お手軽 3,000円コース」は60秒のコースなので、余裕をもって今回は90秒で設定しています。

③:文字を読み取って自動でタイピングする

最後は①で決めた領域に表示された文字を読み取って、自動で入力する処理を作成していきます。

次の赤枠で囲った箇所を追記してください。

寿司打の自動回答ツールを実際に動かしてみる

実際に自動回答ツールを動かす方法を説明します。

ツールの起動にはSikuliXの「実行」ボタンを押下します。

すると、指定した時間(今回は90秒)だけツールが起動した状態になります。

そしてそのまま寿司打を開始してください。

すると、指定したエリアに表示された文字を自動で入力するようになるはずです。

上手く文字が入力されない場合

上手くいかない場合、指定しているエリアが狭い可能性があります。

次の画像のように指定する範囲は少し幅広めに設定しておく必要があります。

mitiギリギリで設定しないほうが良い)

なぜなら、長めの文字列で見ている領域外まで伸びてしまうと、文字読み取りがうまくできないからです。

なので、少し大きめに領域をとっておくとよいと思います。(黄色枠くらいがベスト)

寿司打ボットで指定するRegionのイメージ

まとめ

寿司打の自動回答ツールの作る手順は次の2ステップでした。

  1. SikuliXをダウンロードする
  2. 寿司打の自動回答ツールを開発する

SikuliXを使えば簡単にツールの作成ができます。

今回の細かいコードの説明について気になる方は、この後で説明しているので読んでみてください。

本ブログでは、未経験者が転職市場で高く評価され、好条件で転職する為の方法を説明しています。

アプリ開発を通じたスキルアップ、プログラミングを利用した「稼ぐ力」のアップについても説明していますので、気になる方はご覧になってください。

eye catch3ステップで解説!IT経験なしの20代のあなたが転職市場で評価される方法

また、同じくSikuliXを使ってYouTube広告を自動スキップするツールの開発方法を次の記事で解説しています。

興味があればご覧になってください。

【2022年最新】PCブラウザでYouTube広告を消すツールの開発方法

おまけ:SikuliXで知っておきたいメソッドを解説

SikulliXでよく使う知っておきたい機能について説明をします。

これから説明する機能知っておくことで、別のアプリケーションを作成するときに「あ!あのメソッド使えるかも!」ときっかけを作ることができると思っています。

ちなみにSikuliXの全機能は次のサイトで確認できます。

押さえておきたい大事なSikuliXの概念

Regionクラス

細かい機能の説明に入る前に大事な概念について説明します。

Regionとは直訳すると「領域」という意味で、スクリーン上のある領域を指しています。SikuliX公式サイトでは次のように定義されています。

Region is a rectangular area on a screen, which is defined by
1. its upper left corner (x, y) as a distance relative to the upper left corner of the screen (0, 0) and
2. its dimension (w, h) as its width and height.
x, y, w, h are integer numbers counting a distance in pixels.

Sikulli公式サイト

つまり”Region”とは画面上の長方形の領域のことで、次で定義される概念です。

  1. 長方形の左上の座標(x, y)がスクリーンの左上(0, 0)からの距離で定義される
  2. 幅と高さ(w, h)を持つ
  3. x, y, w, hは整数値でピクセル数を表す

そのため、Regionが持つ情報には、画像に関する内容ではなく画面上の領域そのものを表しています。

そしてこのRegionが持つ様々なメソッドを実行することでいろいろな操作を実現することができます。

Matchクラス

Regionに対して、例えばFind()などの探索系メソッドを実行すると、Matchオブジェクト(概念を持ったデータの集まりのこと)を返します。

Matchは探した内容とどれくらい合致しているかを表す概念です。

Matchは以下の内容を保持しています。

  1. 検索時に利用した画像とどのくらい合致しているか
  2. 実際に画像に合致する対象を見つけた座標

そしてMatchはRegionを継承(データ間で親子関係をもたせていること)しているので、Regionの持つメソッドすべてを保持しています。

Patternクラス

PatternはMatchを利用して画像ファイルを探索する際に、追加で探索条件を指定する際に利用するクラスです。

このPatternクラスにはsimilarityという概念があります。

SikuliXでは、どれだけ対象の画像と同じ画像であるか(どれだけ似ているか)を0から1の数値で表現しており、その数値のことをsimilarityといいます。

このsimilarityはデフォルトで0.7となっており、0.7を超えるものについて「同一の画像である」とみなすようになっているのです。

そのため、状況によっては「全然違うのに認識されているものがある」とか「同じものなのに認識されない」などの状況に合わせてこの数値を調整する必要があります。

そこで必要となる概念がこのPatternクラスです。Patternクラスの持つsimilar()メソッドを利用することで、similarityの操作が可能となります。

マウス操作系のメソッド

click / doubleClick

[使い方]

click( image );

対象画像をクリックする。

doubleClick( image );

対象画像をダブルクリックする。

[引数]

image:画像

対象の画像を探して見つかった場合に、クリック・ダブルクリックするメソッドです。

詳細は次の記事で紹介しています。

eye catch【アプリ開発】Sikulixを使ってYouTube広告を自動スキップするアプリの開発

rightClick

[使い方]

rightClick( image );

対象画像を右クリックする。

[引数]

image:画像

上のclickdoubleClickと同様に引数を1つもつメソッドです。

メソッド名の通り、引数で指定した画像を見つけると右クリックします。

drag , dropAt / dragDrop

[使い方]

drag( image );

対象画像をドラッグする。(ドラッグアンドドロップの開始地点)

dropAt( image );

対象画像位置でドロップする。(ドラッグアンドドロップの終了地点)

dragDrop( dragImage, dropImage );

dragImageの位置から、dropImageの位置までドラッグアンドドロップする。

[引数]

image, dragImage, dropImage:画像

wait / sleep

[使い方]

wait( seconds );

sleep( seconds );

指定した秒数だけ処理を中断する。

wait( image, seconds );

指定した秒数だけ、指定した画像を探索し続ける。見つかった場合、処理を再開し、見つからない場合は、指定した秒数が経過したのち、処理を再開する。

[引数]

seconds : 秒数、image : 画像

onChange

[使い方]

onChange( minChangedSize, handler );

変更を検知した場合に、処理を実行するメソッド(Regionのメソッドです。)

[引数]

minChangedSize : Regionに含まれるメソッドのうち何ピクセル変わったかで”変更した”とみなすかを指定できます。(デフォルトでは50ピクセル)

handler : 変更を検知した際に呼び出すメソッドを渡します。

このonChangeが今回のツールでは大きく意味を持っています。

タイピングする対象の文字列が変わったことを検知して、変わった場合は再度領域内の文字を読み取ってタイピングするようにしています。

observeInBackground / stopObserver

[使い方]

observeInBackground( seconds );

指定した秒数だけバックグラウンドで処理を継続する。ここでFOREVERを指定した場合、ずっと処理を継続する。

stopObserver();

領域を監視する処理を終了する。

[引数]

seconds : バックグラウンド処理を継続する秒数

type

[使い方]

type( string );

指定した文字列をキーボードから入力する。

[引数]

string : キーボードから入力する文字列

text

[使い方]

text();

Regionのメソッドで、Regionに含まれる文字をOCRで読み取りして返す。

[引数]

なし(ただし、呼び出し元のRegionオブジェクトに含まれる文字列を算出する)

このメソッドが今回最も重要なメソッドの1つです。

Region内に含まれる文字列を読み取って文字列を返すメソッドです。

これを使って、寿司打の入力する文字列を読み取っています。

注意点としては、デフォルトでは日本語の読み取りができない点です。(英数字の読み取りが可能)

実は日本語を読み取り可能とする方法はあるのですが、今回はいったん日本語ではなく英語読み取りによるOCRでアプリを構築していこうと思います。

「寿司打ボット」コード(再掲)

Python
# 変更を検知したら呼び出すメソッド
def typeSushida(event):
    type(r.text())

# ユーザに監視するエリアを指定させる
# 今回は入力欄を指定する
r = 

# プログラムの処理継続時間
observeDuration = 90

# 入力する文字が変わった場合typeSushidaを呼び出す
r.onChange(100, typeSushida)
r.observeInBackground(FOREVER)

wait(observeDuration)
r.stopObserver()
print('finish!')

変数rで指定したエリア(Regionクラス)で変更が検知されるとtypeSushidaメソッドが呼び出され、その中で黄色枠の中の文字列を読み取り、自動で入力します。

この処理はバックグラウンドで実施されるため、処理終了までにはobserveDurationだけ待つ必要があります。(上記コードでは90秒)

不明点あればコメントください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です