В этой статье, состоящей из двух частей, мы узнаем, как работать с версией 3 API YouTube, и на этом пути мы создадим демонстрацию. Давайте начнем.
Что мы строим
Мы собираемся создать демонстрационную версию, которая позволит пользователю просматривать популярные видео на YouTube, искать видео, просматривать видео по категориям и выбирать видео для просмотра.
Я буду использовать Laravel 5 в качестве своего предпочтительного фреймворка и Vagrant для своей среды разработки. Конечный продукт будет выглядеть примерно так:
Подготовка проекта
После установки Laravel 5 на свой компьютер установите google/apiclient
:
composer require google/apiclient
Чтобы настроить новый проект на консоли разработчика Google, ознакомьтесь с этим кратким советом, чтобы начать работу.
Регистрация переменных среды
После получения наших учетных данных из консоли разработчиков Google нам необходимо зарегистрировать их в нашем приложении.
// .env APP_DEBUG=true app_name='Your app name (optional)' client_id='Your client id' client_secret='Your client secret' api_key='Your developer key'
// config/google.php return [ 'app_name' => env('app_name'), 'client_id' => env('client_id'), 'client_secret' => env('client_secret'), 'api_key' => env('api_key') ];
Laravel автоматически загружает переменные среды из файла .env
в корне папки нашего приложения. Теперь, когда мы настроили нашу конфигурацию, мы можем начать процесс входа в систему.
Вход и Авторизация
Прежде чем войти в систему с помощью API Google, нам нужно поговорить о областях и их важности для процесса авторизации.
Области применения
Области определяют уровень авторизации, предоставляемой приложению, поэтому обязательно запрашивайте только то, что вам нужно. API YouTube имеет четыре области действия:
-
https://www.googleapis.com/auth/youtube
: управляйте своей учетной записью YouTube. -
https://www.googleapis.com/auth/youtube.readonly
: просмотр учетной записи YouTube. -
https://www.googleapis.com/auth/youtube.upload
: загружайте видео с YouTube и управляйте своими видео на YouTube. -
https://www.googleapis.com/auth/youtubepartner-channel-audit
: получить часть AuditDetails в ресурсе канала.
Для нашей демонстрации я собираюсь использовать только первую, и мы можем расширить ее в зависимости от потребностей нашего приложения. Подробнее об авторизации вы можете прочитать в документации .
// app/Services/GoogleLogin.php namespace App\Services; class GoogleLogin { protected $client; public function __construct(\Google_Client $client) { $this->client = $client; $this->client->setClientId(\Config::get('google.client_id')); $this->client->setClientSecret(\Config::get('google.client_secret')); $this->client->setDeveloperKey(\Config::get('google.api_key')); $this->client->setRedirectUri(\Config::get('app.url') . "/loginCallback"); $this->client->setScopes([ 'https://www.googleapis.com/auth/youtube', ]); $this->client->setAccessType('offline'); } public function isLoggedIn() { if (\Session::has('token')) { $this->client->setAccessToken(\Session::get('token')); } if ($this->client->isAccessTokenExpired()) { \Session::set('token', $this->client->getRefreshToken()); } return !$this->client->isAccessTokenExpired(); } public function login($code) { $this->client->authenticate($code); $token = $this->client->getAccessToken(); \Session::put('token', $token); return $token; } public function getLoginUrl() { $authUrl = $this->client->createAuthUrl(); return $authUrl; } }
После Google_Client
экземпляра Google_Client
с использованием наших учетных данных мы устанавливаем нужные области действия. Метод setAccessType
дает нашему приложению возможность обновить токен, когда пользователя нет.
Контроллер входа
// app/Http/routes.php Route::get('/login', ['uses' => 'GoogleLoginController@index', 'as' => 'login']); Route::get('/loginCallback', ['uses' => 'GoogleLoginController@store', 'as' => 'loginCallback']);
// app/Http/Controllers/GoogleLoginController.php class GoogleLoginController extends Controller { public function index(\App\Services\GoogleLogin $ga) { if ($ga->isLoggedIn()) { return \Redirect::to('/'); } $loginUrl = $ga->getLoginUrl(); return "<a href='{$loginUrl}'>login</a>"; } public function store(\App\Services\GoogleLogin $ga) { // User rejected the request if(\Input::has('error')){ dd(\Input::get('error')); } if (\Input::has('code')) { $code = \Input::get('code'); $ga->login($code); return \Redirect::to('/'); } else { throw new \InvalidArgumentException("Code attribute is missing."); }//else } }
Метод GoogleLoginController@index
проверит, вошел ли пользователь в систему и, если да, перенаправит его на домашнюю страницу. В противном случае мы генерируем новый URL для входа.
После прохождения фазы авторизации Google перенаправит пользователя на URL-адрес обратного вызова, определенный в консоли разработчика Google с параметром code. Этот код используется в обмен на токен.
Листинг видео
Класс Google_Service_YouTube
— это наша дверь в API YouTube. Он обеспечивает доступ ко всем данным YouTube. Класс принимает экземпляр Google_Client
в качестве параметра. Имеет смысл создать провайдера, связывающего нашу реализацию, чтобы нам не приходилось повторять один и тот же код везде. Вы можете прочитать больше о поставщиках услуг в документации .
php artisan make:provider YouTubeServiceProvider
Эта команда создаст новый класс в нашей папке app/Providers
. Нам нужно добавить нашего поставщика услуг в список поставщиков внутри config/app.php
.
// config/app.php 'providers' => [ 'App\Providers\YouTubeServiceProvider', ]
// app/Providers/YouTubeServiceProvider.php public function register() { $app = $this->app; $this->app->bind('GoogleClient', function () { $googleClient = new \Google_Client(); $googleClient->setAccessToken(\Session::get("token")); return $googleClient; }); $this->app->bind('youtube', function () use ($app) { $googleClient = \App::make('GoogleClient'); $youtube = new \Google_Service_YouTube($googleClient); return $youtube; }); }
Конечная точка https://www.googleapis.com/youtube/v3/videos
возвращает список видео, доступ к которому можно получить с помощью нашего класса YouTube через $youtube->videos
.
// app/Http/Controllers/YouTubeAPIController.php public function videos() { $youtube = \App::make('youtube'); $videos = $youtube->videos->listVideos('snippet', ['chart' => 'mostPopular']); dump($video); }
Первый параметр метода listVideos
называется part
и он определяет информацию, содержащуюся в результате. Вы можете добавить statistics
чтобы получить данные о количестве голосов, лайках и т. Д. Подробнее о параметре part
мы поговорим позже в этой статье. Подробнее о поддерживаемых значениях можно прочитать в документации .
Второй параметр должен содержать фильтр для видео. В этом случае мы получаем самые популярные видео на YouTube. Вы также можете запросить понравившиеся или не понравившиеся видео и т. Д. Вы можете узнать больше о фильтрах в документации .
// app/Http/Controllers/YouTubeAPIController.php public function videos() { $options = ['chart' => 'mostPopular', 'maxResults' => 16]; if (\Input::has('page')) { $options['pageToken'] = \Input::get('page'); } $youtube = \App::make('youtube'); $videos = $youtube->videos->listVideos('id, snippet', $options); return view('videos', ['videos' => $videos]); }
Этот метод говорит сам за себя. Параметр страницы предназначен для разбиения на страницы, как мы увидим далее.
// resources/views/videos.blade.php <ul class="list-unstyled video-list-thumbs row"> @foreach($videos as $video) <li class="col-lg-3 col-sm-4 col-xs-6"> <a href="http://youtube.com/watch?v={{ $video->getId() }}" title="{{ $video['snippet']['title'] }}" target="_blank"> <img src="{{ $video['snippet']['thumbnails']['medium']['url'] }}" alt="{{ $video['snippet']['title'] }}" /> <h2 class="truncate">{{ $video['snippet']['title'] }}</h2> </a> </li> @endforeach </ul> <ul class="pagination pagination-lg"> <li @if($videos->getPrevPageToken() == null) class="disabled" @endif> <a href="/videos?page={{$videos->getPrevPageToken()}}" aria-label="Previous"> <span aria-hidden="true">Previous «</span> </a> </li> <li @if($videos->getNextPageToken() == null) class="disabled" @endif> <a href="/videos?page={{$videos->getNextPageToken()}}" aria-label="Next"> <span aria-hidden="true">Next »</span> </a> </li> </ul>
Наш взгляд очень прост — мы выводим только заголовок видео, миниатюру и ссылку. Наш ответ API также содержит лайки, антипатии, количество просмотров и т. Д., Поэтому вы можете использовать их, чтобы обогатить свою страницу с помощью специальной разметки. Ссылки на страницы дают пользователю возможность перемещаться по видео. Возможно, вы заметили, что это делается с помощью токенов, а не обычного параметра страницы.
При нажатии на видео вы будете перенаправлены на просмотр видео на YouTube с использованием идентификатора. Почему бы не получить информацию о видео и создать страницу, содержащую проигрыватель вместе с дополнительной информацией о видео?
Одиночная страница видео
Получение одного видео — это всего лишь вопрос указания опции для той же конечной точки из ранее. Поскольку результатом является один элемент, мы устанавливаем для параметра maxResults
значение 1
и удаляем атрибут chart
поскольку он не имеет отношения к данному запросу.
// app/Http/routes.php Route::get('/video/{id}', ['uses' => 'YouTubeAPIController@video', 'as' => 'video']);
// app/Http/Controllers/YouTubeAPIController.php public function video($id){ $options = ['maxResults' => 1, 'id' => $id]; $youtube = \App::make('youtube'); $videos = $youtube->videos->listVideos('id, snippet, player, contentDetails, statistics, status', $options); if(count($videos->getItems()) == 0){ return redirect('404'); } return view('video', ['video' => $videos[0]]); }
Поскольку это страница с одним элементом, я попытался извлечь как можно больше информации, используя параметр part
. Если элемент не существует, мы перенаправляем пользователя на страницу 404
не найдена. В противном случае мы визуализируем наш вид первым элементом в списке.
// resources/views/video.blade.php <div class="row"> <h2>{{ $video["snippet"]["title"] }}</h2> </div> <div class="row"> <iframe type='text/html' src='http://www.youtube.com/embed/{{ $video->getId() }}' width='100%' height='500' frameborder='0' allowfullscreen='true'></iframe> </div> <div class="row"> (<span>{{ $video["statistics"]["likeCount"] }} <i class="glyphicon glyphicon-thumbs-up"></i></span>) (<span>{{ $video["statistics"]["dislikeCount"] }} <i class="glyphicon glyphicon-thumbs-down"></i></span>) (<span>{{ $video["statistics"]["favoriteCount"] }} <i class="glyphicon glyphicon-heart"></i></span>) (<span>{{ $video["statistics"]["commentCount"] }} <i class="glyphicon glyphicon-bullhorn"></i></span>) </div> <hr/> <div class="row"> <p>{{ $video["snippet"]["description"] }}</p> </div>
Поскольку мы запросили API YouTube для части player
, мы можем напрямую получить к нему доступ, используя $video['player']['embedHtml']
, но если вы хотите настроить размеры проигрывателя, вы можете создать его, используя идентификатор видео, как мы это делали в нашем примере.
Стоит отметить одну вещь: каждый запрос имеет стоимость одного звонка, а когда вы запрашиваете фрагмент, статистику и т. Д., Вы складываете новые расходы. Вы можете прочитать больше о квотах и стоимости в документации .
Завершение
В этой первой части мы представили API YouTube и создали небольшую демонстрацию для запроса списка самых популярных видео на YouTube со ссылками на страницы и страницей для просмотра одного видео. В следующей части мы будем изучать категории видео и функции поиска, так что следите за обновлениями. Вы можете проверить окончательный результат на Github , и если у вас есть какие-либо вопросы или комментарии, вы можете опубликовать их ниже.