调用频道视频时减少 YouTube API 的配额?

Reduce quota from YouTube API when calling channel videos?

我一直在使用 YouTube 数据 API,我只想调用 API 并将其用于 return 频道的最新视频。目前我一直在这样做:

https://www.googleapis.com/youtube/v3/search?key=[key]&channelId=[channelId]&part=id&order=date&maxResults=1,

但这仍然使用了很多单位。

有没有什么办法不用那么多单位就可以得到我需要的数据?

以下花费2个单位

baseurl = https://www.googleapis.com/youtube/v3

获取频道"Upload" ID

{baseurl}/channels?part=contentDetails&id={channel Id}&key={api key}

然后使用 playlistItems

的上传 ID
{baseurl}/v3/playlistItems?playlistId={upload id}&part=snippet&maxResults={max numbers}&key={api key}

对于你的第一个问题:

I want to just call the API and for it to return a channel's latest video.

答案是肯定的。您必须按以下步骤进行:

第一步:获取您感兴趣的频道对应的上传播放列表ID:

对于给定的频道——由其 ID CHANNEL_ID 标识——调用 Channels.list API endpoint, queried with its request parameter id 设置为 CHANNEL_ID:

https://www.googleapis.com/youtube/v3/channels?part=contentDetails&fields=items/contentDetails/relatedPlaylists/uploads&id=CHANNEL_ID&key=....

所需的上传播放列表 ID 将作为端点返回的 属性 contentDetails.relatedPlaylists.uploads of the Channels resource JSON 对象的值找到。

通常,一个频道ID和它对应的上传播放列表ID通过s/^UC([0-9a-zA-Z_-]{22})$/UU/关联。

请注意,上面我使用了 fields 请求参数来仅从 API 获取实际需要的信息。

另请注意,您只需按上述方式调用 Channels.list 一次,即可根据需要多次使用获得的上传播放列表 ID。

第二步:获取您感兴趣的频道最新上传的视频:

为此,您需要依赖未记录的行为 PlaylistItems.list API endpoint queried with its playlistId 请求参数设置为您在步骤 1 中获得的 ID:

根据 this answer of mine 的第 2 点:

For the uploads playlist of a channel, the items returned by PlaylistItems.list API endpoint are (have to be) ordered in reverse chronological order by contentDetails.videoPublishedAt.

因此,您必须在循环中对以下 URL 重复调用 PlaylistItems.list(使用 pagination):

https://www.googleapis.com/youtube/v3/playlistItems?playlistId=UPLOADS_ID&part=snippet&fields=nextPageToken,items/snippet/resourceId&maxResults=50&pageToken=PAGE_TOKEN&key=...

上面,UPLOADS_ID是第一步得到的上传播放列表的ID。

当且仅当您不是第一次调用 PlaylistItems.list 时才需要请求参数 pageToken=PAGE_TOKEN。当第 N 次调用端点时,N >= 2,则 PAGE_TOKEN 将是 [=122= 的 属性 nextPageToken 的值] 从上一个端点调用获得的响应。如果端点调用未提供 属性 nextPageToken,则分页循环终止。

为了您实现的正确性,PlaylistItems.list 的结果集需要分页:您必须忽略获得的 items 数组的 snippet 个对象当 属性 snippet.resourceId.kind 的值不等于 youtube#video.

时从每个端点调用

对于从 snippet.resourceId.kind 等于 youtube#video 的端点获得的每个 snippet 对象,属性 snippet.resourceId.videoId 被设置为一个对象的 ID属于 UPLOADS_ID.

标识的播放列表的上传视频

因此,当您第一次遇到后一种 snippet 对象时,您会保留相应的视频 ID 并中断分页循环(因此不再调用 PlaylistItems.list)。


关于你的第二个问题:

Is there any way to get the data I need without using so many units?

同样,答案是肯定的。

考虑到quota costs,执行步骤1执行一次和步骤2执行N次共计1 + N * 1 = N + 1个单位的成本。此外,如果不执行步骤 1,则成本将为 N 个单位。 (一旦您已经从之前的步骤 1 + 2 运行中知道 UPLOADS_ID,则无需执行步骤 1。)

另请注意,您的分页循环很可能会在 N 为 1 时终止;因此,您的 API 调用很可能只需要 2 个单位的配额成本。如果不执行第 1 步,隐含的配额成本很可能只有 1 个单位。