看起来search
API 是一个通过单个循环检索所有视频的好主意,但显然不是。如果一个频道有数千个(超过 1600 个)视频,search
则不会全部返回:最后几个结果页面会是空的,结果数会出错,给定页面的数量将只有 20 页左右。
因此,如果您需要通过 API 获取所有 ID,那么最好先使用channels
API 获取“上传”播放列表 ID,然后在playlistItems
API 中使用它来检索所有视频。
第一个请求 URL 将如下所示(当然,在开头使用https://www.googleapis.com/youtube/v3/ ):
channels?part=contentDetails&id=CHANNEL_ID&key=YOUR_TOKEN
结果:
{
"kind": "youtube#channelListResponse",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/Nza6t_W5qltBCnHIHKgNiSRu0bE\"",
"pageInfo": {
"totalResults": 1,
"resultsPerPage": 1
},
"items": [
{
"kind": "youtube#channel",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/95y8HKrtWV3t4apHu0KjgoaNbc0\"",
"id": "UC9-y-6csu5WGm29I7JiwpnA",
"contentDetails": {
"relatedPlaylists": {
"likes": "LL9-y-6csu5WGm29I7JiwpnA",
"favorites": "FL9-y-6csu5WGm29I7JiwpnA",
"uploads": "UU9-y-6csu5WGm29I7JiwpnA",
"watchHistory": "HL",
"watchLater": "WL"
}
}
}
]
}
或者,如果您不需要大量字节,请使用如下过滤器字段:
channels?fields=items(contentDetails(relatedPlaylists(uploads)))&part=contentDetails&id=CHANNEL_ID&key=YOUR_TOKEN
过滤结果:
{
"items": [
{
"contentDetails": {
"relatedPlaylists": {
"uploads": "UU9-y-6csu5WGm29I7JiwpnA"
}
}
}
]
}
下一步是获取包含视频的所有页面的列表:
playlistItems?maxResults=50&playlistId=PLAYLIST_ID&part=snippet&key=YOUR_TOKEN
结果(缩短items
键中数组的第一个结果):
{
"kind": "youtube#playlistItemListResponse",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/GmoHN7IVzBjFEtB0547SRegTL9c\"",
"nextPageToken": "CDIQAA",
"pageInfo": {
"totalResults": 399,
"resultsPerPage": 50
},
"items": [
{
"kind": "youtube#playlistItem",
"etag": "\"m2yskBQFythfE4irbTIeOgYYfBU/5gxLp2iP0FwcZQWb98LCOGu0TfA\"",
"id": "VVU5LXktNmNzdTVXR20yOUk3Sml3cG5BLjlua3RyMU1nUy1B",
"snippet": {
"publishedAt": "2017-08-03T11:27:38.000Z",
"channelId": "UC9-y-6csu5WGm29I7JiwpnA",
"title": "Stop Button Solution? - Computerphile",
"description": "After seemingly insurmountable issues with Artificial General Intelligence, Rob Miles takes a look at a promising solution.\n\nConcrete Problems in AI Safety: blah blah blah blah blah blah blah blah blah",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/hqdefault.jpg",
"width": 480,
"height": 360
},
"standard": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/sddefault.jpg",
"width": 640,
"height": 480
},
"maxres": {
"url": "https://i.ytimg.com/vi/9nktr1MgS-A/maxresdefault.jpg",
"width": 1280,
"height": 720
}
},
"channelTitle": "Computerphile",
"playlistId": "UU9-y-6csu5WGm29I7JiwpnA",
"position": 0,
"resourceId": {
"kind": "youtube#video",
"videoId": "9nktr1MgS-A"
}
}
},
{
...
}
]
}
或过滤后的仅获取视频的 ID(和下一页令牌):
playlistItems?fields=nextPageToken,items(snippet(resourceId(videoId)))&maxResults=50&playlistId=PLAYLIST_ID&part=snippet&key=YOUR_TOKEN
结果:
{
"nextPageToken": "CDIQAA",
"items": [
{
"snippet": {
"resourceId": {
"videoId": "9nktr1MgS-A"
}
}
}
]
}
您可以使用nextPageToken
键值检索下一页,并将其添加到带有pageToken
键的 GET 参数中:
(例如,我从上面的结果中获取了一个令牌,您的请求可能会有所不同)
playlistItems?fields=nextPageToken,items(snippet(resourceId(videoId)))&maxResults=50&part=snippet&playlistId=PLAYLIST_ID&key=YOUR_TOKEN&pageToken=CDIQAA
最后一页没有nextPageToken
钥匙。