如何通过YouTube Data API v3筛选认证用户全状态视频的日期范围
首先得明确:你遇到的是YouTube Data API v3的硬限制——/search端点不允许同时使用forMine=true和日期范围参数,而且/search、/activities这两个支持日期筛选的端点,默认只会返回公开可见的视频,根本拿不到私有、未公开状态的内容。
为什么你的请求会报错?
你贴的请求里虽然加了type=video,但YouTube的/search端点就是不允许forMine=true和publishedAfter/publishedBefore组合使用——这是API规则里明确禁止的筛选组合,从错误信息的描述也能看出来,这类搭配不在允许的范围内。
高效解决10000+视频的筛选问题
要拿到用户所有状态的视频并按日期范围过滤,最优方案是绕开/search,利用用户的「上传播放列表」来批量获取,具体步骤如下:
1. 先拿到用户的「上传」播放列表ID
每个YouTube用户都有一个默认的“上传”专属播放列表,你可以通过Channels端点获取这个ID:
GET https://www.googleapis.com/youtube/v3/channels?access_token={token}&part=contentDetails&mine=true
响应里的contentDetails.relatedPlaylists.uploads就是你要找的播放列表ID。
2. 分页遍历播放列表里的所有视频ID
用PlaylistItems端点分页拉取这个播放列表下的所有视频ID,每次最多请求50条(API允许的最大值),用pageToken处理分页:
GET https://www.googleapis.com/youtube/v3/playlistItems?access_token={token}&part=contentDetails&playlistId={你的上传播放列表ID}&maxResults=50&pageToken={下一页令牌}
循环请求直到响应里没有nextPageToken,就能拿到用户所有上传视频的ID了。
3. 批量获取视频的发布日期和状态
把拿到的视频ID按50个一组打包,调用Videos端点获取每个视频的发布时间和状态信息:
GET https://www.googleapis.com/youtube/v3/videos?access_token={token}&part=snippet,status&id={视频ID1},{视频ID2},...,{视频ID50}
这里要注意:单次请求最多传50个ID,超过会报错。
4. 服务器端过滤日期范围
拿到所有视频的snippet.publishedAt(发布日期)后,在你的服务器端筛选出符合publishedAfter和publishedBefore范围的视频就行。这种批量获取后再过滤的方式,比客户端逐条处理效率高太多,而且能拿到所有状态的视频(只要你的OAuth令牌有足够权限)。
为什么这个方案更适合你的场景?
- 完全绕开了
/search的限制,能获取私有、未公开等所有状态的视频 - 批量请求大幅减少API调用次数:10000个视频只需要约200次
PlaylistItems请求 + 200次Videos请求,总共400次左右,效率远高于客户端逐条过滤 - 服务器端过滤比客户端处理大量数据更高效,不会拖慢前端
权限提醒
要获取私有/未公开视频,你的OAuth令牌必须请求正确的权限:https://www.googleapis.com/auth/youtube.readonly(只读权限)或者https://www.googleapis.com/auth/youtube(读写权限),否则只能拿到公开视频。
内容的提问来源于stack exchange,提问作者Andy Rice

