Skip to content

Всё для WordPress, веб-разработки — и не только

📹 YouTube Data API v3: получение данных о видео через PHP (2026)

📹 YouTube Data API v3: получение данных о видео через PHP (2026)

Зачем парсить данные видео через API, если можно просто открыть страницу?

Ручной сбор информации о десятках видео, занятие на часы. Название, длительность, количество просмотров, дата публикации: копировать это вручную с YouTube, гарантированный путь к ошибкам и выгоранию.

YouTube Data API v3 решает проблему программно. Один HTTP-запрос, и вы получаете структурированный JSON с фрагментом (snippet), характеристиками контента (contentDetails) и статистикой. Никакого парсинга HTML, никаких капч.

В этом туториале: пошаговая инструкция от создания ключа API до готового PHP-скрипта, который вытаскивает информацию о любом видео YouTube по его URL. Код реальный, проверенный, с пояснением каждой строчки.

💡 Быстрый обзор:

  • Создаём API-ключ в Google Cloud Console и включаем YouTube Data API v3
  • Разбираем структуру эндпоинта /videos и его параметры part, id и key
  • Пишем PHP-функцию для извлечения ID видео из любой ссылки YouTube
  • Делаем запрос через file_get_contents() и парсим JSON-ответ
  • Обрабатываем ошибки: невалидный ключ, неверный ID, превышение квоты
  • Смотрим на альтернативу, готовую библиотеку madcoda/php-youtube-api

Шаг 1: Получение API-ключа YouTube Data API

Для работы с API нужен ключ. Вот кратчайший путь:

  • Откройте Google Cloud Console и создайте новый проект (или выберите существующий).
  • Перейдите в APIs & Services → Library, найдите «YouTube Data API v3» и нажмите Enable.
  • Зайдите в Credentials → Create Credentials → API Key.
  • (Рекомендуется) Ограничьте ключ: в разделе API restrictions выберите YouTube Data API v3, чтобы ключ не работал с другими сервисами Google.

Ключ выглядит как строка вроде AIzaSyD-... длиной 39 символов. Без него API вернёт ошибку 403.

Суточная квота, 10 000 единиц. Один запрос к /videos расходует 1 единицу. Для тестов и небольшого проекта этого более чем достаточно. Если планируете production-нагрузку, запросите повышение квоты в том же разделе Console.

Шаг 2: Эндпоинт API и его параметры

URL для получения информации о видео:

1GET https://www.googleapis.com/youtube/v3/videos

Параметры передаются как query string:

Параметр

Обязателен

Описание

part

Да

Список полей через запятую: snippet, contentDetails, statistics, status, topicDetails и др.

id

Да

ID видео YouTube (11 символов, например 1ejTKov_Sm4)

key

Да

Ваш API-ключ

hl

Нет

Язык текстовых полей (например, ru для русских названий)

maxResults

Нет

Количество результатов (1-50, по умолчанию 5)

Три основных значения part, которые покрывают большинство сценариев:

  • snippet, базовая информация: title, description, channelId, channelTitle, publishedAt, thumbnails (набор URL миниатюр разного разрешения), tags, categoryId.
  • contentDetails, характеристики: duration (в формате ISO 8601, например PT4M13S), dimension (2d/3d), definition (sd/hd), caption (есть ли субтитры).
  • statistics, числа: viewCount, likeCount, commentCount.

Важный нюанс: поле dislikeCount в statistics отключено с декабря 2021 года, API всегда возвращает 0. Поле favoriteCount также устарело (всегда 0 с августа 2015). Не опирайтесь на них в коде.

Шаг 3: Извлечение ID видео из URL

Прежде чем дёргать API, нужно вытащить ID видео из ссылки. У YouTube несколько форматов URL:

  • Стандартный: https://www.youtube.com/watch?v=1ejTKov_Sm4
  • Короткий: https://youtu.be/1ejTKov_Sm4
  • Embed: https://www.youtube.com/embed/1ejTKov_Sm4
  • С параметрами: https://www.youtube.com/watch?v=1ejTKov_Sm4&t=120

Под все эти варианты работает простая PHP-функция:

