javascript 使用 YouTube API 从带有 JSON 提要的视频中获取所有评论
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10941803/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using YouTube API to get all comments from a video with the JSON feed
提问by Mark Lyons
I'm using the YouTube API to get comments for a video with a parameterized query like the following:
我正在使用 YouTube API 通过如下参数化查询获取视频评论:
http://gdata.youtube.com/feeds/api/videos/theVideoID/comments?v=2&alt=json
http://gdata.youtube.com/feeds/api/videos/theVideoID/comments?v=2&alt=json
The problem with this is that the maximum number of results you can get per query is 50. I want to get every comment. I'm currently using the start-index
and max-results
parameters to solve this. I had a bit of trouble doing iterations of 50 at a time because sometimes the iteration would have a start-index above the number of comments and I couldn't figure that out, so I just tried to work out one at a time. It may be better to do 50 at a time, so let me know if that is the better solution. For now:
这样做的问题是每个查询可以获得的最大结果数是 50。我想得到每条评论。我目前正在使用start-index
和max-results
参数来解决这个问题。我在一次进行 50 次迭代时遇到了一些麻烦,因为有时迭代的开始索引会高于评论数量,而我无法弄清楚这一点,所以我只是尝试一次解决一个。一次做 50 个可能会更好,所以让我知道这是否是更好的解决方案。目前:
I'm using PHP to get the amount of comments:
我正在使用 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'};
?>
And then I'm calling a JavaScript/jQuery function to load all comments into an array. For testing, it prints them into a div. For starters, here's how I'm calling the function:
然后我调用一个 JavaScript/jQuery 函数将所有评论加载到一个数组中。为了测试,它将它们打印到一个 div 中。首先,这是我调用函数的方式:
<body onLoad="loadComments('<?php echo $commentCount; ?>', '<?php echo $video_ID; ?>')">
Next, the actual function:
接下来,实际功能:
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.
});
}
});
}
}
The problem is that it is really iffy. When I use the count
variable as the terminating part of the for loop like this, it always gets like, for example, 45 out of 211 comments. If I manually enter 211, it will go to around 195. If I put in a low number, like 1-15, it pretty much always gets them all. 20+, it's never right.
问题是它真的很不确定。当我count
像这样使用变量作为 for 循环的终止部分时,它总是像,例如,211 条评论中的 45 条。如果我手动输入 211,它会变成 195 左右。如果我输入一个小数字,比如 1-15,它几乎总能得到它们。20+,永远是不对的。
I need to figure out how to get this to consistently get all the comments of a given video by taking advantage of the max-results
and start-index
parameters. Thanks!
我需要弄清楚如何通过利用max-results
和start-index
参数来始终如一地获得给定视频的所有评论。谢谢!
采纳答案by Software Guy
I just came across this question and I notice that its been quite some time when this was asked. But since nobody answered it yet, I think I should do that.
我刚遇到这个问题,我注意到问这个问题已经有一段时间了。但既然还没有人回答,我想我应该这样做。
What you should ideally do is, use Youtube's PHP API (using Zend_GData) and use the following code in PHP:
理想情况下,您应该使用 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 />";
}
The key element here is the retrieveAllEntriesForFeed()method.
这里的关键元素是retrieveAllEntriesForFeed()方法。
Instead of echo-ing all the comments, you can construct a JSON and send it back to the waiting Javascript.
您可以构建一个 JSON 并将其发送回等待的 Javascript,而不是回显所有评论。
It does not use the max-resultsor start-index, but does the job well without them.
它不使用max-results或start-index,但没有它们也能很好地完成工作。
回答by Shashank Tekriwal
Use the 'orderby' parameter of the api and set it to 'published' to retrieve almost all the comments.
使用 api 的 'orderby' 参数并将其设置为 'published' 以检索几乎所有的评论。
https://gdata.youtube.com/feeds/api/videos/<videoID>/comments?max-results=50&alt=json&orderby=published
You can still use the start-index parameter to loop through the comments but it is not a good idea.
您仍然可以使用 start-index 参数来遍历注释,但这不是一个好主意。
From the documentation: API responses use tags to identify pagination links for the previous and/or next page of entries in a feed. To avoid pagination problems, we recommend that you use these links to enable users to link to different pages of API results.
来自文档:API 响应使用标签来标识提要中条目的上一页和/或下一页的分页链接。为避免分页问题,我们建议您使用这些链接,让用户可以链接到 API 结果的不同页面。
If a feed contains a previous page of results, the API response will contain a tag with a rel attribute value of previous. If a feed contains a next page of results, the API response will contain a tag with a rel attribute value of next.
如果提要包含上一页结果,则 API 响应将包含一个 rel 属性值为 previous 的标签。如果提要包含下一页结果,则 API 响应将包含 rel 属性值为 next 的标签。
https://developers.google.com/youtube/2.0/reference#Paging_through_Results
https://developers.google.com/youtube/2.0/reference#Paging_through_Results
This way you won't get any nested feeds. To get the next set of results simply use the link given on the previous page of results! Hope this helps. It worked for me!
这样你就不会得到任何嵌套的提要。要获得下一组结果,只需使用上一页结果中给出的链接!希望这可以帮助。它对我有用!