プログラミング

SHOWROOMのガチイベをGoogleスプレッドシートでグラフにしよう

投稿日:

まえがき

SHOWROOMのガチイベ、と言えば配信者が獲得ポイント数でランキングされ、最終的にファンの札束で殴り合って勝者を競う札束タワーバトルなわけです。
数日~数週間にわたって配信者同士でランキング順位を競うので、自陣営の勝利のためには周囲とのポイント差を常時確認し続けるのは必要不可欠です。
しかしSHOWROOMのオフィシャルな機能では情報が少なく、あまり戦略的な行動が取りづらい。
そこで、イベントのポイント推移を時間軸でグラフ化するのが大事になってきます。

つまり、こう。

既にある程度の大型イベントを自動収集するサイトを運営されている方がいて、このサイトが捕捉しているイベントであればこのサイトを使わせて頂ければ良いんですが、ここに無いイベントは自力で取得するしかない。

ということでGoogleスプレッドシートとGoogle Apps Scriptsを使ってポイントを自動収集・グラフ化してしまおう、という記事です。

みほん

とにかく見本を公開します。これを基に好きにいじれる人は、自分のところにコピーして好きにいじってください。

だいじな注意事項

Google Apps Scriptの制限

ポイントを自動収集するためのスクリプトの実行時間に制限があります。
そのため、全てのルームを数分間隔で収集することはできません
上位数ルームのみを絞って実行するようにしましょう。

具体的に言うと、Google Apps Scriptで実行するスクリプトは実行時間が1日あたり合計1時間以内でないといけません。
そのため、1分間隔(1日1440回実行)で情報を収集する場合は1回あたり2.5秒で実行完了しないと、じきに時間オーバーになります。
5分間隔の場合は1回あたり12.5秒、30分間隔の場合は1回あたり75秒です。
実行時間は毎回確認できますが、ある程度余力を持った間隔で収集するようにしましょう。

SHOWROOMの仕様

基本的にガチイベのポイントは5分おきの更新です。
なので、収集間隔を5分より短くしてもあまり意味はありません。
また、このスクリプトは内部でSHOWROOMの非公開APIを利用していますが、なにぶん非公開APIなので仕様が変わる可能性や、SHOWROOMに怒られる可能性があります。怒られたら一緒にごめんなさいしましょうね。

てじゅん

見本が手元にあることを前提にして、見本を改造して好きなイベントに対応させましょう。

1.

自分のGoogleドライブにコピーして、名前を変えましょう

2.

「生データ」シートにいま入っている数値データを消しましょう

このあたりのデータは見本なので、消してしまいましょうね。

3.

「生データ」シートの1行目のルーム名を手入力しましょう。ルーム数に応じて横の列は好きに伸ばしたり削ったりしましょう。

あなたが見やすい名前ならなんだって良いです。(本当はここもAPIから自動取得できます。興味のあるひとは調べてみて下さい)

4.

おなじ名前を「最大値用」のシートにコピペしましょう。

5.

「最大値用」シートの2行目には関数計算が入れてあります。ルーム数に合わせて2行目の関数計算をコピーしましょう。

6.

ツールバーの「ツール」から「スクリプトエディタ」を開きましょう。

7.

スクリプトの名前を好きに変えましょう。

8.

スクリプトの5行目あたりにあるルームIDを、いまから収集対象のルームIDに変えていきます。このルームIDの順序と数は、さっきのスプレッドシートのB列にあるルームから順番にきっちり合わせて下さい

9.

ルームIDは、たとえばイベントページの「プロフィール」のボタンでアクセスしたページの、

URLの末尾にある6桁ぐらいの数字です。たまに5桁とか、4桁の人もいます。

10.

ルームIDを変え終わりました。

11.

試し打ちしてみましょう。
関数から「myFunction」を選択して、再生ボタンを押します。

12.

権限の許可を求められるので許可します。
途中でちょっと危なげなページが出ますが、腹をくくって許可してください。

いま動かそうとしているスクリプトが自作だから怒られています。
騙されているんじゃないの?って思う人は、自分で判断できないならここで諦めておくのもあなたのためです。

ちなみにこの許可を出すと、自分のアカウントあてにgoogleからメールが飛んできます。

13.

