
📹 YouTube Data API v3: videotietojen haku PHP:llä (2026)
Miksi jäsentää videodataa API:n kautta, kun voisit vain avata sivun?
Kymmenien videoiden tietojen kerääminen käsin vie tunteja. Otsikko, kesto, katselukerrat, julkaisupäivä: kaiken tämän kopioiminen YouTubesta käsin on varma tie virheisiin ja uupumukseen.
YouTube Data API v3 ratkaisee ongelman ohjelmallisesti. Yksi HTTP-pyyntö, ja saat strukturoitua JSONia, joka sisältää snippet-, contentDetails- ja statistics-objektit. Ei HTML-jäsennystä, ei captchoja.
Tässä tutoriaalissa: vaiheittaiset ohjeet API-avaimen luomisesta valmiiseen PHP-skriptiin, joka hakee minkä tahansa YouTube-videon tiedot sen URL-osoitteen perusteella. Koodi on aitoa, testattua ja jokainen rivi on selitetty.
💡 Nopea yleiskatsaus:
- Luo API-avain Google Cloud Consolessa ja ota YouTube Data API v3 käyttöön
- Pura
/videos-päätepisteen rakenne ja sen part-, id- ja key-parametrit - Kirjoita PHP-funktio, joka poimii videon ID:n mistä tahansa YouTube-linkistä
- Tee pyyntö
file_get_contents()-funktiolla ja jäsennä JSON-vastaus - Käsittele virheet: virheellinen avain, väärä ID, kiintiö ylitetty
- Katso vaihtoehto: valmis
madcoda/php-youtube-api-kirjasto
Vaihe 1: YouTube Data API -avaimen hankkiminen
API:n käyttämiseen tarvitset avaimen. Tässä lyhin reitti:
- Avaa Google Cloud Console ja luo uusi projekti (tai valitse olemassa oleva).
- Siirry kohtaan APIs & Services → Library, etsi "YouTube Data API v3" ja napsauta Enable.
- Siirry kohtaan Credentials → Create Credentials → API Key.
- (Suositus) Rajoita avainta: valitse API restrictions -osiossa YouTube Data API v3, jotta avain ei toimi muiden Googlen palveluiden kanssa.
Avain näyttää merkkijonolta, kuten AIzaSyD-..., jossa on 39 merkkiä. Ilman sitä API palauttaa 403-virheen.
Päiväkiintiö on 10 000 yksikköä. Yksi pyyntö /videos-päätepisteeseen maksaa 1 yksikön. Testaukseen ja pieniin projekteihin tämä on enemmän kuin tarpeeksi. Jos suunnittelet tuotantotason kuormaa, pyydä kiintiön korotusta samasta Console-osiosta.
Vaihe 2: API-päätepiste ja sen parametrit
URL-osoite videotietojen hakemiseen:
1 GET https://www.googleapis.com/youtube/v3/videos
Parametrit välitetään kyselymerkkijonona:
Parametri | Pakollinen | Kuvaus |
|---|---|---|
| Kyllä | Pilkulla eroteltu lista kenttiä: snippet, contentDetails, statistics, status, topicDetails jne. |
| Kyllä | YouTube-videon ID (11 merkkiä, esim. |
| Kyllä | API-avaimesi |
| Ei | Tekstikenttien kieli (esim. |
| Ei | Tulosten määrä (1-50, oletus on 5) |
Kolme tärkeintä part-arvoa, jotka kattavat useimmat skenaariot:
- snippet: perustiedot: otsikko, kuvaus, channelId, channelTitle, publishedAt, thumbnails (joukko pikkukuvien URL-osoitteita eri resoluutioilla), tags, categoryId.
- contentDetails: ominaisuudet: kesto (ISO 8601 -muodossa, esim.
PT4M13S), dimension (2d/3d), definition (sd/hd), caption (onko tekstityksiä olemassa). - statistics: numerot: viewCount, likeCount, commentCount.
Tärkeä huomio: dislikeCount-kenttä statistics-objektissa on ollut pois käytöstä joulukuusta 2021 lähtien, API palauttaa aina 0. Myös favoriteCount-kenttä on vanhentunut (aina 0 elokuusta 2015 lähtien). Älä luota niihin koodissasi.
Vaihe 3: Videon ID:n poimiminen URL-osoitteesta
Ennen API:n kutsumista sinun on poimittava videon ID linkistä. YouTubella on useita URL-muotoja:
- Vakio:
https://www.youtube.com/watch?v=1ejTKov_Sm4 - Lyhyt:
https://youtu.be/1ejTKov_Sm4 - Upotus:
https://www.youtube.com/embed/1ejTKov_Sm4 - Parametreilla:
https://www.youtube.com/watch?v=1ejTKov_Sm4&t=120
Yksinkertainen PHP-funktio käsittelee kaikki nämä variantit:
1 /** 2 * Extracts video ID from YouTube URL. 3 * Supports formats: watch?v=, youtu.be/, /embed/ 4 * 5 * @param string $url YouTube video URL 6 * @return string|null Video ID (11 characters) or null on error 7 */ 8 function getYouTubeVideoId(string $url): ?string 9 { 10 $parsed = parse_url($url); 11 12 // Short link youtu.be/VIDEO_ID 13 if (isset($parsed['host']) && str_contains($parsed['host'], 'youtu.be')) { 14 return ltrim($parsed['path'], '/') ?: null; 15 } 16 17 // Standard link 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 link /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 // Usage example 34 $videoUrl = 'https://www.youtube.com/watch?v=1ejTKov_Sm4'; 35 $videoId = getYouTubeVideoId($videoUrl); 36 echo $videoId; // 1ejTKov_Sm4
Funktio käyttää vain PHP:n sisäänrakennettuja ominaisuuksia: parse_url() pilkkoo URL-osoitteen osiin, parse_str() jäsentää kyselymerkkijonon taulukoksi. Ei ulkoisia riippuvuuksia.
Vaihe 4: API-pyyntö ja vastauksen jäsentäminen
Kootaan kaikki yhteen. Rakennamme URL-osoitteen sijoittamalla ID:n ja avaimen, teemme GET-pyynnön ja dekoodaamme JSONin:
1 <?php 2 3 $apiKey = 'AIzaSyD-YOUR_KEY'; 4 $videoUrl = 'https://www.youtube.com/watch?v=1ejTKov_Sm4'; 5 $videoId = getYouTubeVideoId($videoUrl); 6 7 if (!$videoId) { 8 die('Failed to extract video ID from 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 // Option with file_get_contents (requires allow_url_fopen = On in php.ini) 18 $context = stream_context_create([ 19 'http' => [ 20 'timeout' => 10, 21 'ignore_errors' => true, // do not crash on HTTP errors 22 ], 23 ]); 24 25 $response = @file_get_contents($endpoint, false, $context); 26 27 if ($response === false) { 28 die('Network request failed. Check your connection or use cURL.'); 29 } 30 31 $data = json_decode($response); 32 33 if (json_last_error() !== JSON_ERROR_NONE) { 34 die('API response is not JSON. The key might be invalid.'); 35 } 36 37 // API returns error in error field, not HTTP status 38 if (isset($data->error)) { 39 die('API Error: ' . $data->error->message); 40 } 41 42 if (empty($data->items)) { 43 die('No video found with this ID.'); 44 } 45 46 $video = $data->items[0]; 47 48 echo 'Title: ' . $video->snippet->title . PHP_EOL; 49 echo 'Channel: ' . $video->snippet->channelTitle . PHP_EOL; 50 echo 'Published: ' . $video->snippet->publishedAt . PHP_EOL; 51 echo 'Duration: ' . $video->contentDetails->duration . PHP_EOL; 52 echo 'Views: ' . number_format($video->statistics->viewCount ?? 0) . PHP_EOL; 53 echo 'Likes: ' . number_format($video->statistics->likeCount ?? 0) . PHP_EOL; 54 echo 'Comments: ' . number_format($video->statistics->commentCount ?? 0) . PHP_EOL; 55 56 // Max resolution thumbnail URL 57 if (isset($video->snippet->thumbnails->maxres)) { 58 echo 'Thumbnail: ' . $video->snippet->thumbnails->maxres->url . PHP_EOL; 59 }
Koodi on huomattavasti robustimpi kuin pelkkä file_get_contents() luonnosversiosta. Lisätty: ID:n poiminnan tarkistus, verkkovirheiden käsittely, JSON-validointi, vastaus Googlen API-virheeseen (error-kenttä), tyhjän vastauksen tarkistus ja ??-varallepano-operaattori valinnaisille tilastokentille.
CURL vaihtoehtona
Jos allow_url_fopen-direktiivi on poistettu käytöstä hosting-palvelussasi, file_get_contents() ei toimi. Siinä tapauksessa käytä cURLia:
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('Request failed. HTTP code: ' . $httpCode); 14 }
Valmis kirjasto: madcoda/php-youtube-api
Kääreen kirjoittaminen manuaalisesti tuotantoa varten on ylimääräistä työtä. Projekteihin, jotka tarvitsevat säännöllistä API-vuorovaikutusta kertaluontoisen haun sijaan, on olemassa madcoda/php-youtube-api, kevyt PHP-kääre ilman ulkoisia riippuvuuksia. Asennus:
1 composer require madcoda/php-youtube-api
Käyttö:
1 $youtube = new Madcoda\Youtube(['key' => 'YOUR_KEY']); 2 $video = $youtube->getVideoInfo('1ejTKov_Sm4'); 3 4 echo $video->snippet->title; 5 echo $video->statistics->viewCount;
Kirjasto hoitaa rutiinitehtävät: sivutuksen, uudelleenyrityspyynnöt, keston muotoilun ISO 8601 -muodosta luettavaan muotoon. Kertaluontoisille skripteille se on liioittelua; toimivalle palvelulle se on perusteltua.
Yllä oleva video-opas näyttää selkeästi koko prosessin: API:n käyttöönotosta konsolissa ensimmäiseen onnistuneeseen pyyntöön. Suosittelemme katsomaan sen ennen koodin kirjoittamista: 15 minuuttia videota säästää tunnin dokumentaation lukemiselta.

⁉️🤔 Usein kysytyt kysymykset
Mitä YouTube Data API:n käyttö maksaa?
Itse API on ilmainen. Maksat vain kiintiöllä: 10 000 yksikköä päivässä jokaista projektia kohden. Pyyntö
/videos-päätepisteeseen maksaa 1 yksikön, joten voit hakea tiedot 10 000 videosta päivittäin ilmaiseksi. Kaupallisiin projekteihin, joiden kuorma ylittää rajan, Google tarjoaa kiintiönkorotuspyyntölomakkeen; he hyväksyvät sen asianmukaisilla perusteluilla. YouTube Data API:lla ei ole erillisiä maksullisia tasoja.
Miten YouTube Data API v3 eroaa HTML-sivun jäsentämisestä?
API palauttaa strukturoitua JSONia dokumentoidulla skeemalla. Kun kentät muuttuvat, Google julkaisee vanhentumisilmoituksen useita kuukausia etukäteen. HTML-jäsennys hajoaa jokaisen sivustouudistuksen yhteydessä, vaatii selainemulointia ja on nimenomaisesti kielletty YouTuben käyttöehtojen osiossa 3.2.
Voinko saada tietoja yksityisestä videosta?
API-avaimella vain julkisista videoista. Pääsy yksityisiin, piilotettuihin ja rajoitettuihin videoihin vaatii OAuth 2.0 -todennuksen omistajan luvalla. Teknisesti kyseessä on sama /videos-päätepiste, mutta avaimen sijaan käytetään access tokenia.
Miten saan YouTube-kanavani ID:n?
Luotettavin tapa: YouTube Studio → Settings → Channel → Advanced settings. Siellä YouTube-kanavan ID näkyy sellaisenaan, ilman API-pyyntöjä. Vaihtoehtoisesti: kutsu
/channels?part=id&mine=trueOAuth-tokenilla. Kanaville, joilla on mukautettu käyttäjänimi,/channels?part=id&forUsername=NAME-metodi toimii vain ennen vuotta 2014 luoduille kanaville.
Mitä minun pitäisi tehdä, kun saan "quotaExceeded"-virheen?
Päiväkiintiö nollautuu klo 00.00 Tyynenmeren aikaa (UTC-8). Väliaikainen ratkaisu: välimuistita vastaukset omassa päässäsi (tiedosto, Redis). Pysyvää korotusta varten: Google Cloud Console → IAM & Admin → Quotas → YouTube Data API v3 → requests per day → Edit Quota.
Mihin YouTube Data API:a voi soveltaa: loppuyhteenveto
Olemme käyneet läpi koko syklin: API-avain, päätepisteen parametrien erittely, videon ID:n poiminta URL-osoitteesta, GET-pyyntö ja JSON-vastauksen jäsentäminen. Tuloksena on toimiva PHP-skripti, joka hakee minkä tahansa julkisen videon otsikon, tilastot, keston ja pikkukuvat sekunnissa.
Mihin edetä seuraavaksi:
- Videokortit verkkosivustolla. Integroi skripti WordPressin taustajärjestelmään (
save_post-koukku) tai Laraveliin, ja kun YouTube-linkki lisätään, videon tiedot haetaan automaattisesti. - Kilpailijoiden seuranta. Kerran päivässä kerää
viewCountjalikeCountkanavalistalle, ja dynamiikkataulukkosi on valmis. - Automaattinen tuonti. Jos pidät videoblogia omalla sivustollasi, hae
snippet.titlejasnippet.descriptionluonnokseksi tekstikuvaukseksi upotusta varten.
YouTube Data API v3 on kypsä, vakaa ja ilmainen työkalu. Kun hallitset tämän tutoriaalin peruskutsun, avaat oven kymmeniin muihin metodeihin: haku, soittolistat, kommentit, tilaukset. 🔗 Virallinen YouTube Data API v3 -dokumentaatio



