4

YouTube APIを使用して、次のようなパラメータ化されたクエリで動画のコメントを取得しています。

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

これに伴う問題は、クエリごとに取得できる結果の最大数が50であるということです。すべてのコメントを取得したいと思います。私は現在、これを解決するためにstart-indexmax-resultsパラメータを使用しています。一度に50回の反復を行うのに少し問題がありました。これは、反復の開始インデックスがコメント数を超えることがあり、それを理解できなかったため、一度に1つずつ実行しようとしただけです。一度に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.
                });
            }

        });
    }
}

問題は、それが本当に気難しいということです。このようにforループの終了部分として変数を使用するとcount、たとえば、211件のコメントのうち45件のようになります。手動で211と入力すると、約195になります。1〜15のように小さい数値を入力すると、ほとんどの場合、すべてが取得されます。20歳以上、それは決して正しくありません。

max-resultsおよびパラメータを利用して、特定のビデオのすべてのコメントを一貫して取得するために、これを取得する方法を理解する必要がありstart-indexます。ありがとう!

4

2 に答える 2

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は使用しませんが、これらがなくてもうまく機能します。

于 2012-08-03T00:23:03.237 に答える
2

APIの「orderby」パラメーターを使用して「published」に設定すると、ほとんどすべてのコメントが取得されます。

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

start-indexパラメーターを使用してコメントをループすることはできますが、これはお勧めできません。

ドキュメントから:APIレスポンスはタグを使用して、フィード内のエントリの前のページや次のページのページ付けリンクを識別します。ページネーションの問題を回避するには、これらのリンクを使用して、ユーザーがAPI結果のさまざまなページにリンクできるようにすることをお勧めします。

フィードに結果の前のページが含まれている場合、API応答には、rel属性値がpreviousのタグが含まれます。フィードに結果の次のページが含まれている場合、API応答にはrel属性値がnextのタグが含まれます。

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

この方法では、ネストされたフィードを取得しません。次の結果セットを取得するには、結果の前のページにあるリンクを使用するだけです。お役に立てれば。それは私のために働いた!

于 2014-10-15T13:29:05.300 に答える