ポケモンGO非公式APIを使ってみた
※非公式APIの利用はBANの可能性があるので、利用は自己責任で
最近久々にポケモンGOをやりました。
昔、ポケコンGOで個体値のチェックにPokeIVというサイトを使っていたのですが、久々に使ってみるとほとんど使えなくなってました(ごくまれに通るのですが、ほとんどサーバーエラー)。代替で1秒個体値計算とかも試してみましたが、何かメンドクサイ。ググっているとGitHubに非公式のポケモンAPIのプロジェクトがいくつもあるじゃないですか。
プログラムの知識は多少あるので、どうせなら自分でプログラムを作ってみようと思いました。多分ポケモン一覧とってきて個体値表示するだけとか簡単だろうし、 ひっそり個人でやる分にはそんなにBANの可能性も低いじゃないかなー?ということで。
やってみた手順をメモしておきます。ちなみに自分のプログラム環境はWindows10 + Javaです。
■プロジェクト選び
GitHubでPokemonで検索するといろいろ出てきますが、私はほぼJavaしか使えないのでJavaのプロジェクトで、比較的人気があり、最近も更新されているのを選びました。
PokeGOAPI-Java
https://github.com/Grover-c13/PokeGOAPI-Java
■Gitクローン
まずやるべきことは、ソースをダウンロードしてビルドして、利用したいjarファイルを作ることです。この環境設定にけっこうてこずりました。Githubからのクローンですが、submoduleなんとかとかしないといけないらしく、自分が使ってるIDEだとやり方がよくわからなかったので、コマンドラインで使えるツール(公式のGitクライアントのWindows版)をダウンロードして利用しました。
作業を行う場所ですが、Windowsだと深い階層にプロジェクトを置いてビルドするとエラーになるため(後述)、今回はドライブ直下の短めの場所にディレクトリを切って作業を行いました。
具体的には、PokeGOAPI-Javaをクローンしてくる場所を "E:\p"にしました (Eドライブ直下のpディレクトリ)。
■Gitサブモジュールの初期化
次に、PokeGOAPI-JavaのWebサイトで解説されてるように、submoduleの初期化を行います。
C:\Users\itayo>E:
E:\>cd p
E:\p>git submodule update --init
Submodule 'library/src/resources/protobuf' (https://github.com/AeonLucid/POGOProtos.git) registered for path 'library/src/resources/protobuf'
Cloning into 'E:/p/library/src/resources/protobuf'...
Submodule path 'library/src/resources/protobuf': checked out '3f7b2bb6888de1ec45f0e84a8cb1ceba5e27e237'
ちなみにこのサブプロジェクトは通信で利用するポケモンのデータが定義されており、Google Protocol Buffersというツールが利用されています。
■ビルド
ビルドはgradleが利用されています。Windows上でビルドするときはw付きのgradlew.batを叩きます。gradleがわらわら必要なものを自動的にダウンロードしてきて、ビルドが行われます。
E:\p>gradlew library:build
Downloading https://services.gradle.org/distributions/gradle-3.0-bin.zip
....
:library:check
:library:build
BUILD SUCCESSFUL
Total time: 1 mins 32.489 secs
ビルドの結果、必要なjarファイルが以下の場所に生成されます。この-all-xxx.jarを自分で作るJavaプロジェクトのクラスパスに指定します。
E:\p\library\build\libs
PokeGOAPI-library-all-0.4.1.jar
...
■ファイル名が長すぎるエラーについて
上のように浅い階層にブツを置いておかないと、ビルドでこんなエラーになります。このエラーの解決で何時間もハマりました。
ググってみると、 Windowsの最大ファイル名の長さが260文字までであることが原因らしいです。
How to fix "The filename or extension is too long" ? #264
https://github.com/jabbink/PokemonGoBot/issues/264
During set-up receiving error=206 filename too long #454
https://github.com/jabbink/PokemonGoBot/issues/454
レジストリをいじったら260文字以上もOKって記事があったので、まずこれを試してみたんですが、
How to Make Windows 10 Accept File Paths Over 260 Characters
同じエラーが出るのであきらめて、作業するディレクトリの階層を浅くしました。
あと、今回は不要でしたが、gradleのリポジトリも浅い階層にしたければ、GRADLE_USER_HOME環境変数で指定できます。何も指定しないデフォルトはユーザー/.gradleディレクトリ。
■自分のプログラム開始
さて、ビルドが終わりようやく、プログラムに入ります。私はだいたいEclipseを利用しているので、今回もEclipseで作りました。普通のJavaプロジェクトを作成し、先ほどのビルドで生成されたPokeGOAPIのjarファイル(PokeGOAPI-library-all-0.4.1.jar)を、ビルドパスに追加します。お好みでjavadoc.jarやsources.jarもアタッチできます。
で、さぁログインしようとかと思ったのですが・・・サンプルをコピってログインしようとしたのですが、何やらエラーが出ます。
Exception in thread "main" com.pokegoapi.exceptions.request.RequestFailedException: com.pokegoapi.exceptions.request.HashException: com.pokegoapi.util.hash.legacy.LegacyHashProvider is no longer supported
at com.pokegoapi.util.AsyncHelper.toBlocking(AsyncHelper.java:36)
at com.pokegoapi.main.RequestHandler.sendServerRequests(RequestHandler.java:139)
...
■PokeHashキーの購入
サンプルのExampleConstants#getHashProviderで利用されている、PokeHashProviderクラスのjavadocを見ると、無料じゃもうログインできないよ、こっち見てねと書いてました。
Hash provider on latest version, using the PokeHash hashing service. This requires a key and is not free like the legacy provider.
See Also: https://hashing.pogodev.org/
このサイトでpokehashkeyとやらをゲットする必要があるようです。全然動かないよ!買ったのにキーが届かないよ!みたいな書き込みもあって、ちょっとどうしようかなーとも思ったのですが、ここでやめるのも何なので一番安いやつ(HashBuddy 150 RPM)を買ってみました。Paypal支払いで3.95€(約500円)でした。
確認メールがすぐ届き、数分後にPokeHash Keyを記載したメールが送られてきました。
■プログラム再開
で、ゲットしたPokeHashキーを使ってプログラムを再開。ログインできた!とりあえず一安心です。
で、所有ポケモンのIVの一覧を表示するプログラムもちゃちゃっと作れました。こんな感じ。
とりあえずやりたいことはできました。が、これを本アカで使うかとなると、ちょっと覚悟がいりますね・・・
今回は、はじめてgitをコマンドラインで利用、はじめてのgradleの利用、Protocol Buffersとか聞いたのもはじめて、とはじめてのことをいろいろ経験できてよかったです。あと久々にプログラムして少し楽しかったです。