27

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

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

4

8 回答 8

34

您可以通过使用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"
   }
  }
 ]
}
于 2015-09-08T16:54:55.897 回答
12

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

可以要求增加配额,但这似乎是在强制解决问题。

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

于 2019-04-02T17:18:44.023 回答
9

我知道这很旧,但我自己用 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!';

}
于 2016-07-29T03:02:22.583 回答
4

伙计们,我找到了更好的方法来做到这一点。是的,它需要您向 YouTube 页面发出 GET 请求并解析 HTML,它适用于较新的版本 + 经同意 + 可与验证码一起使用(最有可能,90%)

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

例如,

<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 非常重要,并且重定向不再适用GETHEAD请求,我建议使用我的方法。

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

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 && npm i node-html-parser node-fetch在工作目录中创建项目并安装依赖项

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

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

于 2021-11-18T20:33:38.467 回答
3

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

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

于 2021-04-23T20:02:36.963 回答
0

如果你将streamlink指向一个https://www.youtube.com/channel/CHANNEL_ID/live链接,它会告诉你它是否是实时的

$ 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)
$ 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
于 2021-02-16T16:43:28.090 回答
0

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

#info-text 然后搜索字符串Started streaming或其中watching now的内容。

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

于 2021-04-08T09:16:32.343 回答
0

我发现的最简单的方法是抓取网站。这可以通过找到这个来完成: <link rel="canonical" href="linkToActualYTLiveVideoPage">Vitya 的回答

这是我使用的简单 Python 代码bs4

import requests
from bs4 import BeautifulSoup

def is_liveYT():
    channel_url = "https://www.youtube.com/c/LofiGirl/live"
    page = requests.get(channel_url, cookies={'CONSENT': 'YES+42'})
    soup = BeautifulSoup(page.content, "html.parser")
    live = soup.find("link", {"rel": "canonical"})
    if live: 
        print("Streaming")
    else:
        print("Not Streaming")

if __name__ == "__main__":
    is_liveYT()

老实说,这很奇怪,YouTube 没有简单的方法通过 API 执行此操作,尽管这可能更容易。

于 2022-02-23T17:41:12.843 回答