1/**
2 * Извлекает ID видео из URL YouTube.
3 * Поддерживает форматы: watch?v=, youtu.be/, /embed/
4 *
5 * @param string $url URL видео YouTube
6 * @return string|null ID видео (11 символов) или null при ошибке
7 */
8function getYouTubeVideoId(string $url): ?string
9{
10 $parsed = parse_url($url);
11
12 // Короткая ссылка youtu.be/VIDEO_ID
13 if (isset($parsed['host']) && str_contains($parsed['host'], 'youtu.be')) {
14 return ltrim($parsed['path'], '/') ?: null;
15 }
16
17 // Стандартная ссылка watch?v=VIDEO_ID
18 if (isset($parsed['query'])) {
19 parse_str($parsed['query'], $params);
20 if (!empty($params['v'])) {
21 return $params['v'];
22 }
23 }
24
25 // Embed-ссылка /embed/VIDEO_ID
26 if (isset($parsed['path']) && str_starts_with($parsed['path'], '/embed/')) {
27 return substr($parsed['path'], 7);
28 }
29
30 return null;
31}
32
33// Пример использования
34$videoUrl = 'https://www.youtube.com/watch?v=1ejTKov_Sm4';
35$videoId = getYouTubeVideoId($videoUrl);
36echo $videoId; // 1ejTKov_Sm4

Функция использует только встроенные возможности PHP, parse_url() разбирает URL на компоненты, parse_str() парсит query-строку в массив. Никаких внешних зависимостей.

Шаг 4: Запрос к API и разбор ответа

Собираем всё вместе. Формируем URL с подстановкой ID и ключа, делаем GET-запрос, декодируем JSON:

1<?php
2
3$apiKey = 'AIzaSyD-ВАШ_КЛЮЧ';
4$videoUrl = 'https://www.youtube.com/watch?v=1ejTKov_Sm4';
5$videoId = getYouTubeVideoId($videoUrl);
6
7if (!$videoId) {
8 die('Не удалось извлечь ID видео из URL.');
9}
10
11$endpoint = sprintf(
12 'https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails,statistics&id=%s&key=%s',
13 $videoId,
14 $apiKey
15);
16
17// Вариант с file_get_contents (нужен allow_url_fopen = On в php.ini)
18$context = stream_context_create([
19 'http' => [
20 'timeout' => 10,
21 'ignore_errors' => true, // не падать при HTTP-ошибках
22 ],
23]);
24
25$response = @file_get_contents($endpoint, false, $context);
26
27if ($response === false) {
28 die('Сетевой запрос не удался. Проверьте соединение или используйте cURL.');
29}
30
31$data = json_decode($response);
32
33if (json_last_error() !== JSON_ERROR_NONE) {
34 die('Ответ API — не JSON. Возможно, ключ недействителен.');
35}
36
37// API возвращает ошибку в поле error, а не HTTP-статусом
38if (isset($data->error)) {
39 die('Ошибка API: ' . $data->error->message);
40}
41
42if (empty($data->items)) {
43 die('Видео с таким ID не найдено.');
44}
45
46$video = $data->items[0];
47
48echo 'Название: ' . $video->snippet->title . PHP_EOL;
49echo 'Канал: ' . $video->snippet->channelTitle . PHP_EOL;
50echo 'Опубликовано: ' . $video->snippet->publishedAt . PHP_EOL;
51echo 'Длительность: ' . $video->contentDetails->duration . PHP_EOL;
52echo 'Просмотров: ' . number_format($video->statistics->viewCount ?? 0) . PHP_EOL;
53echo 'Лайков: ' . number_format($video->statistics->likeCount ?? 0) . PHP_EOL;
54echo 'Комментариев: ' . number_format($video->statistics->commentCount ?? 0) . PHP_EOL;
55
56// URL миниатюры максимального разрешения
57if (isset($video->snippet->thumbnails->maxres)) {
58 echo 'Миниатюра: ' . $video->snippet->thumbnails->maxres->url . PHP_EOL;
59}

Код стал заметно надёжнее голого file_get_contents() из чернового варианта. Добавлены: проверка на извлечение ID, обработка сетевых ошибок, валидация JSON, реакция на API-ошибку Google (поле error), проверка на пустой ответ, fallback-оператор ?? для необязательных полей статистики.

cURL как альтернатива

Если на хостинге отключена директива allow_url_fopen, file_get_contents() не сработает. Тогда, cURL:

