关于你的第一个问题:
我只想调用 API 并让它返回频道的最新视频。
答案是肯定的。您必须按以下步骤进行:
第 1 步:获取与您感兴趣的频道对应的上传播放列表的 ID:
对于给定的通道——由其 ID CHANNEL_ID 标识——调用Channels.list API 端点,查询其请求参数id 设置为CHANNEL_ID:
https://www.googleapis.com/youtube/v3/channels?part=contentDetails&fields=items/contentDetails/relatedPlaylists/uploads&id=CHANNEL_ID&key=....
所需的上传播放列表 ID 将作为端点返回的 Channels resource JSON 对象的属性 contentDetails.relatedPlaylists.uploads 的值找到。
通常,频道 ID 及其对应的上传播放列表 ID 通过s/^UC([0-9a-zA-Z_-]{22})$/UU\1/ 关联。
请注意,上面我使用 fields 请求参数从 API 仅获取实际需要的信息。
另请注意,您只需像上面一样调用Channels.list 一次,以便根据需要多次使用获取的上传播放列表 ID。
第 2 步:获取您感兴趣的频道的最新上传视频:
为此,您需要依赖 PlaylistItems.list API 端点的未记录行为,该端点的 playlistId 请求参数设置为您在步骤 1 中获得的 ID:
根据this answer of mine的第2点:
对于频道的上传播放列表,PlaylistItems.list API 端点返回的项目(必须)按时间倒序由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-th 时,使用N >= 2,那么PAGE_TOKEN 将是从先前端点调用获得的 JSON 响应的属性nextPageToken 的值。如果端点调用未提供属性nextPageToken,则分页循环终止。
为了实现的正确性,需要对PlaylistItems.list 的结果集进行分页:当值为属性snippet.resourceId.kind 不等于youtube#video。
对于从端点获取的每个snippet.resourceId.kind 等于youtube#video 的snippet 对象,属性snippet.resourceId.videoId 设置为属于UPLOADS_ID 标识的播放列表的上传视频的ID。
因此,当您第一次遇到后一种类型的 snippet 对象时,您会保留相应的视频 ID 并中断分页循环(因此不再调用 PlaylistItems.list)。
关于你的第二个问题:
有没有什么方法可以在不使用这么多单位的情况下获取我需要的数据?
再次,答案是肯定的。
考虑到quota costs,执行步骤 1 执行一次,步骤 2 执行 N 次的成本为 1 + N * 1 = N + 1 个单位。此外,如果不执行步骤 1,则成本将为N 个单位。 (一旦您从之前的步骤 1 + 2 运行中知道 UPLOADS_ID,则无需执行步骤 1。)
还请注意,您的分页循环很可能会以 N 为 1 终止;因此,您的 API 调用很可能只需要 2 个单位的配额成本。如果不执行第 1 步,则隐含的配额成本很可能只有 1 个单位。