スプラトゥーン2の個人データをPHPで取得する

PHP

記事をご覧の方へ

現在vivibit.netは旧システムからの移行に伴い修正作業を行っています。
表示上の問題や軽微なエラーが発生する可能性がありますが、ご利用に問題はありません。
また、現在一部ファイルのダウンロードができなくなっています。
順次対応予定ですが、お急ぎの場合や問題を発見された場合はコメント欄でご指摘いただけると助かります。


スプラトゥーン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を取得する際の質問はこの記事にお願いします。

Windows版mitmproxyでHTTPSの通信内容を見よう
AndroidのHTTPSの通信内容で見たいものがあって、ちょうどmitmproxyのWindows版が手軽そうだったので試してみました。インストールmitmproxyの公式サイトに行くと、ダウンロードリンクはGithubのmitmprox...

mitmproxyの起動

port8080あたりを指定して起動させる。
[bash]
mitmproxy –insecure –port 8080
[/bash]

起動すると以下のような通信待ってますよ画面になる。

端末側の設定(iOS/Android)

端末側の設定は普通にmitmproxyのIP:Portを指定してやるだけ。
ただしそのままではHTTPSの通信が出来ないので証明書をインストールする手順がある。

iOSの場合(未確認)

「設定」→「Wi-fi」→接続中のWi-Fiをタップ→「HTTPプロキシ」

  1. HTTPプロキシの手動タブをタップ
  2. サーバーにmitmproxyのIPアドレス、ポートに起動時に指定したPortを入力(認証は不要)
  3. ブラウザでhttp://mitm.it/にアクセスし、AppleアイコンをタップしてSSL証明書をインストール

上記手順になるが、うまくいかなかった。
以下の記事を見るにiOSが悪いんじゃね?となって取得はAndroid端末で行うことにした。

iOS独自アプリでの認証処理まとめ - Qiita
ATSの必須化が予定されていたり、ますますセキュリティが厳しくなってきていますね。今後は更にセキュリティレベルが高いアプリが求められることが予想されるため、しっかり理解しておきたいです。iOS独…

Androidの場合(検証済)

「設定」→「WLAN」→接続中のWi-Fiを長押し→「ネットワークを変更」→「詳細設定項目」

  1. プロキシ設定から手動を選ぶ
  2. プロキシのホスト名にmitmproxyのIPアドレス、プロキシポートに起動時に指定したPortを入力して保存
  3. ブラウザで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にぶち込むクローラーを書いて次の記事にしたいと思う。

コメント

  1. […] スプラトゥーン2の個人データをPHPで取得する […]

タイトルとURLをコピーしました