如何从 youtube api 数据 v3 获取 YouTube Shorts

问题描述 投票:0回答:7

我想要一种从 YouTube API 获取特定频道的 YouTube 短片的方法。我到处都找遍了,但什么也没找到。

目前我可以通过此端点获取所有频道视频的播放列表ID:

request = youtube.channels().list(
    part="contentDetails",
    id=id
)

我也尝试过这些参数:

request = youtube.channels().list(
    part="snippet,contentDetails,statistics,brandingSettings",
    id=id
)

有没有办法从 YouTube API 或任何其他来源(如果可用)的特定频道获取 YouTube 短片。

youtube-api youtube-data-api
7个回答
21
投票

无需使用 API 即可检测 YouTube 视频 ID 是否为 Short 的一种方法是尝试向

/shorts/
版本的 URL 发出 HEAD HTTP 请求,看看它是否会重定向您。

https://www.youtube.com/shorts/hKwrn5-7FjQ 是一个短视频,如果您访问该网址,您将获得 HTTP 状态代码 200,并且该网址不会更改。

https://www.youtube.com/watch?v=B-s71n0dHUk 不是短片,如果您访问 https://www.youtube.com/shorts/B-s71n0dHUk,您会获得303 重定向回原始 URL。

请记住,此行为可能会发生变化,但从 2022 年 5 月开始有效。


10
投票

YouTube Data API v3 似乎再次没有提供基本功能。

检查给定视频是否是短片:

我建议您使用我的开源YouTube操作API。事实上,通过请求包含 item["short"]["available"] 布尔值的 JSON 文档

https://yt.lemnoslife.com/videos?part=short&id=VIDEO_ID
,你的问题就解决了。

短 ID 示例:

ydPkyvWtmg4

列出频道的短片:

我建议您使用我的开源YouTube操作API。事实上,通过请求 JSON 文档https://yt.lemnoslife.com/channels?part=shorts&id=CHANNEL_ID。条目

item["shorts"]
包含您要查找的数据。请注意,分页的工作原理与 YouTube Data API v3 一样。

通道结果示例

UC5O114-PQNYkurlTg6hekZw
:

{
    "kind": "youtube#channelListResponse",
    "etag": "NotImplemented",
    "items": [
        {
            "kind": "youtube#channel",
            "etag": "NotImplemented",
            "id": "UC5O114-PQNYkurlTg6hekZw",
            "shorts": [
                {
                    "videoId": "fP8nKVauFwc",
                    "title": "India: United Nations Counter Terrorism Committee Watch LIVE #shorts",
                    "thumbnails": [
                        {
                            "url": "https:\/\/i.ytimg.com\/vi\/fP8nKVauFwc\/hq720_2.jpg?sqp=-oaymwEYCNAFENAFSFryq4qpAwoIARUAAIhC0AEB&rs=AOn4CLCgJEYgv_msT5pkfWeEEN3VBt4wjg",
                            "width": 720,
                            "height": 720
                        }
                    ],
                    "viewCount": 3700
                },
                ...
            ],
            "nextPageToken": "4qmFsgLlARIYVUM1TzExNC1QUU5Za3VybFRnNmhla1p3GsgBOGdhU0FScVBBVktNQVFxSEFRcGZRME00VVVGU2IyWnZaMWxqUTJob1ZsRjZWbEJOVkVVd1RGWkNVbFJzYkhKa1dFcHpWa2RqTW1GSFZuSlhibU5SUVZOSlVrTm5PSGhQYWtVeVRtcGplVTE2VlRST2FrVXdUbXBCY1VSUmIweFhWRUl5VGtab1dGSllSbGRNVmtVU0pEWXpOakJoTkRVNUxUQXdNREF0TWpKaE15MDRObUV6TFdRMFpqVTBOMlZqWVRSbFl4Z0I=,CgtuNjFmZlJlR0QxcyiVgICbBg=="
        }
    ]
}

