我目前正在用C#写一个不和谐的机器人。我已经完成了大部分的机器人,但在这下一个更新,我想增加的能力,以检查是否流线已运行。目前,我正在轮询Twitch,并提取它拥有的JSON文件,并检查JSON对象是否为Null。但这需要3-5分钟后的彩带才能运行,直到它最终看到流不是空,即使我每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;
}
}发布于 2017-04-28 19:30:01
看起来这是Twitch的预期行为。他们肯定更专注于推动他们的马力流,而不是直接通过API提供数据。
虽然可能存在这样的限制,但是如果时间安排很关键,并且不想等待3到5分钟已经发生的事情,您可以尝试取消页面。一种方法是每5s左右轮询页面,然后查询HTML文档以获得区分脱机和在线通道的特性。
在JavaScript中废弃的想法(只需在.NET中复制):
例如,我尝试用以下方法查询(https://www.twitch.tv/username)中的JavaScript用户页面:
$(".recent-past-broadcast").length > 0对于没有广播的用户,它会产生true,而对于广播用户,它会产生false。不过,问题可能在于没有最近广播历史的用户。
您也可以尝试查看视频页面(https://www.twitch.tv/username/videos/all)中的活动指示符,例如:
$(".cn-livestatus__circle").length > 0它将产生流用户的true和不流的false (即使他/她在线)。
当然,这是最不有效的方法,需要大量下载,而不是仅仅轮询,但是.尽管如此,它似乎比每5s询问API更及时,并且仍然使实际状态延迟3-5分钟。
只需在.NET中复制像上面这样的查询就可以了。
您也可以混合两种方法,如果您看到有人开始流,只需禁用页报废和交换到仅API调用,以检查您是否还在最新。
用于报废的有用工具:
要解析HTML文档,可以使用像AngleSharp这样的解析器在.NET:https://github.com/AngleSharp/AngleSharp中完成这一任务。
https://stackoverflow.com/questions/43686290
复制相似问题