Web、サーバ、ソフトウェア、バグ・脆弱性 などの情報を何人かで集まって書いていく IT/Web情報系ブログ

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

投稿日:   最終更新日:2017/08/10  投稿者:ktm@s

スプラトゥーン2を楽しんでいた所、xx2zzから戦績管理サービスの存在を教えてもらった。

スプラトゥーン2のスコア(戦績)管理サービスを作ってみた - Dlog 隔離館
こんなの 経緯 前作はPC向けで作っていましたが、今作はスマホ向けに作りました。 Nintendo Switchアプリ..

内容を要約すると、Nintendo Switch Onlineアプリ内で使えるイカリング2というサービスのセッションを自身でハイジャックすることにより、アプリ内では50件しか表示されない戦績データなどが全て引っ張れる模様。

上記記事の作者は戦績管理サービスのアプデに意欲的っぽいので皆様はそれを使えば良いのだが、他所様のサービスを使わず自鯖にデータベース化したいと思ったのでメモしておく。

iksm_sessionの入手

イカリング2が戦績データを入手する際にiksm_sessionというキーのCookieを使っているっぽい。
この値が得られないとどうしようもないので、Proxyサーバーを構築してiksm_sessionの値を入手する必要がある。

mitmproxyのインストール

mitmproxyをインストールするために、Debian Jessieを新たにインストールした。
CentOSで立てた人も居たのでCentOSの人はこちら(外部サイト)

mitmproxyの構築手順は以下の記事を参考にした。

Raspberry Pi 3にmitmproxyを導入する
仕事での開発時によくお世話になっている mitmproxy ですが、週末プライベートでの開発時にふと使いたくなったものの、自宅PCは無線LANの無いWindowsデスクトップだったり、有線LANの無いMacbook Proだったりするので、そのどちらも持っているRasp...

インストール直後の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のmitmproxyのページになっているので、そちらからダウンロードしました...

mitmproxyの起動

port8080あたりを指定して起動させる。

mitmproxy --insecure --port 8080

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

端末側の設定(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
$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)));
}
?>

APIについて

色々なAPIがあるみたいで、指定するURLによって得られる情報が異なるようだ。
https://app.splatoon2.nintendo.net/api/results なんかで戦績はバッチリなのかな。

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

これは以下のサイトの情報で、Pythonでの取得サンプルコードも乗っていて参考になる。

[Python]イカリング2のJsonを取得してみた - Qiita
イカリング2のデータをPCのブラウザで見る方法が上がっていたため,それを参考にした.(http://s2terminal.hatenablog.com/...

あとがき

とりあえず自分の個人データを纏めたいのでPHPでデータ引っ張れるか確認するところまでやった。
本当はクローラーまで作ってコードを乗せたかったのだが眠いしだるいしで心折れた。

まだどこに何のデータがあるのか完全には把握していない。
まずはそのあたりをチェックした上で、欲しいデータを自動でDBにぶち込むクローラーを書いて次の記事にしたいと思う。

- PHP, スプラトゥーン2 ,

Comment

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

Message

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

関連記事