youtube - 如何在不使用搜索的情况下查找 youtube 频道当前是否正在直播?
问题描述
我正在开发一个网站来加载多个 youtube 频道直播。起初我试图想办法在不使用 youtube 的 api 的情况下做到这一点,但我决定放弃。
要查找频道是否正在直播并获取我一直在使用的直播链接:
https://www.googleapis.com/youtube/v3/search?part=snippet&channelId={CHANNEL_ID}&eventType=live&maxResults=10&type=video&key={API_KEY}
但是,由于最小配额为 10000,每次搜索价值 100,我只能进行大约 100 次搜索,然后才超出配额限制,这根本没有帮助。我最终在大约 10 分钟内超过了配额限制。:(
有谁知道使用尽可能少的配额点来确定频道当前是否正在直播以及直播链接是什么的更好方法?
我想每 3 分钟为每个用户重新加载 youtube 数据,将其保存到数据库中,并使用我自己的 api 显示信息以节省服务器资源和配额点。
希望有人能很好地解决这个问题!
如果不能对链接做任何事情,只是确定用户是否在每次使用 100 个配额点的情况下是活的,这将是一个很大的帮助。
解决方案
由于该问题仅指定不应使用 Search API 配额来确定频道是否正在流式传输,因此我想我会分享一种解决方法。它可能需要比简单的 API 调用更多的工作,但它将 API 配额的使用减少到几乎没有:
我使用了一个简单的 PerlGET
请求来检索 Youtube 频道的主页。在直播的频道页面的 HTML 中可以找到几个独特的元素:
现场观众标签的数量,例如
<li>753 watching</li>
。徽章LIVE NOW
标签:<span class="yt-badge yt-badge-live" >Live now</span>
.
要确定频道当前是否正在直播,需要进行简单匹配以查看唯一的 HTML 标记是否包含在 GET 请求结果中。类似的东西:if ($get_results =~ /$unique_html/)
(Perl)。然后,可以只对实际正在流式传输的频道 ID 进行 API 调用,以获取流的视频 ID。
这样做的好处是您已经知道频道正在流式传输,而不是使用数千个配额点来查找。我的测试脚本通过查看以下 HTML 代码成功识别频道是否正在流式传输:(<span class="yt-badge yt-badge-live" >
请注意来自 Youtube 的代码中奇怪的额外空格)。
我不知道 OP 使用的是什么语言,或者我会帮助处理该语言的基本 GET 请求。我使用 Perl,并包含浏览器标头、用户代理和 cookie,看起来就像正常的计算机访问。
Youtube 的robots.txt似乎并没有禁止抓取频道的主页,只禁止抓取频道的社区页面。
让我知道您对这种方法的优缺点的看法,如果发现缺陷,请评论可能改进的地方,而不是不喜欢。谢谢,快乐的编码!
2020 更新似乎
已yt-badge-live
被弃用,它不再可靠地显示频道是否正在流式传输。相反,我现在检查这个字符串的 HTML:
{"text":" watching"}
如果我得到匹配,则意味着页面正在流式传输。(非流媒体频道不包含此字符串。)再次注意奇怪的额外空白。因为我使用的是 Perl,所以我也转义了所有引号。
推荐阅读
- azure-iot-hub - Azure IoT 中心设备标识要求
- c# - 从另一个类向 List 添加值抛出 NullReferenceException
- flutter - TextField 保留旧值
- python - 如何克服 Python Requests 包产生的 412 状态?
- linear-programming - 在线性规划中使用索引进行优化
- file - 如何在 Vaadin Flow 上打开生成的文件?
- python - 如何在python中以'yyyy-mm-dd'格式添加一天?
- python - 使用 python cli 工具更改当前终端的目录
- google-sheets - 如何获取原始矩阵的每个单元格的行号矩阵?
- javascript - 在没有 push() 的情况下将模式添加到数组