将Twitch API集成到Discord Bot中 - 更有效的方法?

时间:2017-04-28 17:59:44

标签: c# json twitch discord discord.net

我目前正在用C#写一个Discord Bot。我已完成大部分机器人但是对于下一次更新,我想补充检查Streamer是否已经过去的能力。目前,我正在轮询Twitch API并拉出它拥有的JSON文件,并检查JSON流对象是否为空。但是,在流媒体上线之后需要3-5分钟,然后终于看到Stream不是Null,即使我每隔5秒轮询一次JSON。无论如何更有效地做到这一点?我的代码如下:

       private const string Url = "https://api.twitch.tv/kraken/streams/streamer";
        var request = (HttpWebRequest)WebRequest.Create(Url);

        request.Method = "Get";
        request.Timeout = 12000;
        request.ContentType = "application/vnd.twitchtv.v5+json";
        request.Headers.Add("Client-ID", "ID");

        using (var s = request.GetResponse().GetResponseStream())
        {
            using (var sr = new System.IO.StreamReader(s))
            {

                var jsonObject = JObject.Parse(sr.ReadToEnd());
                var jsonStream = jsonObject["stream"];

                // twitch channel is online if stream is not null.
                LastTwitchStatus = jsonStream.Type != JTokenType.Null;
            }
        }

1 个答案:

答案 0 :(得分:3)

看起来它是Twitch API的预期行为。 他们肯定更专注于将他们的马力推向流媒体,而不是通过API立即提供数据。

虽然可能存在这样的限制,但如果时间关键并且您不想等待3-5分钟就已经发生的事情,您可以尝试报废页面。 一个想法是每5秒左右轮询页面,然后在HTML文档中查询区分离线和在线渠道的特征。

在JavaScript中进行报废的想法(仅在.NET中复制):

例如,我尝试在JavaScript中查询用户页面(https://www.twitch.tv/ 用户名):

$(".recent-past-broadcast").length > 0

并且对于没有广播的用户产生true,而对于广播用户,它产生false。问题可能出在没有最近广播历史的用户身上。

您可以尝试查看视频页面(https://www.twitch.tv/ 用户名 / videos / all),了解其实时指标:

$(".cn-livestatus__circle").length > 0

对于流式用户,它将产生true,对于不流式传输用户,将产生false。(即使他/她在线)。

当然,与仅仅进行轮询相比,这是最有效的方式并且需要大量下载但是...仍然看起来比每5秒询问API并且仍然将实际状态延迟3-5分钟更新。 / p>

只需在.NET中复制上面的查询,你就在那里。

您还可以混合使用两种方法,如果您发现有人开始流式传输,只需禁用网页报废并仅切换到API调用,以检查您是否仍处于最新状态。

用于报废的有用工具:

对于解析HTML文档,使用 AngleSharp 等解析器在.NET中执行此操作: https://github.com/AngleSharp/AngleSharp