スプラトゥーン2を楽しんでいた所、xx2zzから戦績管理サービスの存在を教えてもらった。
内容を要約すると、Nintendo Switch Onlineアプリ内で使えるイカリング2というサービスのセッションを自身でハイジャックすることにより、アプリ内では50件しか表示されない戦績データなどが全て引っ張れる模様。
上記記事の作者は戦績管理サービスのアプデに意欲的っぽいので皆様はそれを使えば良いのだが、他所様のサービスを使わず自鯖にデータベース化したいと思ったのでメモしておく。
iksm_sessionの入手
イカリング2が戦績データを入手する際にiksm_sessionというキーのCookieを使っているっぽい。
この値が得られないとどうしようもないので、Proxyサーバーを構築してiksm_sessionの値を入手する必要がある。
mitmproxyのインストール
mitmproxyをインストールするために、Debian Jessieを新たにインストールした。
CentOSで立てた人も居たのでCentOSの人はこちら(外部サイト)。
mitmproxyの構築手順は以下の記事を参考にした。
インストール直後のDebian 8.5では上記手順ではパッケージが足らなかった。
curl make gccのインストールが必須となる。最初から入れとけよ。
Windowsでのmitmproxy(2017/08/10追記)
Linuxなんて知らないよっていう人はWindows版のmitmproxyもあるようだ。
メンバーのエレモが記事にしてくれたので、インストール方法などは以下の記事をチェックして欲しい。
Windows版のmitmproxyでiksm_sessionを取得する際の質問はこの記事にお願いします。
mitmproxyの起動
port8080あたりを指定して起動させる。
[bash]
mitmproxy –insecure –port 8080
[/bash]
起動すると以下のような通信待ってますよ画面になる。
端末側の設定(iOS/Android)
端末側の設定は普通にmitmproxyのIP:Portを指定してやるだけ。
ただしそのままではHTTPSの通信が出来ないので証明書をインストールする手順がある。
iOSの場合(未確認)
「設定」→「Wi-fi」→接続中のWi-Fiをタップ→「HTTPプロキシ」
- HTTPプロキシの手動タブをタップ
- サーバーにmitmproxyのIPアドレス、ポートに起動時に指定したPortを入力(認証は不要)
- ブラウザでhttp://mitm.it/にアクセスし、AppleアイコンをタップしてSSL証明書をインストール
上記手順になるが、うまくいかなかった。
以下の記事を見るにiOSが悪いんじゃね?となって取得はAndroid端末で行うことにした。
Androidの場合(検証済)
「設定」→「WLAN」→接続中のWi-Fiを長押し→「ネットワークを変更」→「詳細設定項目」
- プロキシ設定から手動を選ぶ
- プロキシのホスト名にmitmproxyのIPアドレス、プロキシポートに起動時に指定したPortを入力して保存
- ブラウザでhttp://mitm.it/にアクセスし、AndroidアイコンをタップしてSSL証明書をインストール
3に関しては手持ちのAndroid環境ではうまくいかなかった。
最終的にmitmproxyをインストールしたDebianにある ~/.mitmproxy/mitmproxy-ca-cert.cer を拾ってきてGmailでAndroid端末に送信して実行することでインストールできた。
「VPNとアプリ」と「Wi-Fi」の2つから選択させられるが「Wi-Fi」を選ぶ。
iksm_sessionの取得
Proxyを設定しSSL証明書をインストールした端末でNintendo Switch Onlineアプリを開く。
するとmitmproxy側にずらずらっと通信が出るので、その中にある「https://app.splatoon2.nintendo.net/」を探す。
なお上下移動は「J」「K」キーでできた。
お目当ての行がみつかったのでそこでEnterを押すと詳細が見られる。
「Tab」キーを押すことでレスポンスが見られるので、その中のSet-Cookieを見るとお目当てのiksm_sessionの値が入っているのでこれを控える。
(薄い紫で塗りつぶした部分)
iksm_sessionの値が回収できたらmitmproxyは用済みなので終了させる。
(適当にq押してyとかで終わった)
PHPでスプラトゥーン2の戦績データを取得する
とりあえず取得テスト
iksm_sessionの値を使用してデータが引っ張れるかのテストコード。
とりあえず現在の装備データなんかが返ってくるAPIを指定している。
無いよりはお行儀が良いと思ってiPhoneの適当なUAを指定している。
$iksmに先ほど控えたiksm_sessionの値を入れること。
[php]
<?php
$data = squidFishing("https://app.splatoon2.nintendo.net/api/records");
print_r($data);
function squidFishing($url){
$iksm = "";
$header = array(
"Cookie: iksm_session=" . $iksm,
"User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A452 Safari/601.1"
);
$context = array(
"http" => array(
"method" => "GET",
"header" => implode("\r\n", $header)
)
);
return json_decode(file_get_contents($url, false, stream_context_create($context)));
}
?>
[/php]
APIについて
色々なAPIがあるみたいで、指定するURLによって得られる情報が異なるようだ。
[code]
https://app.splatoon2.nintendo.net/api/records
https://app.splatoon2.nintendo.net/api/festivals/active
https://app.splatoon2.nintendo.net/api/schedules
https://app.splatoon2.nintendo.net/api/records
https://app.splatoon2.nintendo.net/api/timeline
https://app.splatoon2.nintendo.net/api/onlineshop/merchandises
https://app.splatoon2.nintendo.net/api/results
[/code]
これは以下のサイトの情報で、Pythonでの取得サンプルコードも乗っていて参考になる。
あとがき
とりあえず自分の個人データを纏めたいのでPHPでデータ引っ張れるか確認するところまでやった。
本当はクローラーまで作ってコードを乗せたかったのだが眠いしだるいしで心折れた。
まだどこに何のデータがあるのか完全には把握していない。
まずはそのあたりをチェックした上で、欲しいデータを自動でDBにぶち込むクローラーを書いて次の記事にしたいと思う。
コメント
[…] スプラトゥーン2の個人データをPHPで取得する […]