如何从 Youtube 频道获取所有视频 ID
Posted
技术标签:
【中文标题】如何从 Youtube 频道获取所有视频 ID【英文标题】:How can I get all videos ID's from a Youtube channel 【发布时间】:2011-09-13 22:26:18 【问题描述】:如何从 youtube 数据馈送中获取所有视频 ID?
我通过以下 (API) URL 接收 youtube 供稿: http://gdata.youtube.com/feeds/base/users/#userid#/uploads?alt=rss&v=2&orderby=published&client=ytapi-youtube-profile
我已经知道如何从频道中提取链接、描述和缩略图,但我想从频道中提取所有视频 ID(例如 http://www.youtube.com/watch?v=WWooNnPnHTs)
【问题讨论】:
***.com/questions/48472550/… 检查我提出的问题,如果有帮助,请告诉我! 【参考方案1】:这是我的方式。慢,但它的工作原理。 :)
function getVideos($channel)
if($channel == "")
return false;
/* Get number of videos */
$books = simplexml_load_file('http://gdata.youtube.com/feeds/base/users/'.$channel.'/uploads?max-results=1&start-index=1');
$numb_videos = $books->children( 'openSearch', true )->totalResults;
settype($numb_videos, "integer");
$ids = array();
$i = 1;
for($i = 1; $i <= $numb_videos; $i++)
$books = simplexml_load_file('http://gdata.youtube.com/feeds/base/users/'.$channel.'/uploads?max-results=1&start-index='.$i);
$ApiLink = $books->entry->id;
settype($ApiLink, "string");
$ApiLink = str_replace("http://gdata.youtube.com/feeds/base/videos/", "", $ApiLink);
array_push($ids, $ApiLink);
return $ids;
【讨论】:
我试过了,但我得到了failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden
。似乎 Google 阻止了太多请求...
遗憾的是不再支持此功能:***.com/questions/18953499/…【参考方案2】:
使用这个:
GET https://www.googleapis.com/youtube/v3/search?part=id&channelId=UC9MAhZQQd9egwWCxrwSIsJQ&maxResults=10&order=date&key=YOUR_API_KEY
你会得到上述网址的结果:
200 OK
- Show headers -
"kind": "youtube#searchListResponse",
"etag": "\"qQvmwbutd8GSt4eS4lhnzoWBZs0/WiiEAt3fgPkFw_831Iveo6mV-IU\"",
"nextPageToken": "CAQQAA",
"pageInfo":
"totalResults": 1046,
"resultsPerPage": 4
,
"items": [
"kind": "youtube#searchResult",
"etag": "\"qQvmwbutd8GSt4eS4lhnzoWBZs0/OtU1Ja-W-gNf83iiXWzodKk3Ce0\"",
"id":
"kind": "youtube#video",
"videoId": "jKLMD-LXIgk"
,
"kind": "youtube#searchResult",
"etag": "\"qQvmwbutd8GSt4eS4lhnzoWBZs0/EUhMCxemh2UGmf2ufGS0IYdcMUs\"",
"id":
"kind": "youtube#video",
"videoId": "glCQQeH_ddw"
,
"kind": "youtube#searchResult",
"etag": "\"qQvmwbutd8GSt4eS4lhnzoWBZs0/2IMOnedhjKXxnFZy-PNg5o80kkY\"",
"id":
"kind": "youtube#video",
"videoId": "yB78MIcmDxs"
,
"kind": "youtube#searchResult",
"etag": "\"qQvmwbutd8GSt4eS4lhnzoWBZs0/oEb7q9_GwGdXcHsvuRDuNmh_rGQ\"",
"id":
"kind": "youtube#video",
"videoId": "NnkDja1cXlo"
]
更多参考您可以查看here
【讨论】:
使用pageToken可以检索所有结果。pageToken
没有为我工作......我没有得到所有的结果。有些不见了!
pageToken 对我不起作用。你能详细说明一下吗?如果可能,请提供示例。
或者你可以参考这个:***.com/questions/18953499/…
为了每次请求获得超过 50 个结果,Google 的 YouTube 数据 API 要求您按照其文档中所述执行分页:developers.google.com/youtube/v3/guides/implementation/…【参考方案3】:
$channelsResponse = $youtube->channels->listChannels('id,contentDetails', array(
'mine' => 'true'));
$playlistId = $channelsResponse['items']['contentDetails']['relatedPlaylists']['uploads'];
$searchResponse = $youtube->playlistItems->listPlaylistItems('snippet', array(
'playlistId' => $playlistId,
'maxResults' => 50,
'fields' => 'items(snippet(publishedAt,channelId,title,description,thumbnails(default),resourceId)),pageInfo,nextPageToken'));
echo json_encode($searchResponse['items']['contentDetails']['videoId']);
使用 youtube data api v3 来做到这一点。 here's the link
【讨论】:
$youtube 是 Google_Service_YouTube 类的实例 :)【参考方案4】:您好,我认为您应该从视频链接中的 v 参数中检索值,您可以使用正则表达式或子字符串...
【讨论】:
【参考方案5】:我知道这是一个老问题,但我写了一些可以满足此处要求的内容:
https://gist.github.com/gport/5693404
只需编辑第 23 行:
return $videoids[array_rand($videoids)];
收件人:
return $videoids;
这将返回一个包含用户视频 ID 的数组:)
编辑:对不起,伙计们(@testing,@Code_Ed_Student),不知道为什么要点不再存在,但我在我的档案中找到了它,代码如下。实现与旧示例中的有点不同,但实现相同(您可以用任何其他逻辑替换数组)。
$feedresult = simplexml_load_file('http://gdata.youtube.com/feeds/api/users/wondervol/uploads');
if($feedresult)
$videoids = array();
foreach ($feedresult->entry as $video)
$media = $video->children('media', true);
$url = (string)$media->group->player->attributes()->url;
$index = strrpos($url, "&");
$url = substr($url, 0, $index);
$index = strrpos($url, "watch");
$url = substr($url, $index + 8, strlen($url) - ($index + 8));
$videoids[] = $url;
【讨论】:
请修复链接以使您的答案有价值。【参考方案6】:看起来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
键。
【讨论】:
【参考方案7】:注意:数组到字符串的转换
C:\wamp\www\youtube-vimeo-api-playlist-to-database-importer-master\youtube-vimeo-api-playlist-to-database-importer.php
第 28 行
【讨论】:
以上是关于如何从 Youtube 频道获取所有视频 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 YouTube Data API v3 从我自己的 YouTube 频道获取所有视频
YouTube API:如何使用标签 Y 从频道 X 获取视频?