Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

📹 YouTube Data API v3: videotietojen haku PHP:llä (2026)

📹 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:

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

Parametrit välitetään kyselymerkkijonona:

Parametri

Pakollinen

Kuvaus

part

Kyllä

Pilkulla eroteltu lista kenttiä: snippet, contentDetails, statistics, status, topicDetails jne.

id

Kyllä

YouTube-videon ID (11 merkkiä, esim. 1ejTKov_Sm4)

key

Kyllä

API-avaimesi

hl

Ei

Tekstikenttien kieli (esim. ru venäjänkielisille otsikoille)

maxResults

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 */
8function 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);
36echo $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
7if (!$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
27if ($response === false) {
28 die('Network request failed. Check your connection or use cURL.');
29}
30
31$data = json_decode($response);
32
33if (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
38if (isset($data->error)) {
39 die('API Error: ' . $data->error->message);
40}
41
42if (empty($data->items)) {
43 die('No video found with this ID.');
44}
45
46$video = $data->items[0];
47
48echo 'Title: ' . $video->snippet->title . PHP_EOL;
49echo 'Channel: ' . $video->snippet->channelTitle . PHP_EOL;
50echo 'Published: ' . $video->snippet->publishedAt . PHP_EOL;
51echo 'Duration: ' . $video->contentDetails->duration . PHP_EOL;
52echo 'Views: ' . number_format($video->statistics->viewCount ?? 0) . PHP_EOL;
53echo 'Likes: ' . number_format($video->statistics->likeCount ?? 0) . PHP_EOL;
54echo 'Comments: ' . number_format($video->statistics->commentCount ?? 0) . PHP_EOL;
55
56// Max resolution thumbnail URL
57if (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();
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('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:

1composer require madcoda/php-youtube-api

Käyttö:

1$youtube = new Madcoda\Youtube(['key' => 'YOUR_KEY']);
2$video = $youtube->getVideoInfo('1ejTKov_Sm4');
3
4echo $video->snippet->title;
5echo $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.

PHP-koodia tietokoneen näytöllä lähikuvassa

⁉️🤔 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=true OAuth-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ää viewCount ja likeCount kanavalistalle, ja dynamiikkataulukkosi on valmis.
  • Automaattinen tuonti. Jos pidät videoblogia omalla sivustollasi, hae snippet.title ja snippet.description luonnokseksi 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