4
投票

您可以使用

Youtube 分析和报告 API 中名为 
'creatorContentType' 的新维度。

    // You can get IDs from PlaylistItems or Search API
    const IDs = ["videoID1", "videoID2", "videoID3"];

    // Get the analytics data of selected videos based on their IDs
    const { data: analyticsData } = await youtubeAnalytics.reports.query({
      ids: "channel==MINE",
      startDate: "2019-01-01",
      // Today's date
      endDate: new Date().toISOString().split("T")[0],
      metrics: "views",
      dimensions: "video,creatorContentType",
      filters: `video==${IDs.join(",")}`,
      access_token,
    });

它基本上返回下面列出的值:

价值 描述
直播_流 观看的内容是 YouTube 直播。
短裤 观看的内容是 YouTube 短片。
故事 查看的内容是 YouTube 故事。
视频点播 观看的内容是不属于其他维度值之一的 YouTube 视频。
未指定 所查看内容的内容类型未知。

备注:

  1. 不要忘记它仅返回 2019 年 1 月 1 日之后上传的 视频的值
  2. 不要忘记添加分析范围启用分析和报告API

1
投票

下面是发送 HEAD HTTP 请求的示例 python 代码。

import requests

def is_short(vid):
    url = 'https://www.youtube.com/shorts/' + vid
    ret = requests.head(url)
    # whether 303 or other values, it's not short
    return ret.status_code == 200

1
投票

查看可以从 API 中检索到的播放列表 ID

contentDetails.relatedPlaylists.uploads
,我们可以看到频道 ID 开头的“UC”被替换为“UU”。

可以使用相同的格式,将频道ID开头的“UC”替换为“UUSH”,以获得仅包含短视频的播放列表。

例如,频道 ID “UCutJqz56653xV2wwSvut_hQ” 将生成播放列表 ID “UUSHutJqz56653xV2wwSvut_hQ”

此外,还存在其他前缀:

前缀 内容
UULF 视频
UULP 热门视频
超低电压 直播
UUMF 会员专享视频
UUMO 会员专享内容(视频、短视频和直播)
UMS 会员专属短视频
UUMV 会员专享直播
UUPS 热门短视频
UUPV 热门直播
呜呜 短视频

不过,这个模式是我通过获取从“UUAA”到“UUZZ”的所有播放列表发现的,YouTube并未正式公布。


0
投票

我不知道为什么,但我没有收到状态代码 303,无论它是否与 axios 短路。所以这是检查是否短路的另一种方法。

const isShort = async (videoId) => {
    const url = "https://www.youtube.com/shorts/" + videoId
    const res = await axios.head(url)
    console.log(res.request.res.responseUrl)
    // if it's a short it ends with "/shorts/videoId"
    // if it's NOT a short it ends "/watch?=videoId"
}

也许 axios 自动重定向?


0
投票

要使用 YouTube 数据 API 获取特定频道的短视频,您可以使用以下 JavaScript 代码片段:

您可以将“type”参数设置为“short”以专门获取短视频或视频以获取所有视频。

export const getShortVideos = async channelId => {
  try {
    const response = await axios.get(`${BASE_URL}/search`, {
      params: {
        part: 'id',
        channelId: channelId,
        maxResults: 20, // You can adjust this number as needed
        type: 'short',
        key: YOUTUBE_API_KEY,
        order: 'date',
      },
    });

    const videos = response.data.items.map(item => {
      return item.id.videoId;
    });

    return videos;
  } catch (error) {
    console.error('Error fetching data:', JSON.stringify(error, null, 2));
    return [];
  }
};

这将返回短视频的 ID,然后您可以使用这些 ID 获取短视频的特定信息,或从 ID 创建链接以将其显示在您的应用程序或网页上。例如:

https://www.youtube.com/shorts/${videoId}

© www.soinside.com 2019 - 2024. All rights reserved.