我通过此(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)。
使用以下内容:
GET https://www.googleapis.com/youtube/v3/search?part=id&channelId=UC9MAhZQQd9egwWCxrwSIsJQ&maxResults=10&order=date&key={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"
}
}
]
}
您可以在此处参考更多相关信息。
该内容涉及IT技术。pageToken
对我没用... 我没有得到所有的结果。有些结果丢失了! - testingfunction 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;
}
$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']);
嗨,我认为你应该从视频链接的v参数中检索值,你可以使用正则表达式或子字符串...
我的解决方案使用Python、Google API和分页来获取所有视频ID。
import os, sys
import googleapiclient.discovery
from decouple import config
def main():
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
api_service_name = "youtube"
api_version = "v3"
DEVELOPER_KEY = config('API_KEY')
youtube = googleapiclient.discovery.build(
api_service_name, api_version, developerKey = DEVELOPER_KEY)
request = youtube.channels().list(
part="contentDetails",
forUsername="username_here",
# id="uiyiouyiouy",
)
response = request.execute()
for item in response['items']:
playlistId = item['contentDetails']['relatedPlaylists']['uploads']
nextPageToken = ''
while (nextPageToken != None):
playlistResponse = youtube.playlistItems().list(
part='snippet',
playlistId=playlistId,
maxResults=25,
pageToken=nextPageToken
)
playlistResponse = playlistResponse.execute()
for idx, playlistItem in enumerate(playlistResponse['items']):
print(idx, playlistItem['snippet']['resourceId']['videoId'])
if 'nextPageToken' in playlistResponse.keys():
nextPageToken = playlistResponse['nextPageToken']
else:
nextPageToken = None
if __name__ == "__main__":
main()
.env 文件的示例
API_KEY=<Key_Here>
我知道这是一个老问题,但我写了一些代码来实现这里所要求的功能:
https://gist.github.com/gport/5693404
只需编辑第23行:
return $videoids[array_rand($videoids)];
To:
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;
}
看起来 search
API 是通过单个循环检索所有视频的好方法,但实际上不是这样。如果一个频道有数千个(超过1600个)视频,则 search
将无法返回所有视频:最后几页结果将为空,结果数量将错误,并且给定页面的数量仅约为20页。
因此,如果您需要通过API获取所有ID,则最好首先使用 channels
API 获取“uploads”播放列表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"
}
}
},
{
...
}
]
}
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
键值来检索下一页,将其添加到GET参数中,并使用pageToken
键:
(我只是为了举例从上面的结果中取了一个令牌,它可能与您的请求不同)
playlistItems?fields=nextPageToken,items(snippet(resourceId(videoId)))&maxResults=50&part=snippet&playlistId=PLAYLIST_ID&key=YOUR_TOKEN&pageToken=CDIQAA
nextPageToken
键。注意:在
数组转换为字符串时发生了错误。
C:\wamp\www\youtube-vimeo-api-playlist-to-database-importer-master\youtube-vimeo-api-playlist-to-database-importer.php
在第28行