使用 YouTube API 获取包含 JSON Feed 的视频中的所有评论



我正在使用 YouTube API 获取视频的评论,其中包含如下所示的参数化查询:

http://gdata.youtube.com/feeds/api/videos/theVideoID/comments?v=2&alt=json

这样做的问题是,每个查询可以获得的最大结果数为 50。我想得到每条评论。我目前正在使用start-indexmax-results参数来解决此问题。我一次进行 50 次迭代时遇到了一些麻烦,因为有时迭代的开始索引会高于评论数,而我无法弄清楚,所以我只是尝试一次计算一个。一次做 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 循环的终止部分时,它总是像 45 条评论中的 211 条。如果我手动输入 211,它将转到 195 左右。如果我输入一个较低的数字,比如 1-15,它几乎总是得到它们。20+,永远不对。

我需要弄清楚如何通过利用max-resultsstart-index参数来使其始终如一地获得给定视频的所有评论。谢谢!

我刚刚遇到这个问题,我注意到这个问题被问到已经有一段时间了。但既然还没有人回答,我想我应该这样做。

理想情况下,您应该做的是使用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。

它不使用最大结果开始索引,但在没有它们的情况下可以很好地完成工作。

使用 api 的 'orderby' 参数并将其设置为 'publish' 以检索几乎所有的注释。

https://gdata.youtube.com/feeds/api/videos/<videoID>/comments?max-results=50&alt=json&orderby=published

您仍然可以使用 start-index 参数来循环浏览注释,但这不是一个好主意。

从文档中:API 响应使用标记来标识源中上一页和/或下一页条目的分页链接。为避免分页问题,我们建议您使用这些链接使用户能够链接到 API 结果的不同页面。

如果源包含上一页结果,则 API 响应将包含一个 rel 属性值为上一页的代码。如果源包含下一页结果,则 API 响应将包含一个 rel 属性值为下一页的标记。

https://developers.google.com/youtube/2.0/reference#Paging_through_Results

这样,您将不会获得任何嵌套源。要获得下一组结果,只需使用上一页结果中给出的链接!希望这有帮助。它对我有用!

相关内容

  • 没有找到相关文章

最新更新