Raspberry Piにsplatnet2statinkをインストールして試合データを自動登録する

投稿者: | 2017/12/25
LINEで送る
Pocket

[2018/4/8] 「requirements.txt」から必須ライブラリをインストールする手順に変更。

どうも。お久しぶりです。
今「スパイダーマン:ホームカミング」のBlu-ray見ながら書いてます。
最初ベティの吹き替え役が水瀬いのりちゃんだとは気付きませんでした。
……どうでもいいですね。

Splatoonが楽しい!

Nintendo Switch専用ソフトSplatoon2、皆さん遊んでますか?

私はある日Switchが入荷してて、どこも品切れだったので「コレはチャンスでは!?」ということで買いました。Splatoonセットです。

で、ですね。Splatoon。
子供向けゆるゆるシューティングゲームかと思ったら意外と奥が深いんですよねこれが。やってみると分かります。

戦績を管理しよう

このSplatoonですが、奥が深くガチ勢も多いため、いろんな人がいろんなサービス・ツールを公開しています。
今回紹介する「stat.ink」もその有志が公開しているサービスの1つです。

stat.inkとは?

ではそのstat.inkとはなんなのか?

Q: なんでこんなの作ったの
A: 自分で記録とるのめんどくさいじゃないですか。
ラズパイとカメラでキャプチャして勝敗を記録するツールについての記事をまず見ていて、「これは導入できそうにないなあ」と思っていたところ、IkaLogを知って「このデータを活用すれば統計情報とか出せるね」となり、「でもIkaLogにはそういう部分ないのね」ってことで「じゃあ作りますか」と。
「作るのは面倒じゃないのか」と言われると「プログラマは楽をするために全力を尽くす生き物」です。少なくとも私には全部手入力とかExcelで管理とか無理です。stat.inkについてる機能もいくつか「面倒でこんなの誰も使わないって」と思いながらつけたものがあります。実際にはそこそこ使われてたりして「マメだなあ」とか思ってます。

-stat.ink FAQより

つまるところ「無ければ作ればいい」ってことですね。プログラマはみんな頭がおかしい(自虐を含む)。

まぁ私も最近知ったのでよく知らないんですが…
一言で言えば「Splatoonの戦績を管理するWebサービス」でしょうか。

戦績を自動でstat.inkへアップロードする

今作のSplatoon2はスマホ向けの「Nintendo Switch Online」アプリを利用して、「イカリング2」というサービスから過去50戦分の履歴を見ることができます。

ただし、それは50戦だけのお話。
でもそのデータを自動的にstat.inkへアップロードできれば、何もせず過去全てのデータを管理することができるというわけです。

splatnet2statinkとは?

splatnet2statink」とはPythonスクリプトで動く、Splatnet(イカリングの英語版名称)のデータを自動的にstat.inkへアップロードするツールです。

サーバーとかにインストールすれば常時稼働状態で自動的に管理が行えますし、MacやWindowsで実行することもできます。
今回はこれをRaspberry Piに導入したいと思います。

ついでに、サービス化して常に監視するようにしたいと思います。

splatnet2statinkを導入する

ちょっと難しいですが意外と簡単です。どっちだよ。

stat.ink

stat.inkへ登録する

まず、「stat.ink」へアクセスしてください。「ユーザー登録」をクリックします。

次に、登録に必要な情報を入力します。

  • 名前(表示用)…その名の通り表示用の名前です。Twitterで言うところの名前です。
  • ログイン名…ログイン用のIDのようなものです。多分公開されます。Twitterで言えばScreenNameでしょうか。
  • パスワード…パスワードです。

入力したらbot確認を行って、「ユーザー登録」を押します。

APIキーを確認する

「プロフィールと設定」ページにアクセスします。上部ヘッダーのメニューからアクセスできます。

「APIキーを表示」ボタンを押し、41文字くらいの英数字をコピーしてください。

このキーは、自分のstat.ink情報へのアクセスを無制限に許可することができます。絶対に他人漏らすことのないようにしてください。

iksm_session

iksm_sessionとは、イカリングへアクセスする際のトークンキーとでも言いましょうか。

IDとPWが会員証と身分証明だとしたら、セッションキーは入場証みたいな物です。
これがあれば、以後の出入りは有効期限内なら自由です。

splatnet2statinkは正規サービスではないので、これを自分のログイン情報から横取りします。(他人の、ではありませんよ?)

