Splatoon2のAPIを叩いてみる

# 何の記事なの？

* イカリング２が使ってるAPIをアプリ外から自分で叩けるようにする
* 技術的な話は抜きで、とりあえずAPI叩きたいって人用

# API叩くとどんなことができるの？

* 過去50戦の戦績がJSON形式で取得できるので戦績の統計をとれる
* ガチルールのスケジュールなどをイカリング２を開かずに確認できる
* などなど

# 導入

みなさん、こんにちは。イカやってますか？イカ。

私は初代Splatoonが流行っていたころにはWii Uを持っていなかったので指をくわえて見るだけだったのですが、Splatoon2がSwitchで出てからは狂ったようにやり続けています。ｲｶﾁｬﾝｶﾜｲｲ。ﾏﾝﾒﾝﾐ。

さて、Splatoonには対戦結果を閲覧したりするために「イカリング」というサービスが用意されています。
Splatoon2にもこのサービスがあり、「イカリング２」というスマホアプリとして提供されています。
このイカリング2、デザイン的に素晴らしく、さすがNintendoと思わせてくれるようなアプリなのですが、少し不満もあったりします。

* アプリの起動が若干遅い
  * アプリを開いた後の暗転状態が地味に長く、微妙にストレス
  * 俺は今すぐ戦績が見たいんだ！

これが解消されて(?)色々使い勝手を上げた非公式アプリもあるようですが、よくわからないアプリにアカウント情報渡すのはなかなか怖いわけなのです。

それなら自分でどうにかするしかないので、色々検索してやり方を学んできました。
既に手順を書いた記事がいくつかあるのですが、自分が普段使ってるソフトと使っているものが違ったので、自己流的にやってみて、備忘録＆Qiitaデビューという感じで書き残すことにしました。

他の記事でも言われてますが、ここでも少し言っておくと、今回紹介することはもちろん完全に非公式なものです。
公開されていないAPIを叩くので、アクセスしすぎて特定のIPふさがれたとか、アカウント単位でふさがれたとかなる可能性もあるかもしれません。
**そこは自己責任でお願いします。**

# API叩く準備

## 0．環境

自分の環境に応じて読み替え・インストールしてください。

* PC
  * 本記事では Windows 10 を使います
* スマホ
  * 本記事では Android 7.0 を使います。
* イカリング２
  * アカウント設定も済ませましょう
* Wifi環境
  * PCとスマホが同じネットワーク上にある必要があります
* プロキシツール
  * 今回は私が普段使っている fiddler を使います
  * https://www.telerik.com/fiddler
* Postman
  * 気軽にGETやPOSTを投げることができる便利ツール
  * https://www.getpostman.com/

## 1．イカリング２の通信内容を確認する

イカリング２の通信内容を盗み見て、どんな通信を行っているか確認します。

そのためにプロキシツールというものを使うのですが、プロキシツール自体の詳細は詳しくは話しません。
自分のPC・スマホの通信内容が見れるツール という風に思ってもらえれば間違いないです。

今回は fiddler というツールを使います。
通信内容を見るために設定が必要なので、イカのサイトを参考に設定してください。
https://www.sim-jozu.net/archives/288

途中、Android端末への証明書インストールのところで示されているURLにアクセスできないかもしれません。
その場合はイカのサイトを参考にしてください。
https://qiita.com/hikoma/items/d8e1335a426ade199304

これでAndroid端末の通信内容がfiddlerに表示されるようになります。

## 2．自分のアカウントのiksm_sessionキーを確認する

イカリング２を起動し、Splatoon2のページをいくつか遷移してみます。
するとFiddlerの画面左にずらーっと通信内容が並びます。
(画像では見やすいようにFilterをかけてるので app.splatoon2.nintendo.net 関係しか表示されてませんが、実際はほかにもいろいろ表示されます。)