うまくうごけば、「生データ」シートの2行目に現時点のポイントが収集されます。ちなみに、イベント期間中以外は「-1」が記録されます。

うまく動かなかった人は、スクリプトが何かエラーを出していないか、「生データ」シートにゴミが残っていないか確かめてみてください。

14.

「折れ線グラフ」を調整しましょう。見本のデータ範囲にあわせられているので、データ範囲を調整します。
いちど元の範囲を消してしまって…

「生データ」シートのデータがある列を列全体で選択します。

15.

出ていないルームに関しては、「系列を追加」でたくさん増やしましょう。

16.

「横棒グラフ」も同じ要領でデータ範囲を合わせましょう。横棒グラフのデータは「最大値用」シートから取っています。
これでスプレッドシートの見た目は整いました。

17.

自動収集の設定をしましょう。
Google Apps Scriptに戻って、時計のマークをクリックします。

18.

「トリガーを追加」を選んで、「時間主導型」を選択し、好きな間隔を設定しましょう。

19.

実行の状況を見たいときは、左の「実行数」から確認できます。今回は11.299秒で実行できているのがわかります。
そのため、5分間隔で実行すると1日1時間上限がギリギリですね。

20.

かんせい!
あとは寝ておけば勝手に情報が収集されます。
ポイント推移を調べていないライバルとコーナーで差をつけよう!

スクリプト解説

ざっくり全文乗せてしまいます。

function myFunction() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('生データ');
  sheet.appendRow([new Date(),
                   getPoint('123456'),
                   getPoint('234567'),
                  ]);
  var lastrow = sheet.getLastRow();
  var timerng = sheet.getRange(lastrow, 1);
  timerng.setNumberFormat('MM/dd H:mm');
  var pointrng = sheet.getRange(lastrow, 2, 1, 8);
  pointrng.setNumberFormat('#,##0');
}

function getPoint(room_id) {
  var url = 'https://www.showroom-live.com/api/room/event_and_support?room_id=' + room_id;
  var res = UrlFetchApp.fetch(url);
  var json = JSON.parse(res.getContentText());
  if (json['event'] == null) {
    return -1;
  } else {
    return json['event']['ranking']['point'];
  }
}

軽くjavascriptが読めれば特に面白いことはないと思います。
getPoint関数がSHOWROOMのAPIからイベントポイントを取得してくるので、これをGoogle Apps Scriptのスプレッドシートを操作する関数で最終行に流し込んでいるだけです。
あとはグラフにしたときに書式が乱れないように書式設定しています。

SHOWROOMのAPIは非公開ですが、Qiitaで公開されていてもはや公然の秘密と化しているので非常に助かります。

-プログラミング

執筆者:

関連記事

no image

Unityでメッシュをさわるノウハウ

ヒマなので覚書。ウラを取っていない経験則なので話半分で読んでください。 あと、3Dの基本概念とUnity固有の話の区別が付いていないのでごめんなさい。 もくじ Meshクラスの基本 Unityでポリゴ …

no image

ロリポップでSQLite3を使うときはpythonでpysqlite3-binaryだ

このブログはロリポップで運用しています。 公式にSQLite3の使用も許可されていて、モジュール叩けば動くんですがいかんせんバージョンが低い。 確認するとバージョンが3.7.17。なかなかに古いです。 …

no image

Google Apps Script(GAS)で自宅サーバーの死活監視をする

前置き 自宅サーバー使ってますか? 最近もう流行らないかな、と思ったらRaspberry Piの流行で機器も電気代も安価に組めるようになったりして、地味に持っている人も多いんじゃないかな、と思ってます …

no image

SwitchBotの温湿度計、防水かどうかでBluetoothのデータの取り方違うぞ

SwitchBotは機器のAPIを公開していて、ユーザーの自作プログラムからBluetooth(BLE)越しにデータが取れたりします。 特に温湿度計のデータを取りたいというニーズは強くて、安価で安定し …

no image

UnityのCompute Shaderに線分と三角形の衝突判定をさせる

はじめてCompute Shader使ってみた。でもあまり性能は出ないのでただの失敗の記録です。 まず元のアルゴリズムはコレ。 線分と三角形の当たり判定 – 富士見研究所 で、これをまず三角形の表裏問 …