スクフェスのライブスコアを取得する “schfeslog” を作った話
この記事は最終更新から半年以上経過しており、内容が古い可能性があります。
この記事はラブライブ! 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の声を識別する」という記事も載るので、興味のある方はぜひお買い求めください!
こちらの詳しい宣伝はまた後日...。
追記: 書きました。