
Способы работы с данным API есть разные. Если необходимо всего лишь получить данные какого-то видео, то можно обойтись функцией file_get_contents, например:
$video_id = '0KSOMA3QBU0'; $api_key = 'AIzaSyB7oqNYxEGnskHEpKHSCbIH_-VI4_sJkzg'; $json_result = file_get_contents ("https://www.googleapis.com/youtube/v3/videos?part=snippet&id=$video_id&key=$api_key"); var_dump(json_decode($json_result));
Можно использовать curl. Ну а если API используется по-полной, то стоит установить специальное расширение, о котором ниже.
Из данного примера видно, что для идентификации отдельного видео, API нужно передать id этого видео ($video_id), который можно увидеть в адресной строке YouToube при просмотре видео. Вторым параметром, который нужен для работы с API это ключ ($api_key). Его нужно предварительно получить. Для этого регистрируемся по ссылке.
После регистрации откроется список где надо найти блок с YouTube Data API v3 и включить использование API.
Ответ получаем в формате json, поэтому нужно сначала декодировать функцией json_decode(). Таким образом мы получаем обычный объект с разными свойствами. Например получим название видео и дату публикации:
$json_result = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=snippet&id=$video_id&key=$api_key"); $obj = json_decode($json_result); $title = $obj->items[0]->snippet->title; //название видео $date = $obj->items[0]->snippet->publishedAt; //дата публикации
Получим определенную статистику по видео:
$json_result = file_get_contents("https://www.googleapis.com/youtube/v3/videos?part=statistics&id=$video_id&key=$api_key"); $obj = json_decode($json_result); $views = $obj->items[0]->statistics->viewCount; //количество просмотров $likes = $obj->items[0]->statistics->likeCount; //лайки $dislikes = $obj->items[0]->statistics->dislikeCount; //дизлайки
Справочник по работе API с видео:
https://developers.google.com/youtube/v3/docs/videos
Примеры на php:
https://developers.google.com/youtube/v3/code_samples/php
Как видно из примеров, работать таким образом не очень удобно, т.к. существует большая вложенность массивов и свойств. Кроме того, в примере показано только получение информации по одному видео, а часто нужно отобрать ряд видео по определенным признакам и обработать их.
Для удобства работы с API существует специальное расширение. Устанавливается оно с помощью Composer согласно указаниям по ссылке
composer require google/apiclient:^2.0
Базовое использование API касательно именно работы с YouTube тут.
В зависимости от того какие действия с видео или их данными из YouTube вы хотите выполнять, можно написать свой класс, реализующий нужный функционал. Проект, о котором я писал, был на php-фреймворке Laravel-5, но в качестве ориентира набросаю универсальный класс для работы с расширением.
<?php class YouTubeVideo { public $id; //id видео private $apiKey = 'ВАШ КЛЮЧ'; private $youtube; public function __construct() { $client = new Google_Client(); $client->setDeveloperKey($this->apiKey); $this->youtube = new Google_Service_YouTube($client); } /* * Получение данных видео по их id */ public function videosByIds( string $ids) { return $this->youtube->videos->listVideos('snippet, statistics, contentDetails', [ 'id' => $ids, ]); } /** * Получение списка популярных видео (данные - snippet и statistics) */ public function videos(int $maxResults=10, string $region='RU') { return $this->youtube->videos->listVideos('snippet, statistics, contentDetails', [ 'chart' => 'mostPopular', 'maxResults' => $maxResults, 'regionCode' => $region, ]); } /** * Поиск видео по фразе */ public function search(string $q, int $maxResults=12, string $lang='ru' ){ $response = $this->youtube->search->listSearch('snippet', array( 'q' => $q, 'maxResults' => $maxResults, 'relevanceLanguage' => $lang, 'type' => 'video' )); return $response; } /** Получить список категорий видео с YouTube * https://developers.google.com/youtube/v3/docs/videoCategories * Возвращает массив с id категорий */ public function getCategory($regionCode = 'RU'){ $result = $this->youtube->videoCategories->listVideoCategories('snippet', array('hl' => 'ru', 'regionCode' => $regionCode)); $category = []; $array = $result->getItems(); //масиив объектов Google_Service_YouTube_VideoCategory array_walk($array, function ($value) use (&$category){ $category[$value['id']] = $value['snippet']['title']; }); return $category; } /** * Поиск самых популярных видео по указанной категории */ public function getPopularVideosByCategory( string $videoCategoryId, int $maxResults=10, string $region='RU', $pageToken=null){ try { $response = $this->youtube->videos->listVideos('snippet, statistics, contentDetails', array('videoCategoryId' => $videoCategoryId, 'maxResults' => $maxResults, 'regionCode' => $region, 'chart' => 'mostPopular', 'pageToken' => $pageToken, )); } catch (\Google_Service_Exception $e){ return false; } return $response; //массив объектов Google_Service_YouTube_Video } }
Названия методов и их аргументов повторяют названия указанные в документации. Так же, список методов и аргументов для работы, можно смотреть в классах самого расширения, где все подробно расписано.
Откроем ссылку https://developers.google.com/youtube/v3/docs/videos.
В таблице «Properties» можно увидеть в перечне элементы типа
snippet, player, contentDetails, statistics, status
В зависимости от того какие данные вы хотите получить в ответе указываем их при выборке. Чаще всего будете включать snippet для получения основных данных по видео.
Например:
public function videos(int $maxResults=10) { return $this->youtube->videos->listVideos('snippet, statistics', ['chart' => 'mostPopular', 'maxResults' => $maxResults]); }тут включены snippet и statistics.
Первый параметр, который передаётся в listVideos называется part и в нём определяется информация, которая будет содержаться в результате. Вы можете указать ключ statistics для получения количества голосов, лайков и так далее. О других ключах, которые можно указать читайте в документации.
Во втором параметре следует указать фильтр. В данном случае я хочу получить список самых популярных видеороликов.
Пример использования.
Создаем объект для работы.
$video = new YouTubeVideo();
Попробуем получить данные какого-то отдельного видео по его id.
$dataById = $video->videosByIds('FBnAZnfNB6U');Результат выполнения - объект Google_Service_YouTube_VideoListResponse

Этот объект содержит массив найденных видео (или только одного заданного) с их данными. Расширение так же предоставляет функционал для доступа к массивам объектов и данным. Например получим массив объектов Google_Service_YouTube_Video из которого уже можно извлекать данные непосредственно:
$dataById->getItems()
Для того, чтобы вытащить только нужные вам данные в нужном формате придется написать еще пару функций/методов. Определить их можно в нужном контроллере.
Например, метод формирующий массив данных по каждому отдельному видео:
/* * Вынимает нужные данные из массива объектов видео. * Массив объектов получаем вызовом метода getItems() у Google_Service_YouTube_VideoListResponse */ public function getDataVideo(array $videos){ $dataset = []; array_walk($videos, function ($value) use (&$dataset){ $dataset[] = [ 'id' => $value->toSimpleObject()->id, 'title' => $value->toSimpleObject()->snippet['title'], 'thumbnails' => [ 'default' => $value->toSimpleObject()->snippet['thumbnails']['default']['url'], 'medium' => $value->toSimpleObject()->snippet['thumbnails']['medium']['url'], ], 'viewCount' => $value->toSimpleObject()->statistics['viewCount'] ?? '-', 'duration' => $this->timeFormatting($value->toSimpleObject()->contentDetails['duration']) ]; }); return $dataset; }
В данном случае массив будет содержать id видео, заголовок, ссылки на 2 изображения-миниатюры (малого и среднего формата), кол-во просмотров и длительность. Касательно последнего привожу отдельно метод, т.к. API возвращает его значение в специфическом формате.
//форматирует время ролика в формат 00:00:00 public function timeFormatting($duration){ $interval = new \DateInterval($duration); $seconds = $interval->days * 86400 + $interval->h * 3600 + $interval->i * 60 + $interval->s; $time = gmdate("H:i:s", $seconds); return $time; }
Таки образом, чтобы получить желаемый массив данных для последующего их вывода пользователю выполняем:
$videos_date = $this->getDataVideo($dataById->getItems());
Теперь $videos_date содержит массив с данными каждого(или одного конкретного) видео.
Согласно данной строки кода, вызов осуществляется из того же класса, где эти, вспомогательные, методы определены. Например из контроллера.
Аналогично используем другие функции, например поиск видео по заданной фразе:
$dataBySearch = $video->search('космос');результат так же передаем в метод getDataVideo() для формирования массива данных.
В YouTube все видео принадлежат определенной категории, возможно нескольким. При этом учтите, что для различных стран определенные категории могут быть недоступны. Метод для получения списка всех существующих категорий я привел.
Еще стоит упомянуть, что многие методы расширения позволяют указать код страны по которой нужно отбирать видео. Таким образом, например, получая видео из категории «Фильмы и анимация» для каждой страны будут отбираться отдельные видео, к примеру, ранее транслируемые их национальными телеканалами. Т.е. контент для пользователей из разных стран будет отличаться. Эту возможность стоит использовать. В своем проекте я сделал автоматическое определение страны посетителя сайта на основе его IP используя php расширение geoip2, о котором я писал тут: http://klisl.com/GeoIP.html
Что дает нам использование расширения google/apiclient?!! Прежде всего удобство использования и взаимодействие с API с помощью ООП. GET запрос:
https://www.googleapis.com/youtube/v3/videos
соответствует вызову:
$this->youtube->videos
Кроме того вам не нужно декодировать JSON формат вручную и удобно обращаться к нужным свойствам объекта.
Для непосредственного воспроизведения видео на странице сайта можно использовать как обычный iframe настроив нужным образом его параметры (панель инструментов, автовоспроизведение, вывод инфо о видео…):
<iframe src="https://www.youtube.com/embed/FBnAZnfNB6U?modestbranding=1;rel=0;controls=1;showinfo=0;autoplay=1;iv_load_policy=3" frameborder="0" allowfullscreen></iframe>Так и использовать API Iframe которое использует JavaScript для более тонкой настройки параметров. Подробнее об этом тут.
Вывод видео, для красоты можно сделать в всплывающем окне: http://video.klisl.com/id=FBnAZnfNB6U
В данном случае используется Magnific Popup - jQuery плагин.
Когда-то, в свое время, тоже писал плагин для Laravel, но там было попроще, - использовался для вывода и отображения видео, по готовой ссылки с ютуба, с разными настройками: размер, бутстрап-классы, звук, пропорции,,..