これからセッションキーを傍受します。自分のログイン情報なので不正アクセスにはなりませんが、このキーも他人に漏れるとイカリングへの全てのアクセスを許すことになります。
ログイン情報が漏れたのと同義で大変危険ですし、自分で行う行為もセッションハイジャックと等しいです。
また、正規のサービスを利用するものではないので任天堂よりアカウント停止等の危険性もあります。必ずご自身の判断にて利用をお願いします。
これから説明する方法で何かあっても責任は負えません。

mitmproxyのインストール

Web経由での通信内容をのぞき見します。既にイカリングへログイン済みのアプリから、セッションキーを盗もうという魂胆です。

そのために使うのがmitmproxyというソフトです。ラズパイにインストールします。

sudo apt-get install mitmproxy
mitmproxy

下の画像のような画面になれば起動成功です。

スマホへ証明書をインストール

イカリングはhttps通信なので、そのままでは傍受できません。スマホへmitmproxyの証明書をインストールします。

まず、スマホとラズパイを同一ネットワークに接続し、スマホのWi-Fi設定画面を開きます。
その後接続しているWi-Fiの画面を開いてください。

そうしたらプロキシの設定画面を表示させ、ラズパイのIPアドレスと、ポート:8080を指定します。認証は必要ありません。

設定が終わったらスマホからmitm.itへアクセスし、ご自身のスマホのOSを選択します。
(イカ以下、iOSの説明です)

リンゴマークをタップするとプロファイルをインストールする旨を聞いてきますので、許可してください。

プロファイルをインストールします、

その後、設定Appで「一般」→「情報」→「証明書信頼設定」を表示させ、「mitmproxy」をONにします。

あとは適当に何かWebサイトを表示させて問題なく見られればOKです。

セッションキーを取得

スマホで、Switch Onlineアプリを開いてください。
※私はなぜかエラーが出て起動できなかったので、「ikaWidget 2」というアプリにログインして、そのデータを使いました。
Nintendoアカウントとリンクしていて、イカリングからデータを取得しているアプリなら多分なんでもOKです。

いろいろコンソール上に出ていると思いますが、これでは分かりづらいので「L」キーを押してください。
そして「nintendo」と入力します。これで任天堂サーバーとの通信にフィルタリングされました。

そして、「J」「K」キーで左のカーソルを上下に移動させ、「GET https://app.splatoon2.nintendo.com/?lang=ja-JP」を見つけます。
見つけたらEnterキーを押してください。
詳細画面に移りますので、Tabキーを押します。

「Response」タブが表示されていますので、「Set-Cookie」にある「iksm_session=xxxxxxxx…」の英数字をコピーしてください。
これがセッションキーになります。

あとは「Q」キーとか押すと戻ります。

splatnet2statink

サーバーを用意する

