我正在使用适用于Youtube的v3 Google API:
$url = 'https://www.googleapis.com/youtube/v3/search?part=id&channelId=' . $channelID . '&maxResults=50&order=date&key=' . $API_key;
我已经设置了一个脚本,该脚本应该从给定的频道ID中提供所有视频。对于某些频道,我会收到所有视频,因为有些视频丢失(与Youtube中直接显示的视频数量相比),而对于更大的频道,我获得了最多。尽管还有更多的488个视频的结果。
pageToken
是一件奇怪的事。例如,一个频道有955个视频。我得到18页,每页50个项目(即900个视频)。其中一些是播放列表,但如果我减去23个播放列表,我仍然有877个视频。如果我删除重复项,我只有488个结果! JSON输出中的totalResults
向我显示了975个结果!?
这是我的递归函数:
function fetchAllVideos($parsed_json){
$foundIds = array();
if($parsed_json != ''){
$foundIds = getVideoIds($parsed_json);
$nextPageToken = getNextPageToken($parsed_json);
$prevPageToken = getPrevPageToken($parsed_json);
if($nextPageToken != ''){
$new_parsed_json = getNextPage($nextPageToken);
$foundIds = array_merge($foundIds, fetchAllVideos($new_parsed_json));
}
if($prevPageToken != ''){
$new_parsed_json = getNextPage($prevPageToken);
$foundIds = array_merge($foundIds, fetchAllVideos($new_parsed_json));
}
}
return $foundIds;
}
我用$videoIds = fetchAllVideos($parsed_json);
调用它,而$parsed_json
是我检索的第一个网址的结果。你能在这里看到错误吗?
是否有人知道视频的数量是如何计算的,这些视频直接显示在Youtube中?有没有人设法获得与Youtube中的数字相对应的完整列表?
答案 0 :(得分:3)
此脚本一次选择60天的时间段并检索其结果,然后将其添加到现有数据数组中。通过这样做,对允许的视频数量没有限制,尽管可能需要一些时间来浏览具有几千个视频的较大的YouTube频道。确保设置API_KEY,时区,用户名,开始日期(应该在频道上的第一个视频之前开始)和句点(默认设置为60 * 60 * 24 * 60,这是60天的秒数。这将需要如果视频的频率在60天内高于约50,则会更低。)(5184000秒)。
*所有这些都在剧本中进行了评论。
java.lang.UnsupportedOperationException: Schema for type java.lang.class[_] is not supported
答案 1 :(得分:2)
https://gdata.youtube.com/feeds/api/users/USERNAME_HERE/uploads?max-results=50&alt=json&start-index=1
完成了这个伎俩。它是一个JSON提要,你必须循环,直到你得到少于50个结果。
修改强>
这应该是我使用的脚本:
ini_set('max_execution_time', 900);
function getVideos($channel){
$ids = array();
$start_index = 1;
$still_have_results = true;
if($channel == ""){
return false;
}
$url = 'https://gdata.youtube.com/feeds/api/users/' . $channel . '/uploads?max-results=50&alt=json&start-index=' . $start_index;
$json = file_get_contents($url);
$obj = json_decode($json);
while($still_have_results){
foreach($obj->feed->entry as $video){
$video_url = $video->id->{'$t'};
$last_pos = strrpos($video_url, '/');
$video_id = substr($video_url, $last_pos+1, strlen($video_url) - $last_pos);
array_push($ids, $video_id);
}
$number_of_items = count($obj->feed->entry);
$start_index += count($obj->feed->entry);
if($number_of_items < 50) {
$still_have_results = false;
}
$url = 'https://gdata.youtube.com/feeds/api/users/' . $channel . '/uploads?max-results=50&alt=json&start-index=' . $start_index;
$json = file_get_contents($url);
$obj = json_decode($json);
}
return $ids;
}
$videoIds = getVideos('youtube');
echo '<pre>';
print_r($videoIds);
echo '</pre>';
现在我做了一个测试,但我没有收集100%的视频。然而,我提出了最好的选择。