まいにち右往左往

日記です。興味の範囲がバラバラで統一性がない日記です。だんだん備忘録っぽくなってきました。

iksm_sessionを自動更新したい

 スプラトゥーン2の戦績を分析してウデマエを上げたい!ということで、イカリング2の情報をPython使って引き抜いていきます。
データを分析する前に、分析するデータが手元に欲しいですものね。

 

halwind.hatenablog.com

上の記事では 、iksm_sessionというキーを使って戦績を抜き出すところまでたどり着きました。
ほとんど先に手を付けておられた方のおかげです。
ですがこのiksm_ssession、一定時間で更新されてしまうようです。
せっかく情報を自動で集められるのに、数日ごとにキーを抜き出すのは面倒くさい。
どうせならキーの更新まで自動でやりたいなぁ、というのが今回の試みです。


iksm_sessionを抜き出したときと同様に、公式アプリの通信を一つ一つ確認し、Pythonで再現していきました。
数回アプリの通信を何回か確認してみると、最初の通信は固定のトークンを利用しているようなので、そこからスタートします。
こんな感じです。

 

通信先のURLやトークンの値は通信の中身から抜き出します。

url_idtoken = 'https://accounts.nintendo.com/connect/1.0.0/api/token'
data_idtoken = {
    'client_id': 'クライアントID',
    'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer-session-token',
    'session_token': 'セッショントークン'
}

 

データをセットしたらrequestsモジュール使ってデータを送り、返ってきた値から必要な値を取得します。

response=requests.post(url_idtoken, json=data_idtoken)
response.json()['id_token']

 

上記のコードで、多分固定されてるクライアントIDとセッションコードから、id_tokenを取得することができました。
次はこのid_tokenを使って別のトークンを取得し……と繰り返していけば、iksm_sessionにたどりつけそうです。

 

こんな感じで意外に順調に進んでいたのですが、途中でfというトークンが取得も再現もできない、という壁にあたりました。
64文字のトークンで、16進数ぽいので、何かをハッシュ化したものみたいです。
ただ関係しそうなトークンをいくつか適当な方法で計算しても同じ値がとれません。

 

これは大きな壁に突き当たったなーと思いながら、なにか情報はないかと探したら、このfトークンを計算して返すAPIを公開している方がいました。 

github.com

 

 やはりトークンfの値はアプリ内で計算しているようですね。
こちらのAPIを使って、iksm_sessionの値を更新するところまではできました。
が、テストしてからきちんと上のサイト読み返すと、API使うなら連絡しないといけないようです。

ちょっと時間を使ってトークンfの値を自力で計算できないか試してみて、ダメならこちらのAPIを使わせていただくようにしましょう。

 

トークンfについて調べていく中でしったのですが、これは途中で導入されたようでした。
多くの人が任天堂の非公開APIを叩きすぎたのでしょうかね。
どちらにしろ、無駄な負荷は与えないように注意しなければ。

 

2018年10月2日追記

任天堂オンラインの有料化に伴ってアプリも更新され、どうやらfの作成方法が変わったようです。やり直しだー。