今回はRaspberry Piを使います。Pythonが動けば多分なんでもいいと思います。(無責任

必要なアプリケーションの事前準備

gitや、pipをインストールします。Pythonはラズパイなら最初から入っているので実行不要だと思います。

sudo apt-get install git
sudo apt-get install python
sudo apt-get install python-pip

gitからリポジトリをコピーする

リポジトリを作りたいフォルダーを作ってください。
(私は今回、「~/applications/git/」内に作っています。)

cd ~/applications/git/
git clone https://github.com/frozenpandaman/splatnet2statink.git
cd splatnet2statink/

必要なライブラリをインストール

splatnet2statinkの実行に必要なライブラリを自動インストールします。

pip install -r requirements.txt

Pythonスクリプトを実行

あとはスクリプトを実行すればOKです。

python splatnet2statink.py

起動すると最初にAPIキーを聞いてきます。これは、「stat.inkのAPIキー」になります。

入力してEnterを押すと、次はクッキーを聞いてきます。これが「iksm_sessionキー」です。

それも入力すると過去何戦分のデータをアップロードするか聞いてきます。とりあえず「1」と入力してください。

ちょっと待って、「Battle #1 uploaded to <URL>」が表示されれば成功です。
stat.inkの自分のページを表示してみてください。バトルが表示されていますか?表示されていればOKです。

ハズカシイので「勝利」のみでフィルタリングしました

サービス化して常時監視する

さて、インストールできたのはいいですがこれを毎回バトルの度に起動するの面倒くさいですよね。
モニターモードというのがあるので、「python splatnet2statink.py -M」ってやってからバトルを始めればいいのですが、忘れるかもしれません。
もしかしたら旅行とかで起動できないかもしれません。

そこで、「Supervisor」というツールを使ってデーモン化させます。

以下のページを参考にしました。
SupervisorでPythonのWebアプリをデーモン化する

Supervisorをインストールする

sudo apt-get install supervisor

これだけ

設定ファイルを記述する

どのスクリプトをデーモン化するのか、とかの設定です。

よく分からないのですがとりあえず自分なりの名前に変えてます。詳しい方はご自身のお好きな名前でどうぞ。

sudo vi /etc/supervisor/conf.d/splatnet2statinkd.conf

テキストエディタで以下を記述します。

[program:splatnet2statinkd]
directory=/home/ubuntu/applications/git/splatnet2statink/
command=python /home/ubuntu/applications/git/splatnet2statink/splatnet2statink.py -M 10800 -r
numprocs=1
autostart=true
autorestart=true
user=ubuntu ;ユーザー名を記入
redirect_stderr=true
stdout_logfile=/var/log/supervisor/splatnet2statinkd.log

ユーザー名とか設定ファイル名とか実行コマンドとかは適宜書き換えてください。

「command」のところですが、「-M 10800 -r」となっています。これは
「モニターモードを10800秒(180分)間隔で、既にアップロード済みのものを確認しながらアップロードする」というものになります。

常時アクセスを行うので、過度な監視は任天堂のサーバーに負担をかけることになります。
最低1時間以上、だいたい3時間から4時間間隔がいいと思います。
(もしこれが原因で垢BANされても責任は負えませんよ)

そもそもマッチングやリザルト含めて1試合が5分だとして、50試合分は取得できるので
250分、4時間間隔でも十分もれなく取得できます。さらにガチマではもうちょっと時間がかかったり、休憩したりすることを考えると5時間でも多分大丈夫です。

サービスを開始する

サービスを再起動します。その後、起動確認します。

sudo service supervisor restart
sudo service supervisor status

activeとかrunnningとか表示されていればSupervisorサービス自体は起動しています。

次に、splatnet2statinkを自動操作するサービスを開始します。
設定ファイルを書き換えたので、必ず最初にリロードを行ってください。

sudo supervisorctl reread
sudo supervisorctl start splatnet2statinkd
sudo supervisorctl status

最後のステータス確認でRUNNINGとかになっていればOKです。

動作確認をする

といっても、モニタリング間隔を3時間とかにしてしまったので長いです。
何試合かして寝ましょう。そして、翌日の朝見ましょう。

それが面倒な人は、動作確認用に10分間隔とかに一時的に変えてもいいかもしれないですね。
戻すのを忘れずに。

試合結果がstat.inkへ反映されていれば問題ありません。

splatnet2statinkをアップデートする

Splatoon2自体が結構頻繁にアップデートしますし、それに伴ってsplatnet2statinkもアップデートします。
放置すると、新ブキが空欄になったりします。

できればgithubで更新確認、最低でも新マップ・ブキ・ギア等が追加したときはアップデートの確認をした方が良いかなと思います。

サービスを停止後、アップデート

サービス起動中でスクリプト動作中だとどうなるか分からないので、サービスを停止します。

sudo supervisorctl stop splatnet2statink
sudo supervisorctl status

STOPPEDを確認してください。

cd ~/applications/git/splatnet2statink/
python splatnet2statink.py

起動すると、
「There is a new version available.」と表示されます。「Y」を入力し、アップデートしてください。

無事完了すると、「Successfully updated to vx.x.x….」と表示され、アップデート完了です。

もう一度「python splatnet2statink.py」と入力して起動できることを確認したら、
アップロードするバトル数は「0」を入力して終了します。

sudo supervisorctl start splatnet2statinkd
sudo supervisorctl status

サービスを起動状態に戻し、正常稼働を確認したら終了です。

おわり

私は最初に導入しようと思ったとき、Pythonのバージョンが低かったようでエラーが出てしまいました。
「OpenSSL ZeroReturnError」みたいな感じのヤツです。とりあえずアップデートしたら直りました。

これで快適なイカライフが送れますね。
まだまだウデマエSではないのでそんなに活用できるのか分かりませんが、データダウンロードもできるようなのでそのうちやってみたいです。

他のブログだと「イカ、ヨロシク〜」って言ってお別れすると思うのでしょうが、無印はやったことないので分かりません。ふつうに締めたいと思います。

それではさようなら。

LINEで送る
Pocket

コメントを残す

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

CAPTCHA