Skip to content

Wszystko o WordPressie, tworzeniu stron — i nie tylko

📹 YouTube Data API v3: pobieranie danych o filmach przez PHP (2026)

📹 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 /videos i 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:

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

Parametry są przekazywane jako query string:

Parametr

Wymagany

Opis

part

Tak

Lista pól oddzielonych przecinkami: snippet, contentDetails, statistics, status, topicDetails i in.

id

Tak

ID filmu YouTube (11 znaków, np. 1ejTKov_Sm4)

key

Tak

Pana/Pani klucz API

hl

Nie

Język pól tekstowych (np. ru dla rosyjskich nazw)

maxResults

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 */
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

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
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}

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();
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}

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:

1composer require madcoda/php-youtube-api

Użycie:

1$youtube = new Madcoda\Youtube(['key' => 'ВАШ_КЛЮЧ']);
2$video = $youtube->getVideoInfo('1ejTKov_Sm4');
3
4echo $video->snippet->title;
5echo $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.

Kod PHP na ekranie monitora w zbliżeniu

⁉️🤔 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 /videos kosztuje 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=true z 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ć viewCount i likeCount z listy kanałów, tabela z dynamiką gotowa.
  • Automatyczny import. Jeśli prowadzą Państwo wideoblog na swojej stronie, pobierać snippet.title i snippet.description jako 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