スクフェスのライブスコアを取得する “schfeslog” を作った話
執筆日: 2016年12月22日
最終更新日: 2016年12月22日
この記事は最終更新日から半年以上が経過しており、情報が古い可能性があります。
この記事はラブライブ! Advent Calendar 201622日目の記事です。
各タスクに忙殺されて次々と締切をオーバーしてしまっているhideo54です。
本来この記事はElectron Advent Calendar 201622日目の記事とセットで別の自作ソフト(Electron製)の紹介をするつもりだったのですが、かなり間に合わなさそうなのと、名前にしかラブライブ!要素がなくて怒られそうなのとで、結局こちらのラブライブ! Advent Calendarの方ではまた別の自作ソフトの紹介をすることにしました。
というわけで、本題。タイトル通り、スクフェスでのライブプレイスコアを取得するプログラム“schfeslog”を作りました。(ちなみにタイトルは57577です)
と言っても最低限の機能しかまだ実装できておらず、この不十分な進捗のまま公開するべきかどうか迷ったのですが、前述のような経緯があったため、この機に宣伝(と協力のお願い)を兼ねて、現行版を公開することにしました。現状全てNode.jsで書いています。
GitHub: https://github.com/hideo54/schfeslog
現状何ができるの?
こんな感じで勝手にプレイログを取得してTwitterにつぶやかせることができます。
使い方
1 | git clone https://github.com/hideo54/schfeslog |
上記3行を実行したら、settings.jsonを適宜編集する必要があります。
デフォルトではlog.txtにログが保存されていくのみとなっています。Twitterへの投稿機能を有効化する場合、twitter.onの値をtrueに設定し、authの各項目を適宜設定します。
また、デフォルトではポート25252で実行されるようになっていますが、変えたければportの値を変更します。
編集が終わったら後は、main.jsをNode.jsで走らせるだけです。
常時起動させる必要がありますので、適宜foreverとかを使うと良いと思います。
起動させたら、スクフェスをする端末の方で、main.jsが走っているサーバーをHTTPプロキシに設定すればOK。
後はライブをプレイする度勝手に記録されます。
簡単に技術的な話をする
スクフェスはライブの際、プレイ中はクライアントでのみゲームを実行し、ライブ終了後にゲームのプレイ結果をサーバーに送信する、という仕組みを取っています。その際サーバーに送信されるデータ(TLS暗号化されていない)は以下のようなものです:
1 | {"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の声を識別する 」という記事も載るので、興味のある方はぜひお買い求めください!
こちらの詳しい宣伝はまた後日…。
追記: 書きました。