2012-06-08 4 views
4

Я использую API YouTube, чтобы получить комментарии для видео с параметризованных запросов вроде следующего:Использование YouTube API, чтобы получить все комментарии из видео с JSON питающие

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

Проблема с это то, что максимальное количество результатов, которое вы можете получить за запрос, равно 50. Я хочу получить каждый комментарий. В настоящее время я использую параметры start-index и max-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-results и start-index. Благодаря!

ответ

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.

Он не использует максимальных значений результатов или начальный индекс, но делает работу хорошо и без них.

+1

Не проверял это, но я думаю, что, возможно, нашел это полезным. Я сделал небольшой цикл, используя параметры «max-results» и 'start-index', как вы сказали, и все получилось хорошо. Потребовалось некоторое время, и я должен был отключить его на определенную сумму, так как это может привести к краху моего браузера, если он попытается пройти слишком много раз. Я добавлю это как ответ, поскольку для любого, кто сталкивается с этим, кажется намного более мгновенным. –

+1

будет здорово, если вы опубликуете решение, сообщество выиграет от него, пожалуйста, подумайте, чтобы вернуть сообщество. Благодаря! – mongotop

+0

Поскольку мне непонятно, этот код возвращает все комментарии (даже тысячи)? Благодаря! – Thoth

2

Используйте параметр «orderby» для api и установите его для «публикации», чтобы получить почти все комментарии.

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

Таким образом, вы не будете получать какие-либо вложенные каналы. Чтобы получить следующий набор результатов, просто используйте ссылку, указанную на предыдущей странице результатов! Надеюсь это поможет. Это сработало для меня!

Смежные вопросы