
📹 YouTube Data API v3: pobieranie danych o filmach przez PHP (2026)
Po co parsować dane wideo przez API, skoro można po prostu otworzyć stronę?
Ręczne zbieranie informacji o dziesiątkach filmów to zajęcie na godziny. Tytuł, czas trwania, liczba wyświetleń, data publikacji: kopiowanie tego ręcznie z YouTube to gwarantowana droga do błędów i wypalenia.
YouTube Data API v3 rozwiązuje ten problem programowo. Jedno żądanie HTTP i otrzymują Państwo ustrukturyzowany JSON z fragmentem (snippet), charakterystyką treści (contentDetails) i statystykami. Żadnego parsowania HTML, żadnych captcha.
W tym tutorialu: instrukcja krok po kroku od utworzenia klucza API do gotowego skryptu PHP, który pobiera informacje o dowolnym filmie YouTube na podstawie jego URL. Kod jest prawdziwy, przetestowany, z objaśnieniem każdej linii.
💡 Szybki przegląd:
- Tworzymy klucz API w Google Cloud Console i włączamy YouTube Data API v3
- Analizujemy strukturę endpointa
/videosi jego parametry part, id i key - Piszemy funkcję PHP do wyodrębniania ID filmu z dowolnego linku YouTube
- Wykonujemy żądanie przez
file_get_contents()i parsujemy odpowiedź JSON - Obsługujemy błędy: nieprawidłowy klucz, błędny ID, przekroczenie limitu
- Przyglądamy się alternatywie, gotowej bibliotece
madcoda/php-youtube-api
Krok 1: Uzyskanie klucza API YouTube Data API
Do pracy z API potrzebny jest klucz. Oto najkrótsza ścieżka:
- Proszę otworzyć Google Cloud Console i utworzyć nowy projekt (lub wybrać istniejący).
- Proszę przejść do APIs & Services → Library, znaleźć „YouTube Data API v3" i kliknąć Enable.
- Proszę wejść w Credentials → Create Credentials → API Key.
- (Zalecane) Proszę ograniczyć klucz: w sekcji API restrictions wybrać YouTube Data API v3, aby klucz nie działał z innymi usługami Google.
Klucz ma postać ciągu znaków, takiego jak AIzaSyD-..., o długości 39 znaków. Bez niego API zwróci błąd 403.
Dzienny limit to 10 000 jednostek. Jedno żądanie do /videos zużywa 1 jednostkę. Do testów i niewielkiego projektu to więcej niż wystarczy. Jeśli planują Państwo obciążenie produkcyjne, proszę poprosić o zwiększenie limitu w tej samej sekcji Console.
Krok 2: Endpoint API i jego parametry
URL do pobierania informacji o filmie:
1 GET https://www.googleapis.com/youtube/v3/videos
Parametry są przekazywane jako query string:
Parametr | Wymagany | Opis |
|---|---|---|
| Tak | Lista pól oddzielonych przecinkami: snippet, contentDetails, statistics, status, topicDetails i in. |
| Tak | ID filmu YouTube (11 znaków, np. |
| Tak | Pana/Pani klucz API |
| Nie | Język pól tekstowych (np. |
| Nie | Liczba wyników (1-50, domyślnie 5) |
Trzy główne wartości part, które pokrywają większość scenariuszy:
- snippet, podstawowe informacje: title, description, channelId, channelTitle, publishedAt, thumbnails (zestaw URL miniatur w różnych rozdzielczościach), tags, categoryId.
- contentDetails, charakterystyka: duration (w formacie ISO 8601, np.
PT4M13S), dimension (2d/3d), definition (sd/hd), caption (czy są napisy). - statistics, liczby: viewCount, likeCount, commentCount.
Ważny niuans: pole dislikeCount w statistics jest wyłączone od grudnia 2021 roku, API zawsze zwraca 0. Pole favoriteCount jest również przestarzałe (zawsze 0 od sierpnia 2015). Proszę nie opierać się na nich w kodzie.
Krok 3: Wyodrębnianie ID filmu z URL
Zanim wywołają Państwo API, trzeba wyciągnąć ID filmu z linku. YouTube ma kilka formatów URL:
- Standardowy:
https://www.youtube.com/watch?v=1ejTKov_Sm4 - Krótki:
https://youtu.be/1ejTKov_Sm4 - Embed:
https://www.youtube.com/embed/1ejTKov_Sm4 - Z parametrami:
https://www.youtube.com/watch?v=1ejTKov_Sm4&t=120
Dla wszystkich tych wariantów działa prosta funkcja 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
Funkcja wykorzystuje wyłącznie wbudowane możliwości PHP, parse_url() rozkłada URL na komponenty, parse_str() parsuje query string do tablicy. Żadnych zewnętrznych zależności.
Krok 4: Żądanie do API i analiza odpowiedzi
Składamy wszystko razem. Tworzymy URL z podstawieniem ID i klucza, wykonujemy żądanie GET, dekodujemy 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 }
Kod stał się zauważalnie solidniejszy niż gołe file_get_contents() z pierwszego szkicu. Dodano: sprawdzenie wyodrębnienia ID, obsługę błędów sieciowych, walidację JSON, reakcję na błąd API Google (pole error), sprawdzenie pustej odpowiedzi, operator fallback ?? dla opcjonalnych pól statystyk.
CURL jako alternatywa
Jeśli na hostingu wyłączona jest dyrektywa allow_url_fopen, file_get_contents() nie zadziała. Wtedy, 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 }
Gotowa biblioteka: madcoda/php-youtube-api
Pisanie wrappera ręcznie do produkcji to zbędna praca. Dla projektów, gdzie potrzebne jest nie jednorazowe pobranie, a regularna praca z API, jest madcoda/php-youtube-api, lekki wrapper PHP bez zewnętrznych zależności. Instalacja:
1 composer require madcoda/php-youtube-api
Użycie:
1 $youtube = new Madcoda\Youtube(['key' => 'ВАШ_КЛЮЧ']); 2 $video = $youtube->getVideoInfo('1ejTKov_Sm4'); 3 4 echo $video->snippet->title; 5 echo $video->statistics->viewCount;
Biblioteka zamyka rutynę: paginację, ponowne żądania, formatowanie czasu trwania z ISO 8601 na czytelną postać. Dla jednorazowych skryptów to nadmiar; dla działającego serwisu, uzasadnione.
Poradnik wideo powyżej pokazuje wizualnie cały proces: od włączenia API w konsoli do pierwszego udanego żądania. Zalecamy obejrzenie przed pisaniem kodu, 15 minut wideo oszczędza godzinę czytania dokumentacji.

