如何检查 YouTube 频道是不是正在直播

Posted

技术标签:

【中文标题】如何检查 YouTube 频道是不是正在直播【英文标题】:How to check if YouTube channel is streaming live如何检查 YouTube 频道是否正在直播 【发布时间】:2015-12-03 22:17:02 【问题描述】:

我找不到任何信息来检查 YouTube 频道是否正在流式传输。 使用 Twitch 您只需要频道名称,使用 API 您可以检查是否有直播。

我不想使用 OAuth,通常一个公共 API 密钥就足够了。就像查看某个频道的视频一样,我想知道该频道是否正在播放。

【问题讨论】:

相关:***.com/questions/44615704/… 【参考方案1】:

您可以通过使用search.list 并指定频道ID、将类型设置为video 并将eventType 设置为live 来完成此操作。

例如,当我搜索:

https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UCXswCcAMb5bvEUIDEzXFGYg&type=video&eventType=live&key=[API_KEY]

我得到了以下信息:


 "kind": "youtube#searchListResponse",
 "etag": "\"sGDdEsjSJ_SnACpEvVQ6MtTzkrI/gE5P_aKHWIIc6YSpRcOE57lf9oE\"",
 "pageInfo": 
  "totalResults": 1,
  "resultsPerPage": 5
 ,
 "items": [
  
   "kind": "youtube#searchResult",
   "etag": "\"sGDdEsjSJ_SnACpEvVQ6MtTzkrI/H-6Tm7-JewZC0-CW4ALwOiq9wjs\"",
   "id": 
    "kind": "youtube#video",
    "videoId": "W4HL6h-ZSws"
   ,
   "snippet": 
    "publishedAt": "2015-09-08T11:46:23.000Z",
    "channelId": "UCXswCcAMb5bvEUIDEzXFGYg",
    "title": "Borussia Dortmund vs St. Pauli 1-0 Live Stream",
    "description": "Borussia Dortmund vs St. Pauli Live Stream Friendly Match.",
    "thumbnails": 
     "default": 
      "url": "https://i.ytimg.com/vi/W4HL6h-ZSws/default.jpg"
     ,
     "medium": 
      "url": "https://i.ytimg.com/vi/W4HL6h-ZSws/mqdefault.jpg"
     ,
     "high": 
      "url": "https://i.ytimg.com/vi/W4HL6h-ZSws/hqdefault.jpg"
     
    ,
    "channelTitle": "",
    "liveBroadcastContent": "live"
   
  
 ]

【讨论】:

但是我们可以知道视频流的 id 吗? 查看items资源->id->videoId可以找到ID。在我上面发布的示例中,视频流的 ID 是W4HL6h-ZSws 但是这个API实际上是在我们开始直播几分钟后才响应的,当直播刚开始时它没有显示任何数据。 @not_a_bot 你能推荐一个替代方案吗? 这还会返回“直播”但实际上并未流式传输的视频,有没有办法将这些人过滤掉? 对此的任何更新,最后两个 cmets 对我来说仍然是问题。【参考方案2】:

