Php 如何获取所有视频ID';他来自Youtube频道
如何从youtube数据源获取所有视频id 我通过以下(API)URL接收youtube提要:Php 如何获取所有视频ID';他来自Youtube频道,php,api,youtube,youtube-api,youtube-channels,Php,Api,Youtube,Youtube Api,Youtube Channels,如何从youtube数据源获取所有视频id 我通过以下(API)URL接收youtube提要: 我已经知道如何从频道中提取链接、描述和缩略图,但我想从频道中提取所有视频Id(例如,wwonnpts)您好,我认为您应该从视频链接中的v参数中检索值,您可以使用正则表达式或子字符串…我知道这是一个老问题,但我写了一些东西来满足这里的要求: 只需编辑第23行: return $videoids[array_rand($videoids)]; 致: 这将返回一个包含用户视频ID的数组:) 编辑:对不
我已经知道如何从频道中提取链接、描述和缩略图,但我想从频道中提取所有视频Id(例如,wwonnpts)您好,我认为您应该从视频链接中的v参数中检索值,您可以使用正则表达式或子字符串…我知道这是一个老问题,但我写了一些东西来满足这里的要求: 只需编辑第23行:
return $videoids[array_rand($videoids)];
致:
这将返回一个包含用户视频ID的数组:)
编辑:对不起,伙计们(@testing,@Code\u Ed\u Student),我不知道为什么要点不再存在了,但我在我的档案中找到了它,代码如下。该实现与旧示例中的实现略有不同,但实现了相同的效果(您可以用任何其他逻辑替换该阵列)
这是我的方式。速度慢,但能工作。:)
功能获取视频($channel){
如果($channel==“”){
返回false;
}
/*获取视频的数量*/
$books=simplexml\u load\u文件('s)http://gdata.youtube.com/feeds/base/users/“.$channel.'/uploads?最大结果=1,开始索引=1”);
$numb_videos=$books->children('openSearch',true)->totalResults;
settype($numb_视频,“整数”);
$ids=array();
$i=1;
对于($i=1;$i条目->id;
settype($ApiLink,“string”);
$ApiLink=str_替换(“http://gdata.youtube.com/feeds/base/videos/“,”,$ApiLink);
阵列推送($ids,$ApiLink);
}
返回$id;
}
使用youtube数据api v3实现这一点。
使用以下方法:
获取{YOUR_API_KEY}
您将获得上述url的结果,如下所示:
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"
}
}
]
}
有关更多参考信息,请查看注意:中的数组到字符串转换
C:\wamp\www\youtube-vimeo-api播放列表到数据库导入器master\youtube-vimeo-api播放列表到数据库导入器.php
在第28行看来,通过一个循环检索所有视频是一个好主意,但显然不是。如果一个频道有数千个(超过1600个)对于视频,
search
不会返回所有内容:最后的结果页面很少是空的,结果的数量将是错误的,给定页面的数量将只有20页左右
因此,如果您需要通过API获取所有ID,那么最好首先使用频道
API获取“上载”播放列表ID,然后在播放项目
API中使用它来检索所有视频
第一个请求URL如下所示(当然,在开始时使用):
结果:
{
"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"
}
}
}
]
}
{
"nextPageToken": "CDIQAA",
"items": [
{
"snippet": {
"resourceId": {
"videoId": "9nktr1MgS-A"
}
}
}
]
}
或者,如果不需要大量字节,请使用如下筛选器字段:
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
结果(缩短为项键中数组的第一个结果):
或过滤后的一个,仅获取视频ID(和下一页标记):
结果:
{
"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"
}
}
}
]
}
{
"nextPageToken": "CDIQAA",
"items": [
{
"snippet": {
"resourceId": {
"videoId": "9nktr1MgS-A"
}
}
}
]
}
您可以使用nextPageToken
键值检索下一页,将其添加到pageToken
键值以获取参数:
{
"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"
}
}
},
{
...
}
]
}
(我从上面的结果中获取了一个令牌,例如,它可能与您的请求不同)
在最后一页将没有nextPageToken
键。使用pageToken可以检索所有结果。pageToken
对我不起作用…我没有得到所有结果。有些结果丢失了!pageToken对我不起作用。请详细说明。如果可能,请提供示例。或者您可以参考以下内容:获取5个以上的结果每个请求0个结果,Google的YouTube数据API希望您按照他们文档中的说明执行分页:我尝试了,但我得到未能打开流:HTTP请求失败!HTTP/1.0 403被禁止
。似乎Google阻止了太多请求…遗憾的是,这不再受支持:请修复链接,使您的答案更有价值。$youtube是Google_服务_youtube类的实例:)检查我提出的问题,让我知道它是否有用!
playlistItems?maxResults=50&playlistId=PLAYLIST_ID&part=snippet&key=YOUR_TOKEN
{
"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"
}
}
},
{
...
}
]
}
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"
}
}
}
]
}
playlistItems?fields=nextPageToken,items(snippet(resourceId(videoId)))&maxResults=50&part=snippet&playlistId=PLAYLIST_ID&key=YOUR_TOKEN&pageToken=CDIQAA