
📹 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 для получения информации о видео:
1 GET https://www.googleapis.com/youtube/v3/videos
Параметры передаются как query string:
Параметр | Обязателен | Описание |
|---|---|---|
| Да | Список полей через запятую: snippet, contentDetails, statistics, status, topicDetails и др. |
| Да | ID видео YouTube (11 символов, например |
| Да | Ваш API-ключ |
| Нет | Язык текстовых полей (например, |
| Нет | Количество результатов (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 */ 8 function 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); 36 echo $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 7 if (!$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 27 if ($response === false) { 28 die('Сетевой запрос не удался. Проверьте соединение или используйте cURL.'); 29 } 30 31 $data = json_decode($response); 32 33 if (json_last_error() !== JSON_ERROR_NONE) { 34 die('Ответ API — не JSON. Возможно, ключ недействителен.'); 35 } 36 37 // API возвращает ошибку в поле error, а не HTTP-статусом 38 if (isset($data->error)) { 39 die('Ошибка API: ' . $data->error->message); 40 } 41 42 if (empty($data->items)) { 43 die('Видео с таким ID не найдено.'); 44 } 45 46 $video = $data->items[0]; 47 48 echo 'Название: ' . $video->snippet->title . PHP_EOL; 49 echo 'Канал: ' . $video->snippet->channelTitle . PHP_EOL; 50 echo 'Опубликовано: ' . $video->snippet->publishedAt . PHP_EOL; 51 echo 'Длительность: ' . $video->contentDetails->duration . PHP_EOL; 52 echo 'Просмотров: ' . number_format($video->statistics->viewCount ?? 0) . PHP_EOL; 53 echo 'Лайков: ' . number_format($video->statistics->likeCount ?? 0) . PHP_EOL; 54 echo 'Комментариев: ' . number_format($video->statistics->commentCount ?? 0) . PHP_EOL; 55 56 // URL миниатюры максимального разрешения 57 if (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(); 2 curl_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); 10 curl_close($ch); 11 12 if ($httpCode !== 200 || $response === false) { 13 die('Запрос не удался. HTTP-код: ' . $httpCode); 14 }
Готовая библиотека: madcoda/php-youtube-api
Писать обвязку вручную для продакшена, лишняя работа. Для проектов, где нужна не разовая выборка, а регулярная работа с API, есть madcoda/php-youtube-api, легковесная PHP-обёртка без внешних зависимостей. Установка:
1 composer require madcoda/php-youtube-api
Использование:
1 $youtube = new Madcoda\Youtube(['key' => 'ВАШ_КЛЮЧ']); 2 $video = $youtube->getVideoInfo('1ejTKov_Sm4'); 3 4 echo $video->snippet->title; 5 echo $video->statistics->viewCount;
Библиотека закрывает рутину: пагинацию, повторные запросы, форматирование длительности из ISO 8601 в читаемый вид. Для разовых скриптов, избыточно; для работающего сервиса, оправдано.
Видеоруководство выше наглядно показывает весь процесс: от включения API в консоли до первого успешного запроса. Рекомендуем посмотреть перед тем, как писать код, 15 минут видео экономят час чтения документации.

⁉️🤔 Частые вопросы
Сколько стоит использование 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