⁉️🤔 Często zadawane pytania
Ile kosztuje korzystanie z YouTube Data API?
Samo API jest bezpłatne. Płacą Państwo jedynie limitem: 10 000 jednostek na dobę dla każdego projektu. Żądanie do
/videoskosztuje 1 jednostkę, można uzyskać dane o 10 000 filmów dziennie bez żadnych kosztów. Dla komercyjnego projektu z obciążeniem powyżej progu Google oferuje formularz wniosku o dodatkowy limit, zatwierdzają przy odpowiednim uzasadnieniu. Odrębnych płatnych taryf w YouTube Data API nie ma.
Czym YouTube Data API v3 różni się od parsowania strony HTML?
API zwraca ustrukturyzowany JSON z udokumentowanym schematem. W przypadku zmiany pól Google publikuje powiadomienie o wycofaniu (deprecation notice) z kilkumiesięcznym wyprzedzeniem. Parsowanie HTML psuje się przy każdej zmianie wyglądu strony, wymaga emulacji przeglądarki i jest wprost zabronione przez punkt 3.2 Warunków korzystania z usługi YouTube.
Czy można uzyskać dane o prywatnym filmie?
Z kluczem API, tylko publiczne filmy. Aby uzyskać dostęp do prywatnych, niepublicznych (unlisted) i restricted filmów, potrzebny jest OAuth 2.0 z uprawnieniem właściciela. Technicznie to ten sam endpoint /videos, ale z access tokenem zamiast key.
Jak uzyskać ID swojego kanału YouTube?
Najpewniejszy sposób, YouTube Studio → Settings → Channel → Advanced settings. Tam YouTube ID kanału jest pokazane bezpośrednio, bez żądań API. Alternatywnie: wywołać
/channels?part=id&mine=truez tokenem OAuth. Dla kanałów z nazwą użytkownika metoda/channels?part=id&forUsername=ИМЯdziała tylko dla utworzonych przed 2014 rokiem.
Co robić w przypadku błędu „quotaExceeded"?
Dzienny limit resetuje się o 00:00 czasu pacyficznego (UTC-8). Tymczasowe rozwiązanie, buforować odpowiedzi po swojej stronie (plik, Redis). Aby trwale zwiększyć: Google Cloud Console → IAM & Admin → Quotas → YouTube Data API v3 → requests per day → Edit Quota.
Gdzie zastosować YouTube Data API: podsumowanie
Przeszliśmy pełny cykl: klucz API, analiza parametrów endpointa, wyodrębnianie ID filmu z URL, żądanie GET i parsowanie odpowiedzi JSON. Na wyjściu, działający skrypt PHP, który w ciągu sekundy pobiera tytuł, statystyki, czas trwania i miniatury dowolnego publicznego filmu.
Dokąd iść dalej:
- Karty wideo na stronie. Proszę wstawić skrypt do backendu WordPress (hook
save_post) lub Laravel, a przy dodaniu linku do YouTube informacje o filmie zostaną pobrane automatycznie. - Monitoring konkurencji. Raz na dobę zbierać
viewCountilikeCountz listy kanałów, tabela z dynamiką gotowa. - Automatyczny import. Jeśli prowadzą Państwo wideoblog na swojej stronie, pobierać
snippet.titleisnippet.descriptionjako szkic opisu tekstowego do osadzenia.
YouTube Data API v3, dojrzałe, stabilne i bezpłatne narzędzie. Po opanowaniu podstawowego wywołania z tego tutoriala, otwierają Państwo drzwi do dziesiątek innych metod: wyszukiwanie, playlisty, komentarze, subskrypcje. 🔗 Oficjalna dokumentacja YouTube Data API v3



