我正在使用YouTube API来获取带有参数化查询的视频评论,如下所示:
http://gdata.youtube.com/feeds/api/videos/theVideoID/comments?v=2&alt=json
这个问题是每个查询可以得到的最大结果数是50.我想得到每条评论。我目前正在使用start-index
和max-results
参数来解决此问题。我一次做50次迭代时遇到了一些麻烦,因为有时候迭代会有一个高于注释数量的start-index而且我无法弄清楚,所以我只想尝试一次一个。最好一次做50个,所以让我知道这是否是更好的解决方案。现在:
我正在使用PHP来获取评论数量:
<?php
$video_ID = 'gT2HYxOdxUk';
$JSON = file_get_contents("https://gdata.youtube.com/feeds/api/videos/{$video_ID}?v=2&alt=json");
$JSON_Data = json_decode($JSON);
$commentCount = $JSON_Data->{'entry'}->{'gd$comments'}->{'gd$feedLink'}->{'countHint'};
?>
然后我调用JavaScript / jQuery函数将所有注释加载到数组中。为了测试,它将它们打印成div。对于初学者来说,这就是我如何调用该函数:
<body onLoad="loadComments('<?php echo $commentCount; ?>', '<?php echo $video_ID; ?>')">
接下来,实际功能:
function loadComments(count, videoID) {
for(i = 1; i <= count; i++) {
$.ajax({
url: "http://gdata.youtube.com/feeds/api/videos/" + videoID + "/comments?v=2&alt=json&max-results=1" + "&start-index=" + i,
dataType: "jsonp",
success: function(data){
$.each(data.feed.entry, function(key, val) {
comments.push(val.content.$t);
$('#commentOutput').append(val.content.$t + '<br>'); //Just for testing purposes.
});
}
});
}
}
问题在于它真的很不对劲。当我像这样使用count
变量作为for循环的终止部分时,它总是像211个注释中的45个那样。如果我手动输入211,它将会到195左右。如果我输入一个较低的数字,如1-15,它几乎总能得到它们。 20+,它永远不对。
我需要弄清楚如何通过利用max-results
和start-index
参数来持续获取给定视频的所有评论。谢谢!
答案 0 :(得分:4)
我刚刚遇到这个问题而且我注意到这个问题已经过了很长一段时间。但既然没有人回答,我想我应该这样做。
理想情况下,使用Youtube的PHP API(使用Zend_GData)并在PHP中使用以下代码:
<?php
require_once 'Zend/Loader.php'; // the Zend dir must be in your include_path
Zend_Loader::loadClass('Zend_Gdata_YouTube');
$yt = new Zend_Gdata_YouTube();
$yt->setMajorProtocolVersion(2);
$video = parse_url("http://www.youtube.com/watch?v=K-ob8sr9ZX0");
parse_str(urldecode($video['query']), $query);
$videoId = $query['v'];
$commentFeed = $yt->retrieveAllEntriesForFeed($yt->getVideoCommentFeed($videoId));
foreach ($commentFeed as $commentEntry) {
echo "Full text: " . $commentEntry->content->text . "<br />";
}
这里的关键元素是 retrieveAllEntriesForFeed()方法。
您可以构建一个JSON并将其发送回等待的Javascript,而不是回显所有注释。
它不使用 max-results 或 start-index ,但没有它们就可以完成工作。
答案 1 :(得分:2)
使用&#39; orderby&#39; api的参数并将其设置为&#39;发布&#39;检索几乎所有的评论。
https://gdata.youtube.com/feeds/api/videos/<videoID>/comments?max-results=50&alt=json&orderby=published
您仍然可以使用start-index参数循环注释,但这不是一个好主意。
从文档中: API响应使用标记来标识Feed中条目的上一页和/或下一页的分页链接。为避免分页问题,我们建议您使用这些链接使用户能够链接到API结果的不同页面。
如果Feed包含上一页结果,则API响应将包含rel属性值为previous的标记。 如果Feed包含下一页结果,则API响应将包含rel属性值为next的标记。
https://developers.google.com/youtube/2.0/reference#Paging_through_Results
这样您就无法获得任何嵌套Feed。要获得下一组结果,只需使用上一页结果中给出的链接!希望这可以帮助。它对我有用!