1$ch = curl_init();
2curl_setopt_array($ch, [
3 CURLOPT_URL => $endpoint,
4 CURLOPT_RETURNTRANSFER => true,
5 CURLOPT_TIMEOUT => 10,
6 CURLOPT_FOLLOWLOCATION => true,
7]);
8$response = curl_exec($ch);
9$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
10curl_close($ch);
11
12if ($httpCode !== 200 || $response === false) {
13 die('Запрос не удался. HTTP-код: ' . $httpCode);
14}

Готовая библиотека: madcoda/php-youtube-api

Писать обвязку вручную для продакшена, лишняя работа. Для проектов, где нужна не разовая выборка, а регулярная работа с API, есть madcoda/php-youtube-api, легковесная PHP-обёртка без внешних зависимостей. Установка:

1composer require madcoda/php-youtube-api

Использование:

1$youtube = new Madcoda\Youtube(['key' => 'ВАШ_КЛЮЧ']);
2$video = $youtube->getVideoInfo('1ejTKov_Sm4');
3
4echo $video->snippet->title;
5echo $video->statistics->viewCount;

Библиотека закрывает рутину: пагинацию, повторные запросы, форматирование длительности из ISO 8601 в читаемый вид. Для разовых скриптов, избыточно; для работающего сервиса, оправдано.

Видеоруководство выше наглядно показывает весь процесс: от включения API в консоли до первого успешного запроса. Рекомендуем посмотреть перед тем, как писать код, 15 минут видео экономят час чтения документации.

PHP-код на экране монитора крупным планом

⁉️🤔 Частые вопросы

Сколько стоит использование YouTube Data API?

Сам API бесплатен. Вы платите только квотой: 10 000 единиц в сутки для каждого проекта. Запрос к /videos стоит 1 единицу, можно получить данные о 10 000 видео ежедневно без копейки затрат. Для коммерческого проекта с нагрузкой выше порога Google предлагает форму запроса дополнительной квоты, одобряют при адекватном обосновании. Отдельных платных тарифов у YouTube Data API нет.

Чем YouTube Data API v3 отличается от парсинга HTML-страницы?

API возвращает структурированный JSON с документированной схемой. При изменении полей Google публикует deprecation notice за несколько месяцев. HTML-парсинг ломается при любом редизайне страницы, требует эмуляции браузера и прямо запрещён пунктом 3.2 Terms of Service YouTube.

Можно ли получить данные о приватном видео?

С API-ключом, только публичные видео. Для доступа к приватным, скрытым (unlisted) и restricted-видео требуется OAuth 2.0 с разрешением владельца. Технически это тот же эндпоинт /videos, но с access-токеном вместо key.

Как получить ID своего канала YouTube?

Самый надёжный способ, YouTube Studio → Settings → Channel → Advanced settings. Там YouTube ID канала показан как есть, без API-запросов. Альтернативно: вызвать /channels?part=id&mine=true с OAuth-токеном. Для каналов с пользовательским именем метод /channels?part=id&forUsername=ИМЯ работает лишь для созданных до 2014 года.

Что делать при ошибке «quotaExceeded»?

Суточная квота сбрасывается в 00:00 по тихоокеанскому времени (UTC-8). Временное решение, кешировать ответы на своей стороне (файл, Redis). Для постоянного увеличения: Google Cloud Console → IAM & Admin → Quotas → YouTube Data API v3 → requests per day → Edit Quota.

Куда применить YouTube Data API: итоговый расклад

Мы прошли полный цикл: ключ API, разбор параметров эндпоинта, извлечение ID видео из URL, GET-запрос и парсинг JSON-ответа. На выходе, рабочий PHP-скрипт, который за секунду достаёт название, статистику, длительность и миниатюры любого публичного видео.

Куда двигаться дальше:

  • Карточки видео на сайте. Вставьте скрипт в бэкенд WordPress (хук save_post) или Laravel, и при добавлении ссылки на YouTube информация о видео подтягивается автоматически.
  • Мониторинг конкурентов. Раз в сутки собирайте viewCount и likeCount по списку каналов, таблица с динамикой готова.
  • Автоматический импорт. Если ведёте видеоблог на своём сайте, забирайте snippet.title и snippet.description как черновик текстового описания к встраиванию.

YouTube Data API v3, зрелый, стабильный и бесплатный инструмент. Освоив базовый вызов из этого туториала, вы открываете дверь к десяткам других методов: поиск, плейлисты, комментарии, подписки. 🔗 Официальная документация YouTube Data API v3