いうていけろ

hideo54のブログ

トップページ
技術

スクフェスのライブスコアを取得する “schfeslog” を作った話

2016年12月22日

この記事は最終更新から半年以上経過しており、内容が古い可能性があります。

Advent Calendar制作物紹介ラブライブ!スクフェス通信解析制作物紹介宣伝

この記事はラブライブ! Advent Calendar 201622日目の記事です。

各タスクに忙殺されて次々と締切をオーバーしてしまっているhideo54です。

本来この記事はElectron Advent Calendar 2016 22日目の記事とセットで別の自作ソフト(Electron製)の紹介をするつもりだったのですが、かなり間に合わなさそうなのと、名前にしかラブライブ!要素がなくて怒られそうなのとで、結局こちらのラブライブ! Advent Calendarの方ではまた別の自作ソフトの紹介をすることにしました。

というわけで、本題。タイトル通り、スクフェスでのライブプレイスコアを取得するプログラム “schfeslog” を作りました。

と言っても最低限の機能しかまだ実装できておらず、この不十分な進捗のまま公開するべきかどうか迷ったのですが、前述のような経緯があったため、この機に宣伝 (と協力のお願い) を兼ねて、現行版を公開することにしました。現状全てNode.jsで書いています。

GitHub: https://github.com/hideo54/schfeslog

現状何ができるの?

こんな感じで勝手にプレイログを取得してTwitterにつぶやかせることができます。

使い方

git clone https://github.com/hideo54/schfeslog
npm install
cp settings-sample.json settings.json

上記3行を実行したら、settings.json を適宜編集する必要があります。

デフォルトでは log.txt にログが保存されていくのみとなっています。Twitter への投稿機能を有効化する場合、twitter.on の値を true に設定し、auth の各項目を適宜設定します。 また、デフォルトではポート25252で実行されるようになっていますが、変えたければ port の値を変更します。 編集が終わったら後は、main.js を Node.js で走らせるだけです。 常時起動させる必要がありますので、適宜 forever とかを使うと良いと思います。

起動させたら、スクフェスをする端末の方で、main.jsが走っているサーバーを HTTP プロキシに設定すれば OK。 後はライブをプレイする度勝手に記録されます。

簡単に技術的な話をする

スクフェスはライブの際、プレイ中はクライアントでのみゲームを実行し、ライブ終了後にゲームのプレイ結果をサーバーに送信する、という仕組みを取っています。その際サーバーに送信されるデータ(TLS暗号化されていない)は以下のようなものです:

{"module":"live","action":"reward","good_cnt":12,"miss_cnt":2,"great_cnt":107,"commandNum":"(略)", "love_cnt":46,"max_combo":106,"score_smile":206404,"perfect_cnt":239,"bad_cnt":0,"event_point":0,"live_difficulty_id":1312,"timeStamp":(略), "mgd":2,"score_cute":0,"score_cool":0,"event_id":null}

つまり、HTTPプロキシを作成して通信を傍受し、サーバーに上記のようなデータが送信された場合、このJSONをパースすれば戦績が取得できるわけです。(実は、曲名は直接的には取れませんlive_difficulty_id が曲とその難易度を表しているっぽいので、この値を data.json手動で登録しています。)

(ちなみに、この送信データの一部を書き換えると通信エラーになります。commandNum で内容の検証を行っているようですね。)

公開したプログラムのmain.jsでは、Node.jsのhttpモジュールを利用してHTTPプロキシサーバーを動かしています。

利用上の注意

  • 何の認証も用意していませんので、プロキシサーバーと同一ネットワークにいる他の人がこのプロキシサーバーに接続してスクフェスをプレイした時も、同様にツイートされます。自分しか利用しないことが確実なネットワーク上で走らせ、その外で利用したい場合は適宜VPNを挟むなどする必要があります。(さすがにこれはアレなので、そのうち認証機能を用意しようと思っています。)

  • 上記の通り、曲名とその難易度は手動で登録していくしかなさそうです。現在ランク90の僕がプレイできる標準楽曲は全て登録済みですが、それ以降に開放される標準楽曲や特別楽曲は未登録です。未登録のものはIDを直に流すようにしています。もし登録に協力してくださる方がいらっしゃれば、GitHub に Pull Request をいただければ喜びます。

今後追加したいと思っている機能

  • 認証機能

最優先。安心して外でも使えるようにしたい。

  • リプライによる曲名登録

live_difficulty_idに対応する曲名と難易度が未登録の場合、結果ツイートにリプライを送れば登録できるようにしたい。

  • ストーリーの保存

ストーリーDL時にサーバーからやってくるファイルを保存したい。(バイナリ見ても)

  • 部員勧誘結果の取得

まだ見ていませんが、たぶん曲と同様に部員情報がIDで振ってきてそうな予感がしますので、もしそうであれば非現実的かな…。

  • LPの状態の取得

いつLPが回復するかお知らせしてくれたらめっちゃ便利そう。どこかでサーバーと通信しているはずなので、これは可能かなと思っている。

これらの追加予定機能については、(新機能を試したいという気持ちもあり)GitHub Projectsに列挙していくつもりです。

おわりに

今後のメンテナンスはGitHub上で行うつもりなので、興味のある方は適宜リポジトリをWatchしてくださればと思います。機能追加/改善や曲データの追加をした際はPRをいただけると喜びます。

P.S. 来週に迫った冬コミでは、僕の所属しているサークル “SunPro” (1日目西み29b) も出展するのですが、そこで販売される「SunPro会誌」に、僕の書いた「機械学習でμ'sの声を識別する」という記事も載るので、興味のある方はぜひお買い求めください!

こちらの詳しい宣伝はまた後日...。

追記: 書きました。