За последние 24 часа нас посетили 63584 программиста и 1743 робота. Сейчас ищут 1457 программистов ...

Как настроить запросы для получения данных с YouTube?

Тема в разделе "PHP для новичков", создана пользователем Drobotko Taras, 13 окт 2016.

  1. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Доброго дня! Я изучаю php по книге Мориссона М. "Изучаем PHP и MySQL". В главе 12 описано как производить поиск на YouTube видеозаписей и показывать результат этого поиска на своей странице . Но код с книги не работает, а мои поиски ответа в сети не увенчались успехом.
    Вопрос: как переработать код с книги, чтобы результаты запросов данных с сайта УouTube виводились в динамическом режиме на на моей веб-странице? Код приведенный ниже включается в сценарий веб-страницы с помощью require_once('youtube.php'):

    PHP:
    1. <?php  define('YOUTUBE_URL', 'http://gdata.youtube.com/feeds/api/users/aliensabductedme/favorites');
    2.   define('NUM_VIDEOS', 5);
    3.  
    4.   // Read the XML data into an object  $xml = simplexml_load_file(YOUTUBE_URL);
    5.  
    6.   $num_videos_found = count($xml->entry);
    7.   if ($num_videos_found > 0) {
    8.   echo '<table><tr>';
    9.   for ($i = 0; $i < min($num_videos_found, NUM_VIDEOS); $i++) {
    10.   // Get the title
    11.   $entry = $xml->entry[$i];
    12.   $media = $entry->children('http://search.yahoo.com/mrss/');  $title = $media->group->title;
    13.  
    14.   // Get the duration in minutes and seconds, and then format it
    15.   $yt = $media->children('http://gdata.youtube.com/schemas/2007');  $attrs = $yt->duration->attributes();  $length_min = floor($attrs['seconds'] / 60);
    16.   $length_sec = $attrs['seconds'] % 60;
    17.   $length_formatted = $length_min . (($length_min != 1) ? ' minutes, ':' minute, ') .
    18.   $length_sec . (($length_sec != 1) ? ' seconds':' second');
    19.  
    20.   // Get the video URL
    21.   $attrs = $media->group->player->attributes();  $video_url = $attrs['url'];
    22.  
    23.   // Get the thumbnail image URL
    24.   $attrs = $media->group->thumbnail[0]->attributes();  $thumbnail_url = $attrs['url'];
    25.  
    26.   // Display the results for this entry
    27.   echo '<td style="vertical-align:bottom; text-align:center" width="' . (100 / NUM_VIDEOS) . '%"><a href="' . $video_url . '">' .
    28.   $title . '<br /><span style="font-size:smaller">' . $length_formatted . '</span><br /><img src="' . $thumbnail_url . '" /></a></td>';  }
    29.   echo '</tr></table>';
    30.   }
    31.   else {
    32.   echo '<p>Sorry, no videos were found.</p>';
    33.   } ?>
    Буду очень благодарен за конкретный ответ с кодом.
     
    #1 Drobotko Taras, 13 окт 2016
    Последнее редактирование модератором: 13 окт 2016
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Ты дочитал до 12 главы и не знаешь как исправить код?
    Надо тебе отладку освоить.

    отладка/debug
    http://phpfaq.ru/debug
    https://netbeans.org/kb/docs/php/debugging_ru.html
    https://php.ru/forum/threads/howto-...i-po-shagam-i-s-kartinkami.58974/#post-474550
     
    Drobotko Taras нравится это.
  3. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Я ознакомился с ссылками и настроил Netbeans и Xdebug. Теперь можна поставить вопрос конкретно: как правильно сформулировать YOUTUBE_URL (строка 1 файла youtube.php)? У меня в открытом окне браузера Firefox появились сообщения об ошибках:
    Warning: simplexml_load_file(http://gdata.youtube.com/feeds/api/users/aliensabductedme/favorites): failed to open stream: HTTP request failed! HTTP/1.0 410 Gone in /var/www/html/MyBlog/RSS/RSS/youtube.php on line6
    Warning: simplexml_load_file(): I/O warning : failed to load external entity &quot;http://gdata.youtube.com/feeds/api/users/aliensabductedme/favorites&quot; in /var/www/html/MyBlog/RSS/RSS/youtube.php on line6
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    На этот вопрос может ответить документация по youtube api, будут сложности с её поиском, пиши тут, поможем найти
     
    Drobotko Taras нравится это.
  5. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Я ознакомился с https://developers.google.com/youtube/v3/guides/implementation/favorites и изменил YOUTUBE_URL на https://developers.google.com/apis-...s.list?part=contentDetails&forUsername=Google' . Но появляются следующие сообщения в окне браузера при тестировании на локалхосте: Екран-1.png
    Предполагаю, что проблема в имени заданного URL. Но как правильно сформулировать, не знаю. На что мне обратить внимание?
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ругается на содержание, что там гугл возвращает такого? давай посмотрим
    --- Добавлено ---
    я кликнул по ссылки, возможно там данные в JSON приходят, но ты всё равно посмотри, а ximple_xml_load_file() работает с XML, надо json_decode использовать, если там JSON.
     
  7. StDies

    StDies Новичок

    С нами с:
    13 апр 2017
    Сообщения:
    2
    Симпатии:
    0
    Подскажите, пожалуйста, Вы решили данную проблему? А то у меня такое же, и никак не могу разобраться...
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Во-первых, у гугла есть php-sdk для Youtube API, там всё очень просто, правда тащит 20 МБайт с собой всякой хрени по зависимостям. В проекте, где это было для меня неприемлемо, навоял простенький класс, но там только поиск по запросу. И да, там json, а не XML. Читай текущую доку от гугла, по ходу в книге рассмотрена какая-то старая версия API.
     
  9. StDies

    StDies Новичок

    С нами с:
    13 апр 2017
    Сообщения:
    2
    Симпатии:
    0
    Понял. Спасибо, за ответ.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да, ты читал невнимательно доку по API. Запрос должен быть таким:
    Код (Text):
    1. GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails%2Cstatus&playlistId=FLK8sQmJBp8GCxrOtXWBpyEA&key={YOUR_API_KEY}
    Тот запрос, что ты привёл - это google-исполнялка тестовых запросов.
    --- Добавлено ---
    {YOUR_API_KEY} заменить на полученный в консоли google ключ, плюс в аккаунте должно быть включено youtube API
    --- Добавлено ---
    Ну и playlistId свой подставить, естественно
     
  11. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
  12. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Да, я нашёл решение. А зараз вспомнил о данной проблеме. Может быть, кто-то проанализировал данное решение, не наступит на мои "грабли".
    PHP:
    1. <?php>
    2. $list=PLWZ2nof_PR9tSPoYCL7cpSd5cDTv09yPg; //тут в переменной id плейлиста;
    3. define('YOUTUBE_URL', 'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet,contentDetails&playlistId=PLWZ2nof_PR9tSPoYCL7cpSd5cDTv09yPg&maxResults=2&key=тут прописываете свой API ключ');
    4. define('NUM_VIDEOS', 2);
    5. $data = file_get_contents(YOUTUBE_URL);
    6. $json = json_decode($data); // поскольку данные в json приходят, нужно использовать json_decode;
    7. //$num_videos_found = $json->totalReults;
    8.   if (NUM_VIDEOS > 0) {
    9.   echo '<table><tr>';
    10.   for ($i = 0; $i <= NUM_VIDEOS; $i++) {
    11.   $duration = $json->items[$i]->contentDetails->duration;
    12. $title=$json->items[$i]->snippet->title;
    13. $thumbnail_url = $json->items[$i]->snippet->thumbnails->medium->url;
    14. $id= $json->items[$i]->snippet->resourceId->videoId;
    15. $video_url='https://youtu.be/' . $id . '?list=' . $list;
    16. $durationText = array("PT", "H", "M", "S");
    17. $Change  = array("",  ":", ":", "");
    18. $time = str_replace($durationText, $Change, $duration);  // c помощью str_replace убираю символы "PT", "H", "M", "S", чтобы время продолжительности видео виводилось без них, и заменяю на то, что в массиве $Change между "";
    19. echo '<td style="vertical-align:bottom; text-align:center" width="' . (100 / NUM_VIDEOS) . '%"><a href="' . $video_url . '">' .
    20.   $title . '<br /><span style="font-size:smaller">' . $time . '</span><br /><img src="' . $thumbnail_url . '" /></a></td>';
    21.   }
    22.   echo '</tr></table>';
    23.   }
    24.   else {
    25.   echo '<p>Sorry, no videos were found.</p>';
    26.   }
    27. ?>
    Чтобы создать плейлист, в ютубе заходжу по ссилке My channel, далее Video Manager, потом Playlists, нажимаю New playlist. Когда плейлист доданный, нажимаю мишкою на картинку с видео плейлиста, попадаю на страницу youtube с видео мого плейлиста. Сверху, где строка url, копирую то, что идет после "https://www.youtube.com/watch?v=". Это id мого плейлиста.
    Важный момент. Нужно вбить ваш YOUTUBE_URL в поисковую строку браузера, что сверху, и внимательно проанализировать данные, что появлятся в результате запроса. Исходя с их структуры (вложеность), строим, например, путь до $title=$json->items[$i]->snippet->title. Начинаем цепочку с $json. Её можно построить только после применения функции json_decode($data).
     
  13. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @Drobotko Taras, нормас. А можно просто использовать класс, который я дал выше. Делает вообще всё, что нужно. И тебе даже думать не надо, как он это делает
     
  14. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Я исполнил команду $ composer require madcoda/php-youtube-api:^1.2 в командной строке, открытой в моём проекте, madcoda/php-youtube-api (v1.2.1) установилось. Я прописал в /var/www/html/MyBlog/RSS/RSS/youtube.php :
    PHP:
    1. require 'vendor/autoload.php';
    2. use Madcoda\Youtube;
    3. $youtube = new Youtube(array('key' => '/* Your API key here */'));
    Мне видало при запуске данного файла:
    Fatal error: Call to undefined function Madcoda\Youtube\curl_init() in /var/www/html/MyBlog/RSS/RSS/vendor/madcoda/php-youtube-api/src/Youtube.php on line589
    На что мне обратить внимание?
     
  15. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    Curl установлен? Раскомменчен?
    в файле php.ini
    ;extension=php_curl.dll
    убрать точку с запятой
     
    Drobotko Taras нравится это.
  16. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Спасибо. Я встановливал Curl. Пишет: "Вже встановлена найновіша версія curl". в файле php.ini виражения ;extension=php_curl.dll нет, прописал вручну, расскоментировал. Но, к сожалению, по прежнему виводится уведомление об ошибке (скриншот ниже).
     

    Вложения:

    • Екран.png
      Екран.png
      Размер файла:
      87,8 КБ
      Просмотров:
      5
  17. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @Drobotko Taras, о, у тебя линукс. как-то провтыкал этот момент.
    в линуксе вместо extension=php_curl.dll надо раскомментить
    extension=curl.so
     
  18. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Сработало, даже когда прописал в php.ini: "extension=php_curl.dll". Просто надо было перезапустить apache.
     
  19. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Читаем дальше. https://github.com/madcoda/php-youtube-api/wiki/api-reference
    Единственное, тут не реализована функция API для определения Id плейлиста избранного, но тут можно или расширить класс, или для своего канала один раз посмотреть через исполнялку API от google
     
    Drobotko Taras нравится это.
  21. Drobotko Taras

    Drobotko Taras Активный пользователь

    С нами с:
    13 окт 2016
    Сообщения:
    30
    Симпатии:
    1
    Как можно расширить клас в данном случае? Приведите пример, пожалуйста.
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Посмотрел невнимательно. Есть там нужная функция
    https://developers.google.com/youtube/v3/guides/implementation/favorites
    Пробовать надо, а мне пока без надобности
     
    Drobotko Taras нравится это.