Twitch API 集成到 Discord Bot - 更有效的方式?
Posted
技术标签:
【中文标题】Twitch API 集成到 Discord Bot - 更有效的方式?【英文标题】:Twitch API Integration into Discord Bot - More efficient way? 【发布时间】:2017-09-26 22:21:27 【问题描述】:我目前正在用 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】:看起来这是 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 分钟来更新。
只需在 .NET 中复制上述查询即可。
您也可以混合使用两种方法,如果您看到有人开始流式传输,只需禁用页面抓取并切换到仅 API 调用以检查您是否仍然是最新的。
用于报废的有用工具:
要解析 HTML 文档,请使用 AngleSharp 之类的解析器在 .NET 中执行此操作: https://github.com/AngleSharp/AngleSharp
【讨论】:
以上是关于Twitch API 集成到 Discord Bot - 更有效的方式?的主要内容,如果未能解决你的问题,请参考以下文章
在同一应用程序中运行 Flask 和 Discord 机器人