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

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

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

というわけで、本題。タイトル通り、スクフェスでのライブプレイスコアを取得するプログラム”schfeslog”を作りました。(ちなみにタイトルは57577です)
と言っても最低限の機能しかまだ実装できておらず、この不十分な進捗のまま公開するべきかどうか迷ったのですが、前述のような経緯があったため、この機に宣伝(と協力のお願い)を兼ねて、現行版を公開することにしました。現状全て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の声を識別する」という記事も載るので、興味のある方はぜひお買い求めください!
こちらの詳しい宣伝はまた後日…。


スクフェスのライブスコアを取得する”schfeslog”を作った話” に2件のコメントがあります

    • wedata、初めて知りました。ありがとうございます!
      ただ本件の場合、GitHub一箇所で管理できた方が便利かと思いましたので、それほど複雑なデータでもないことから、不都合が生じるまでは引き続きJSONファイルで管理しようと思いますm(_ _)m

コメントする