javascript - 使用 YouTube API 从带有 JSON 提要的视频中获取所有评论

标签 javascript json youtube youtube-api

我正在使用 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 循环的终止部分时,它总是像 211 条评论中的 45 条一样。如果我手动输入 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,而不是回显所有评论。

它不使用 max-resultsstart-index,但没有它们也能很好地完成工作。

关于javascript - 使用 YouTube API 从带有 JSON 提要的视频中获取所有评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941803/

相关文章:

javascript - 在 PHP 中构建 JSON 并在 &lt;script&gt; 中回显时转义字符

python - 获取YouTube视频列表的评论数

html - 您的HTML插件无法正常工作

javascript - 将多个字段的值传递给jquery

javascript - 这个算法的时间和空间复杂度是O(n)还是O(1)?

javascript - Ember.js 错误 : You must include an 'id' for an object passed to 'push'

java - 如何在 spring MVC 的 Controller 中操作 jQuery AJAX JSON 数据

php - 如何解析YouTube网址以获取视频或播放列表ID?

javascript - 如何在单个静态 HTML 中显示 2-3 个 AMcharts

javascript - jQuery 表达式未被识别