虽然使用搜索方法 (https://www.googleapis.com/youtube/v3/search) 非常昂贵。默认情况下,它花费 100 个配额单位 (https://developers.google.com/youtube/v3/determine_quota_cost)。 这意味着您每天只能收到 100 个请求,这很糟糕。

可以请求增加配额,但这似乎是强行解决问题。

真的没有其他更简单的方法了吗?

【讨论】:

欢迎来到 SO。这篇文章并没有真正回答这个问题。当您获得更多声誉时,您将能够发布此类材料作为 cmets... 这正是我现在在 2019 年的战斗......很难想象 youtube 不提供廉价的 API 请求只是为了查看频道是否正在直播......使用 liveBroadcast API 不会帮助,因为它对我来说并不全面,并且无法指定频道... 可以帮忙:***.com/questions/56385532/…【参考方案3】:

我知道这是旧的,但我自己用 php 解决了。

$API_KEY = 'your api3 key';
$ChannelID = 'the users channel id';

$channelInfo = 'https://www.googleapis.com/youtube/v3/search?part=snippet&channelId='.$ChannelID.'&type=video&eventType=live&key='.$API_KEY;

$extractInfo = file_get_contents($channelInfo);
$extractInfo = str_replace(',]',"]",$extractInfo);
$showInfo = json_decode($extractInfo, true);

if($showInfo['pageInfo']['totalResults'] === 0)

echo 'Users channel is Offline';

else

echo 'Users channel is LIVE!';


【讨论】:

有一个更完整的官方代码示例用于列出直播流:github.com/youtube/api-samples/blob/master/php/list_streams.php【参考方案4】:

我还在为 API 限制而苦苦挣扎。我发现的最可靠和最便宜的方法就是向https://www.youtube.com/channel/CHANNEL_ID/live 发送HEAD 请求。如果频道是实时的,那么它将自动加载流。如果没有,那么它将加载频道视频提要。您可以简单地检查Content-Length 标头大小来确定哪个。如果直播,则大小几乎是不直播时的 2 倍。

根据您所在的地区,您可能需要接受 cookie 同意页面。只需通过cookies= "CONSENT": "YES+cb.20210420-15-p1.en-GB+FX+634" 发送您的请求即可。

【讨论】:

【参考方案5】:

伙计们,我找到了更好的方法来做到这一点。是的,它需要您向 youtube 页面发出 GET 请求并解析 html,但它可以与较新的版本一起使用 + 在同意的情况下使用 + 与验证码一起使用(很可能,90%)

您需要做的就是向https://youtube.com/channel/[CHANNELID]/live 发出请求并检查<link rel="canonical" /> 标签的href 属性。

例如,

<link rel="canonical" href="https://www.youtube.com/channel/UC4cueEAH9Oq94E1ynBiVJhw">

表示没有直播,而

<link rel="canonical" href="https://www.youtube.com/watch?v=SR9w_ofpqkU">

表示有流,你甚至可以通过 videoid 获取它的数据。

由于规范 URL 对 seo 非常重要,并且重定向在 GET 和 HEAD 请求中都不起作用,我建议您使用我的方法。

这也是我使用的简单脚本:

import  parse  from 'node-html-parser'
import fetch from 'node-fetch'

const channelID = process.argv[2] // process.argv is array of arguments passed in console

const response = await fetch(`https://youtube.com/channel/$channelID/live`)
const text = await response.text()
const html = parse(text)
const canonicalURLTag = html.querySelector('link[rel=canonical]')
const canonicalURL = canonicalURLTag.getAttribute('href')
const isStreaming = canonicalURL.includes('/watch?v=')

console.log(isStreaming)

然后运行npm init -y &amp;&amp; npm i node-html-parser node-fetch在工作目录中创建项目并安装依赖项

然后运行node isStreaming.js UC4cueEAH9Oq94E1ynBiVJhw,它将打印真/假(每次执行400-600毫秒)

它确实需要您依赖 node-html-parser 和 node-fetch,但您可以使用内置的 http 库(这很糟糕)发出请求并将其重写为使用正则表达式(不要使用正则表达式解析 html )

【讨论】:

【参考方案6】:

如果您将streamlink 指向https://www.youtube.com/channel/CHANNEL_ID/live 链接,它会告诉您它是否处于活动状态

例如lofi beats 通常是直播的,
$ streamlink "https://www.youtube.com/channel/UCSJ4gkVC6NrvII8umztf0Ow/live"
[cli][info] Found matching plugin youtube for URL https://www.youtube.com/channel/UCSJ4gkVC6NrvII8umztf0Ow/live
Available streams: 144p (worst), 240p, 360p, 480p, 720p, 1080p (best)
而MKBHD 不是
$ streamlink "https://www.youtube.com/c/mkbhd/live"          
[cli][info] Found matching plugin youtube for URL https://www.youtube.com/c/mkbhd/live
error: Could not find a video on this page

【讨论】:

【参考方案7】:

考虑到搜索操作的成本,我发现 youtube API 非常严格。使用 aiohttp 和 beautifulsoup 进行 Web 抓取不是一种选择,因为更好的指标需要 javascript 支持。因此我转向。我找了css选择器

#info-text 然后搜索字符串Started streaming 或其中包含watching now

您也可以使用 flask 在 heroku 上运行一个小型 API。

【讨论】:

以上是关于如何检查 YouTube 频道是不是正在直播的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 的 Youtube API V3 中按频道 ID 获取 Youtube 直播?

使用 YouTube API,如何从频道名称中获取直播的视频 ID?

如何获得YouTube频道的you-tube订阅者订阅列表?

在YouTube频道上线时运行脚本

当频道开始直播时,从Youtube API获取通知?

YouTube API。检查用户是不是已订阅