我目前正在用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;
}
}
答案 0 :(得分:3)
看起来它是Twitch API的预期行为。 他们肯定更专注于将他们的马力推向流媒体,而不是通过API立即提供数据。
虽然可能存在这样的限制,但如果时间关键并且您不想等待3-5分钟就已经发生的事情,您可以尝试报废页面。 一个想法是每5秒左右轮询页面,然后在HTML文档中查询区分离线和在线渠道的特征。
例如,我尝试在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