SHOWROOMのガチイベでは配信者が獲得ポイント数でランキングされ、ファンはファンでおのれの承認欲求を満たすために課金する、いわば札束の殴り合いです(ネタ記事なのでめちゃくちゃ書いています)。
ライバルの状態を監視したい
この札束タワーバトルに勝つためにはライバルの状態を確認し続ける作業も必要です。鳩でもわかるC#管理人も応援している配信者に対してライバルの状態をチェックして報告するという作業を繰り返していました。
SHOWROOMのAPIを使ってみる
でも、こういう作業で自動化できないのか?SHOWROOMはAPIを公開していないのかと調べてみたら一応使えそうなものが公開されていました。ただ非公式なので突然仕様変更されて使えなくなっても文句は言えません。
ここでは配信者がイベントで獲得しているポイントと貢献度ランキングを取得できるアプリをつくります。
指定したルームが参加中のイベントに関する情報を取得できるAPIがあります。これはイベントが終了してしまうと情報を取得することができなくなってしまいます。
自分が応援しているルームが現在イベントに参加してどのような状態なのかを知るためにはこのAPIが使えそうです。
使い方と取得できるものは?
URIは以下のとおり。
1 2 |
https://www.showroom-live.com/api/room/event_and_support?room_id=xxxxxx ただしxxxxxxはルームIDである |
このAPIを使えばこのルームのイベントに関する多くの情報を取得できますが、ここでは配信者がポイントをどれだけ獲得できているか、応援している人のなかに高額課金をしてでも応援している人がどれくらいいるかといった情報を取得します。
URIにアクセスするとjsonファイルを取得することができますが、ここではそのなかでも今回のアプリケーション作成に必要な部分だけを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
event ├ ranking │ └ point │ └ quest └ support └ support_users(配列) ├ 0 │├ order │├ name │├ point │└ user_id ├ 1 │├ order │├ name │├ point │└ user_id |
取得したJSON形式の文字列から必要な情報を抜き出す
C#で必要なデータを抜き出すのであれば、まずNugetでNewtonsoft.Jsonをインストールします。そのあと以下のようにすれば配信者が獲得しているポイントと順位、貢献者ランキングを取得することができます。APIから取得したJSON形式の文字列をC#のオブジェクトに完全に変換するのではなく一部だけ抜き取って使うのでdynamic型を使っています。またJSON形式の文字列のなかにはeventという文字列がありますが、このままではC#の予約語と衝突してしまうので、別の文字列に置換しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using Newtonsoft.Json; public class User { public int Order = 0; public string Name = ""; public int Point = 0; } public partial class Form1 : Form { System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); /// <summary> /// 配信者が獲得しているポイントと順位、貢献者ランキングを取得する /// </summary> /// <param name="id">ルームID</param> /// <param name="point">配信者が獲得しているポイント</param> /// <param name="rank">配信者の順位</param> /// <returns>貢献者と貢献度のリスト</returns> List<User> GetResult(int id, ref int point, ref int rank) { string str = client.GetStringAsync( "https://www.showroom-live.com/api/room/event_and_support?room_id=" + id).Result; List<User> list = new List<User>(); if (str.IndexOf("\"event\"") == -1) return list; str = str.Replace("\"event\"", "\"event1\""); dynamic obj = JsonConvert.DeserializeObject<dynamic>(str); dynamic event1 = obj.event1; if (event1 == null) return list; point = obj.event1.ranking.point; rank = obj.event1.ranking.rank; dynamic users = obj.event1.quest.support.support_users; int index = 0; while (true) { try { // 例外が発生するまで取得し続ける dynamic user = users[index]; index++; list.Add(new User() { Order = user.order, Name = user.name, Point = user.point, }); } catch { break; } } return list; } } |
あとはこのメソッドに取得したいルームIDを渡して結果を文字列として取得します。ここではタブ区切りで文字列を取得してRichTextBoxに表示させています。これをコピーしてExcelに貼り付ければ獲得ポイント、順位、貢献者の名前とポイントの表が完成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { int id = 123456; // 取得したいルームID int point = 0; int rank = 0; List <User> users = GetResult(id, ref point, ref rank); if (users.Count == 0) { MessageBox.Show("取得できない"); return; } StringBuilder sb = new StringBuilder(); foreach (User user in users) sb.Append($"{user.Order}\t{user.Name}\t{user.Point:#,0}\n"); richTextBox1.Text = $"{rank}位\t{str}\t{point:#,0}\n\n" + sb.ToString(); } } |