![fiddler_spla_api.PNG](https://qiita-image-store.s3.amazonaws.com/0/171561/099b1b53-2714-1235-3e84-59adee663a66.png)

なんかうまいこといってそうです。

イカの画像では既にいろいろ試してますが、一つ試しに通信内容を選択します。
そして、右側上部のタブから「Inspectors」を選択すると、実際の通信内容が表示されるので、「Header」タブに表示されるデータを見ていくと、Cookie内に iksm_session を発見しました。
(画像赤塗部分)

![fiddler_iksm.PNG](https://qiita-image-store.s3.amazonaws.com/0/171561/565754e5-3b2c-e4fe-a6d1-4293a97b69e7.png)

これがSplatoon2のAPIを使う際にユーザーを特定するためのセッショントークンのようです。
これが他人に知られると自分のアカウントを使われて勝手にいろいろなAPIを叩かれてしまします。(セッションハイジャック)
戦績を見られるくらいならどうってことはないですが、他のアカウントを通報されまくると垢停止などにもなりかねないので、**取り扱いには十分注意してください。**

まぁ一定時間で値は更新されるはずですが、その間に色々やられかねないことに変わりはないです。

## 3．イカリング2が使っているAPIを確認する

iksm_sessionの値が確認できたので、次は戦績取得に使えそうなAPIがないか確認します。

既に上の画像で出ていますが、イカリング２でバトルのきろくを開いた際に表示される通信の宛先URLがそのAPIです。

https://app.splatoon2.nintendo.net/api/results (過去のバトル50戦一覧の取得)

他にも何か使えそうなAPIがないかも確認してみます。

https://app.splatoon2.nintendo.net/api/results/[バトルNo.] (特定の自分のバトルの戦績取得)
https://app.splatoon2.nintendo.net/api/share/results/[バトルNo.] (バトルをShareする際に使われる画像の取得)
https://app.splatoon2.nintendo.net/api/onlineshop/merchandises (ゲソタウンオンラインショップ商品一覧取得)
https://app.splatoon2.nintendo.net/api/onlineshop/order/[商品No.] (ゲソタウンでの注文)

他にもステージスケジュールやフェスの記録などもあります。

ちなみに上のURLをそのままブラウザで開こうとしてもエラーとなります。
Cookieに iksm_session がセットされてないからですね。

## 4．どんなデータが取れるか確認する

Fiddler画面上左側の通信情報から /api/results/[バトルNo.] のものを選択します。
右側上部のタブから「Inspectors」を選択し、通信内容を表示させたあと、右側下の「JSON」タブを選択します。
これらのAPIのレスポンスはJSON形式となっているので、ここに戦績のデータが表示されます。

![fiddler_json.PNG](https://qiita-image-store.s3.amazonaws.com/0/171561/6ccf9d7a-73f1-c886-4a22-0f13261975e0.png)

どのAPIも基本取れる情報はアプリ内で表示されているものと変わらないのですが、一部アプリ内で表示されてないものもあったりします。

/api/results　や /api/results/[バトルNo.] からの取得データ内、 player_result 内に sort_score というものがあります。
どういうデータなのかは明確でないですが、そのバトル内での貢献度(Score)でしょうか。
自分がどれだけ貢献できていたか、Kill数などを総合したものだとすれば、ゲージの上昇量、ウデマエの上昇量、ヒビの入り具合などはこの値を元に判定されているかもしれません。

また、/share/results/[バトルNo.] では戦績をShareする際に使われる画像のURLがそのまま帰ってきます。
戦績を管理する際に画像も残しておきたい場合、使えそうです。
バトルが終わったら自動で戦績画像をどこかに投稿するBotなんかも、自分へのプレッシャーになって面白いかもしれません。

# イカリング外からAPIを叩く

ここまででAPIを叩くのに必要な情報は出揃いました。
後は好きな方法でAPIを叩くだけです。

今回はプログラムを書く気力がなかったので、 Postman というツールを使って確認してみます。

Postmanをインストールして起動すると、初回はアカウントの登録を求められますが、今回は一番下にある 後で登録する リンクを選択し、先に進みます。

するとホーム画面が表示されますので、
「Enter reqest URL」と書いてある箇所にAPIのURLを書き、「Cookies」というリンクを押します。

![postman_url.PNG](https://qiita-image-store.s3.amazonaws.com/0/171561/5f818a79-25e7-fb3f-1241-920dd6fc9f44.png)

Cookieを追加する画面が表示されるので、 先ほど確認しておいた iksm_session の値をそのまま書き込みます。

![postman_cookie.PNG](https://qiita-image-store.s3.amazonaws.com/0/171561/993271bd-743c-50af-84b6-7092986aff44.png)

そして、ホームに戻り、URL横の「Send」ボタンを押すと…

画面下部にResponseのJSONデータが表示されます！

ついでに /api/results/[バトルNo.] を使って、過去50試合より前の戦績が取れないか試してみましたが、`NOT_FOUND_ERROR`が帰ってきて取得できませんでした。
もっと遡って戦績取れたりしないかなと少し期待してたのですが、APIがそう返すのなら仕方ないです。

# 終わりに

とりあえずAPIをイカリング２以外から叩けるようになって、戦績をJSONで取得できるようになりました。

この戦績を管理しようとすると、残りタスクとしては、

* 過去の戦績を可能な範囲で取得
* 新しい戦績を毎日取得
* 取得したデータを統計がとりやすいように管理

でしょうか。
そこまでできたら近いうちに別記事であげる予定です。

それでは皆様、良いイカライフを。

~~さて、マリオオデッセイやるか…~~

## 参考文献
https://qiita.com/gahaq/items/d8d06c111e2518bfbc87
https://qiita.com/valmet/items/1b3960085a8764778bf0
https://vivibit.net/splatoon2-getdata/