Введение
Этот документ предназначен для разработчиков, которые хотят создавать приложения, взаимодействующие с YouTube. В нем объясняются основные понятия YouTube и самого API. В нем также приводится обзор различных функций, поддерживаемых API.
Подготовка
-
Чтобы получить доступ к консоли Google Cloud, запросить ключ API и зарегистрировать приложение, вам понадобится аккаунт Google.
-
Создайте проект в Google Developers Console и получите учетные данные для авторизации, чтобы ваше приложение могло отправлять запросы к API.
-
После создания проекта убедитесь, что YouTube Data API входит в список сервисов, которые может использовать ваше приложение.
- Откройте Cloud Console и выберите проект, который вы только что зарегистрировали.
- Откройте страницу включенных API. Убедитесь, что YouTube Data API есть в списке включенных API. Если нет, откройте библиотеку API и включите его.
-
Если в приложении используются методы API, требующие авторизации пользователя, прочитайте руководство по аутентификации, чтобы узнать, как реализовать авторизацию OAuth 2.0.
-
Выберите клиентскую библиотеку, чтобы упростить интеграцию API.
-
Ознакомьтесь с основными концепциями формата данных JSON (JavaScript Object Notation). JSON – это общедоступный формат данных, совместимый со всеми языками и позволяющий получать данные любой структуры в простом текстовом представлении. Подробную информацию см. на веб-сайте json.org.
Ресурсы и типы ресурсов
Ресурс – это отдельная сущность данных с уникальным идентификатором. В таблице ниже описаны разные типы ресурсов, с которыми можно взаимодействовать с помощью API.
| Ресурсы | |
|---|---|
activity |
Содержит информацию о действии, которое определенный пользователь совершил на сайте YouTube. В фиде действий показываются, например, оценки видео, публикации на канале, добавление видео в избранное и отправка видео другим пользователям. |
channel |
Содержит информацию об одном канале YouTube. |
channelBanner |
URL, который используется для того, чтобы задать загруженное изображение в качестве баннера канала. |
channelSection |
Содержит информацию о наборе видео, которые канал выбрал для показа. Например, в раздел можно добавить последние или самые популярные видео, а также ролики из одного или нескольких плейлистов. |
guideCategory |
Категория, к которой YouTube относит канал на основе его контента или других показателей, например популярности. Категории в руководстве помогают пользователям YouTube находить нужный контент. Канал может быть связан с одной или несколькими категориями, но это не гарантируется. |
i18nLanguage |
Определяет язык приложения, который поддерживается сайтом YouTube. Язык приложения также может называться языком интерфейса. |
i18nRegion |
Определяет географический регион, который пользователь YouTube может выбрать в качестве предпочтительного региона контента. Регион контента также может называться языковым стандартом контента. |
playlist |
Представляет один плейлист YouTube. Плейлист – это подборка видео, которые можно смотреть по очереди и которыми можно делиться с другими пользователями. |
playlistItem |
Идентифицирует ресурс, например видео, входящий в плейлист. Ресурс playlistItem также содержит сведения о том, как включенный ресурс используется в плейлисте. |
search result |
Содержит информацию о видео, канале или плейлисте YouTube, который соответствует параметрам поиска, указанным в запросе к API. Результат поиска указывает на уникальный идентифицируемый ресурс, например видео, но сам по себе не содержит постоянных данных. |
subscription |
Содержит информацию о подписке пользователя YouTube. Подписчики получают уведомления о новых видео на канале и о действиях других пользователей, например о загрузке видео, оценке или комментарии. |
thumbnail |
Определяет изображения значков, связанные с ресурсом. |
video |
Представляет собой одно видео на YouTube. |
videoCategory |
Определяет категорию, которая была или может быть связана с загруженными видео. |
watermark |
Идентификатор изображения, которое показывается во время воспроизведения видео с определенного канала. Владелец канала также может указать целевой канал, на который будет вести ссылка, и задать время показа логотипа. |
Обратите внимание, что во многих случаях ресурс содержит ссылки на другие ресурсы. Например, свойство snippet.resourceId.videoId ресурса playlistItem идентифицирует ресурс видео, который, в свою очередь, содержит полную информацию о видео. Другой пример: результат поиска содержит свойство videoId, playlistId или channelId, которое идентифицирует определенное видео, плейлист или канал.
Поддерживаемые операции
В таблице ниже приведены наиболее распространенные методы, поддерживаемые API. Некоторые ресурсы также поддерживают другие методы, которые выполняют функции, более специфичные для этих ресурсов. Например, метод videos.rate связывает оценку пользователя с видео, а метод thumbnails.set загружает на YouTube значок видео и связывает его с видео.
| Операции | |
|---|---|
list |
Получает (GET) список ресурсов (от нуля и более). |
insert |
Создает (POST) новый ресурс. |
update |
Изменяет (PUT) существующий ресурс, чтобы отразить данные в запросе. |
delete |
Удаляет (DELETE) определенный ресурс. |
В настоящее время API поддерживает методы для получения списка всех поддерживаемых типов ресурсов, а также операции записи для многих ресурсов.
В таблице ниже перечислены операции, поддерживаемые для разных типов ресурсов. Для операций, которые добавляют, обновляют или удаляют ресурсы, всегда требуется авторизация пользователя. В некоторых случаях методы list поддерживают как авторизованные, так и неавторизованные запросы. При этом неавторизованные запросы позволяют получать только общедоступные данные, а авторизованные – также информацию о текущем аутентифицированном пользователе или его личные данные.
| Поддерживаемые операции | ||||
|---|---|---|---|---|
| list | insert | update | delete | |
activity |
||||
caption |
||||
channel |
||||
channelBanner |
||||
channelSection |
||||
comment |
||||
commentThread |
||||
guideCategory |
||||
i18nLanguage |
||||
i18nRegion |
||||
playlist |
||||
playlistItem |
||||
search result |
||||
subscription |
||||
thumbnail |
||||
video |
||||
videoCategory |
||||
watermark |
||||
Расход квоты
Для YouTube Data API установлена квота, которая позволяет гарантировать, что разработчики используют сервис по назначению и не создают приложения, которые снижают качество сервиса или ограничивают доступ к нему для других пользователей. За все запросы к API, в том числе недействительные, взимается плата в размере не менее одного балла квоты. Квоту, доступную для вашего приложения, можно посмотреть в API Console.
Проекты, в которых включен YouTube Data API, по умолчанию имеют квоту в 100 вызовов search.list,100 вызовов videos.insert и 10 000 единиц в день для всех остальных конечных точек. Квота по умолчанию, которая может быть изменена, помогает нам оптимизировать распределение квот и масштабировать инфраструктуру так, чтобы это было удобно пользователям API. Данные об использовании квоты представлены на странице Quotas (Квоты) в API Console.
Примечание. Если вы достигнете лимита квоты, то можете запросить ее увеличение, заполнив форму запроса на увеличение квоты для сервисов YouTube API.
Расчет использования квоты
Google рассчитывает использование вашей квоты, присваивая каждому запросу определенную стоимость. Разные типы операций имеют разную стоимость квоты. Пример:
- Операция чтения, которая извлекает список ресурсов (каналов, видео, плейлистов), обычно стоит 1 единицу.
- Операция записи, которая создает, обновляет или удаляет ресурс, обычно стоит
50единиц. - Поисковый запрос стоит
1единицу. - Загрузка видео стоит
1единицы.
В таблице Стоимость квоты для запросов к API указана стоимость квоты для каждого метода API. Приведенные ниже правила помогут вам оценить, сколько запросов ваше приложение может отправлять в день, не превышая квоту.
Частичные ресурсы
API позволяет и даже требует извлекать частичные ресурсы, чтобы приложения не передавали, не анализировали и не хранили ненужные данные. Это также позволяет API более эффективно использовать ресурсы сети, CPU и памяти.
API поддерживает два параметра запроса, которые описаны в следующих разделах. Они позволяют указать свойства ресурса, которые должны быть включены в ответы API.
- Параметр
partопределяет группы свойств, которые должны быть возвращены для ресурса. - Параметр
fieldsпозволяет отфильтровать ответ API, чтобы в нем были только определенные свойства в запрошенных частях ресурса.
Как использовать параметр part
Параметр part является обязательным для любого запроса к API, который извлекает или возвращает ресурс. Этот параметр определяет одно или несколько свойств ресурса верхнего уровня (не вложенных), которые должны быть включены в ответ API. Например, ресурс video состоит из следующих частей:
snippetcontentDetailsfileDetailsplayerprocessingDetailsrecordingDetailsstatisticsstatussuggestionstopicDetails
Все эти части являются объектами, содержащими вложенные свойства. Их можно рассматривать как группы полей метаданных, которые сервер API может (или не может) извлечь. Поэтому в параметре part нужно выбрать компоненты ресурса, которые действительно используются в приложении. Это требование необходимо по двум причинам:
- Это позволяет сократить задержку, поскольку серверу API не приходится тратить время на извлечение полей метаданных, которые не используются в вашем приложении.
- Это позволяет снизить нагрузку на сеть за счет уменьшения или полного исключения ненужных данных, которые может получать приложение.
Со временем, когда в ресурсах будет появляться больше частей, эти преимущества будут только расти, поскольку ваше приложение не будет запрашивать новые свойства, которые оно не поддерживает.
Как использовать параметр fields
Параметр fields фильтрует ответ API, который содержит только части ресурса, указанные в значении параметра part, поэтому ответ включает только определенный набор полей. Параметр fields позволяет удалить вложенные свойства из ответа API и тем самым сократить использование пропускной способности. (Параметр part нельзя использовать, чтобы отфильтровать вложенные свойства из ответа.)
Ниже приведены правила, описывающие поддерживаемый синтаксис для значения параметра fields, который частично основан на синтаксисе XPath.
- Чтобы выбрать несколько полей, перечислите их через запятую (
fields=a,b). - Используйте звездочку (
fields=*) в качестве подстановочного знака, чтобы указать все поля. - Используйте круглые скобки (
fields=a(b,c)), чтобы указать группу вложенных свойств, которые будут включены в ответ API. - Для обозначения вложенного свойства используйте косую черту (
fields=a/b).
На практике эти правила часто позволяют использовать несколько разных значений параметра fields для получения одного и того же ответа API. Например, если вы хотите получить идентификатор, название и позицию каждого элемента плейлиста, можно использовать следующие значения:
fields=items/id,playlistItems/snippet/title,playlistItems/snippet/positionfields=items(id,snippet/title,snippet/position)fields=items(id,snippet(title,position))
Примечание. Как и все остальные значения параметров запроса, значение fields должно быть закодировано. В целях наглядности в приведенных здесь примерах кодировка не используется.
Примеры частичных запросов
В примерах ниже показано, как использовать параметры part и fields, чтобы ответы API содержали только те данные, которые используются в вашем приложении.
- В примере 1 возвращается видеоресурс, который включает четыре части, а также свойства
kindиetag. - Во втором примере возвращается ресурс video, который включает две части, а также свойства
kindиetag. - В примере 3 возвращается ресурс video, который включает две части, но не содержит свойства
kindиetag. - В примере 4 возвращается ресурс видео, который включает две части, но исключает
kindиetag, а также некоторые вложенные свойства в объектеsnippetресурса.
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,contentDetails,statistics,status Description: This example retrieves avideoresource and identifies several resource parts that should be included in the API response. API response:{ "kind": "youtube#videoListResponse", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\"", "videos": [ { "id": "7lCDEYXw3mM", "kind": "youtube#video", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\"", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "contentDetails": { "duration": "PT15M51S", "aspectRatio": "RATIO_16_9" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" }, "status": { "uploadStatus": "STATUS_PROCESSED", "privacyStatus": "PRIVACY_PUBLIC" } } ] }
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,statistics Description: This example modifies thepartparameter value so that thecontentDetailsandstatusproperties are not included in the response. API response:{ "kind": "youtube#videoListResponse", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/sDAlsG9NGKfr6v5AlPZKSEZdtqA\"", "videos": [ { "id": "7lCDEYXw3mM", "kind": "youtube#video", "etag": "\"UCBpFjp2h75_b92t44sqraUcyu0/iYynQR8AtacsFUwWmrVaw4Smb_Q\"", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&part=snippet,statistics&fields=items(id,snippet,statistics) Description: This example adds thefieldsparameter to remove allkindandetagproperties from the API response. API response:{ "videos": [ { "id": "7lCDEYXw3mM", "snippet": { "publishedAt": "2012-06-20T22:45:24.000Z", "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "description": "Antonio Fuentes speaks to us and takes questions on working with Google APIs and OAuth 2.0.", "thumbnails": { "default": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/default.jpg" }, "medium": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/mqdefault.jpg" }, "high": { "url": "https://i.ytimg.com/vi/7lCDEYXw3mM/hqdefault.jpg" } }, "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }
URL: https://www.googleapis.com/youtube/v3/videos?id=7lCDEYXw3mM&key=YOUR_API_KEY
&fields=items(id,snippet(channelId,title,categoryId),statistics)&part=snippet,statistics Description: This example modifies thefieldsparameter from example 3 so that in the API response, each video resource'ssnippetobject only includes thechannelId,title, andcategoryIdproperties. API response:{ "videos": [ { "id": "7lCDEYXw3mM", "snippet": { "channelId": "UC_x5XG1OV2P6uZZ5FSM9Ttw", "title": "Google I/O 101: Q&A On Using Google APIs", "categoryId": "28" }, "statistics": { "viewCount": "3057", "likeCount": "25", "dislikeCount": "0", "favoriteCount": "17", "commentCount": "12" } } ] }
Как оптимизировать эффективность
Использование ETag
ETags – это стандартная часть протокола HTTP, которая позволяет приложениям ссылаться на определенную версию ресурса API. Ресурсом может быть весь фид или его элемент. Эта функция поддерживает следующие варианты использования:
-
Кеширование и условное извлечение. Приложение может кешировать ресурсы API и их ETag. Когда приложение снова запрашивает сохраненный ресурс, оно указывает ETag, связанный с этим ресурсом. Если ресурс был изменен, API возвращает измененный ресурс и тег ETag, связанный с этой версией ресурса. Если ресурс не изменился, API возвращает ответ HTTP 304 (
Not Modified), который указывает, что ресурс не изменился. Приложение может снизить задержку и потребление трафика, используя кешированные ресурсы.Клиентские библиотеки для API Google поддерживают теги ETag по-разному. Например, клиентская библиотека JavaScript поддерживает теги ETag через белый список разрешенных заголовков запросов, в который входят
If-MatchиIf-None-Match. Белый список позволяет использовать стандартное кеширование в браузере. Если ETag ресурса не изменился, ресурс может быть загружен из кеша браузера. Клиент Obj-C, напротив, не поддерживает теги ETag. -
Защита от случайной перезаписи изменений. Теги ETag помогают предотвратить случайную перезапись изменений, внесенных разными API-клиентами. При обновлении или удалении ресурса приложение может указать тег ETag ресурса. Если ETag не соответствует последней версии ресурса, запрос к API не выполняется.
Использование тегов ETag в приложении дает несколько преимуществ:
- API быстрее отвечает на запросы кешированных, но не измененных ресурсов, что позволяет снизить задержку и расход трафика.
- Ваше приложение не сможет случайно перезаписать изменения ресурса, внесенные другим API-клиентом.
Google APIs Client Library for JavaScript поддерживает заголовки HTTP-запросов If-Match и If-None-Match, что позволяет использовать ETag в контексте обычного кеширования в браузере.
Использование GZIP
Вы также можете уменьшить объем ответов API, включив сжатие GZIP. На распаковку ответов API требуется дополнительное процессорное время, однако экономия сетевых ресурсов того стоит.
Чтобы получить ответ в архиве GZIP, необходимо:
- Установите для заголовка HTTP-запроса
Accept-Encodingзначениеgzip. - Добавьте в агент пользователя строку
gzip.
Пример правильного оформления заголовков HTTP, которое обеспечивает сжатие GZIP, приведен ниже.
Accept-Encoding: gzip User-Agent: my program (gzip)