Skip to content

Allt om WordPress, webbutveckling — och mer därtill

📹 YouTube Data API v3: hämta videodata med PHP (2026)

📹 YouTube Data API v3: hämta videodata med PHP (2026)

Varför tolka videodata via API när du kan öppna sidan?

Att manuellt samla in information om dussintals videor tar timmar. Titel, längd, visningsantal, publiceringsdatum: att kopiera allt detta för hand från YouTube är en garanterad väg till fel och utbrändhet.

YouTube Data API v3 löser problemet programmatiskt. En HTTP-förfrågan, och du får strukturerad JSON med snippet, contentDetails och statistics. Ingen HTML-tolkning, inga captchas.

I den här handledningen: steg-för-steg-instruktioner från att skapa en API-nyckel till ett körklart PHP-skript som hämtar information om vilken YouTube-video som helst via dess URL. Koden är verklig, testad, med förklaringar för varje rad.

💡 Snabb översikt:

  • Skapa en API-nyckel i Google Cloud Console och aktivera YouTube Data API v3
  • Bryt ner /videos-endpointens struktur och dess parametrar part, id och key
  • Skriv en PHP-funktion för att extrahera video-ID från vilken YouTube-länk som helst
  • Gör en förfrågan via file_get_contents() och tolka JSON-svaret
  • Hantera fel: ogiltig nyckel, fel ID, överskriden kvot
  • Titta på ett alternativ: det färdiga biblioteket madcoda/php-youtube-api

Steg 1: Skaffa en YouTube Data API-nyckel

För att arbeta med API:et behöver du en nyckel. Här är den kortaste vägen:

  • Öppna Google Cloud Console och skapa ett nytt projekt (eller välj ett befintligt).
  • Gå till APIs & Services → Library, hitta "YouTube Data API v3" och klicka på Enable.
  • Gå till Credentials → Create Credentials → API Key.
  • (Rekommenderas) Begränsa nyckeln: i sektionen API restrictions, välj YouTube Data API v3 så att nyckeln inte fungerar med andra Google-tjänster.

Nyckeln ser ut som en sträng, till exempel AIzaSyD-... med 39 tecken. Utan den returnerar API:et ett 403-fel.

Daglig kvot är 10 000 enheter. En förfrågan till /videos kostar 1 enhet. För testning och små projekt är detta mer än tillräckligt. Om du planerar last i produktionsklass, begär en kvotökning i samma sektion i Console.

Steg 2: API-endpoint och dess parametrar

URL för att hämta videoinformation:

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

Parametrar skickas som query string:

Parameter

Obligatorisk

Beskrivning

part

Ja

Kommaseparerad lista med fält: snippet, contentDetails, statistics, status, topicDetails, etc.

id

Ja

YouTube video-ID (11 tecken, t.ex. 1ejTKov_Sm4)

key

Ja

Din API-nyckel

hl

Nej

Språk för textfält (t.ex. ru för ryska titlar)

maxResults

Nej

Antal resultat (1-50, standard är 5)

Tre huvudsakliga part-värden som täcker de flesta scenarier:

  • snippet: grundläggande information: title, description, channelId, channelTitle, publishedAt, thumbnails (uppsättning miniatyr-URL:er i olika upplösningar), tags, categoryId.
  • contentDetails: egenskaper: duration (i ISO 8601-format, t.ex. PT4M13S), dimension (2d/3d), definition (sd/hd), caption (om undertexter finns).
  • statistics: siffror: viewCount, likeCount, commentCount.

Viktig notering: fältet dislikeCount i statistics har varit inaktiverat sedan december 2021, API:et returnerar alltid 0. Fältet favoriteCount är också föråldrat (alltid 0 sedan augusti 2015). Förlita dig inte på dem i din kod.

Steg 3: Extrahera video-ID från URL

Innan du anropar API:et måste du extrahera video-ID:t från länken. YouTube har flera URL-format:

  • Standard: https://www.youtube.com/watch?v=1ejTKov_Sm4
  • Kort: https://youtu.be/1ejTKov_Sm4
  • Embed: https://www.youtube.com/embed/1ejTKov_Sm4
  • Med parametrar: https://www.youtube.com/watch?v=1ejTKov_Sm4&t=120

En enkel PHP-funktion hanterar alla dessa varianter:

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

Funktionen använder endast inbyggda funktioner i PHP: parse_url() bryter ner URL:en i komponenter, parse_str() tolkar query-strängen till en array. Inga externa beroenden.

Steg 4: API-förfrågan och svarstolkning

Vi sätter ihop allt. Vi bygger URL:en genom att ersätta ID och nyckel, gör en GET-förfrågan och avkodar JSON:

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}

Koden är märkbart mer robust än en ren file_get_contents() från en utkastversion. Tillagt: kontroll av ID-extrahering, nätverksfelhantering, JSON-validering, svar på Google API-fel (fältet error), kontroll av tomt svar och ??-fallback-operator för valfria statistikfält.

CURL som ett alternativ

Om direktivet allow_url_fopen är inaktiverat på ditt webbhotell kommer file_get_contents() inte att fungera. Använd i så fall 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('Request failed. HTTP code: ' . $httpCode);
14}

Färdigt bibliotek: madcoda/php-youtube-api

Att skriva ett wrapper manuellt för produktion är extraarbete. För projekt som behöver regelbunden API-interaktion snarare än en engångshämtning finns madcoda/php-youtube-api, ett lättviktigt PHP-wrapper utan externa beroenden. Installation:

1composer require madcoda/php-youtube-api

Användning:

1$youtube = new Madcoda\Youtube(['key' => 'YOUR_KEY']);
2$video = $youtube->getVideoInfo('1ejTKov_Sm4');
3
4echo $video->snippet->title;
5echo $video->statistics->viewCount;

Biblioteket hanterar rutinuppgifter: paginering, återförsök av förfrågningar, formatering av duration från ISO 8601 till ett läsbart format. För engångsskript är det overkill; för en fungerande tjänst är det motiverat.

Videoguiden ovan visar tydligt hela processen: från att aktivera API:et i konsolen till den första lyckade förfrågan. Vi rekommenderar att du tittar på den innan du skriver kod: 15 minuters video sparar en timmes dokumentationsläsning.

PHP-kod på en bildskärm i närbild

⁉️🤔 Vanliga frågor

Hur mycket kostar det att använda YouTube Data API?

Själva API:et är gratis. Du betalar endast med kvot: 10 000 enheter per dag för varje projekt. En förfrågan till /videos kostar 1 enhet, så du kan hämta data om 10 000 videor dagligen utan att spendera en krona. För kommersiella projekt med last över tröskeln erbjuder Google ett formulär för begäran om kvotökning; de godkänner det med adekvat motivering. YouTube Data API har inga separata betalnivåer.

Hur skiljer sig YouTube Data API v3 från HTML-sidtolkning?

API:et returnerar strukturerad JSON med ett dokumenterat schema. När fält ändras publicerar Google ett meddelande om utfasning flera månader i förväg. HTML-tolkning går sönder vid varje omdesign av sidan, kräver webbläsaremulering och är uttryckligen förbjudet enligt avsnitt 3.2 i YouTubes användarvillkor.

Kan jag få data om en privat video?

Med en API-nyckel, endast offentliga videor. För åtkomst till privata, olistade och begränsade videor krävs OAuth 2.0 med ägarens tillstånd. Tekniskt sett är det samma /videos-endpoint, men med en access token istället för en nyckel.

Hur får jag mitt YouTube-kanal-ID?

Det mest pålitliga sättet: YouTube Studio → Settings → Channel → Advanced settings. Där visas YouTube-kanal-ID:t som det är, utan några API-förfrågningar. Alternativt: anropa /channels?part=id&mine=true med en OAuth-token. För kanaler med anpassade användarnamn fungerar metoden /channels?part=id&forUsername=NAME endast för de som skapats före 2014.

Vad ska jag göra när jag får ett "quotaExceeded"-fel?

Den dagliga kvoten återställs kl. 00:00 Pacific Time (UTC-8). Tillfällig lösning: cacha svar på din sida (fil, Redis). För en permanent ökning: Google Cloud Console → IAM & Admin → Quotas → YouTube Data API v3 → requests per day → Edit Quota.

Var kan YouTube Data API tillämpas: slutlig sammanfattning

Vi har täckt hela cykeln: API-nyckel, parameteruppdelning för endpoint, extrahering av video-ID från URL, GET-förfrågan och JSON-svarstolkning. Resultatet är ett fungerande PHP-skript som hämtar titel, statistik, längd och miniatyrer för vilken offentlig video som helst på en sekund.

Vart du kan gå härnäst:

  • Videokort på en webbplats. Integrera skriptet i ett WordPress-backend (save_post-hook) eller Laravel, och när en YouTube-länk läggs till hämtas videoinformation automatiskt.
  • Konkurrentbevakning. En gång om dagen, samla in viewCount och likeCount för en lista med kanaler, så är din dynamiktabell klar.
  • Automatisk import. Om du driver en videoblogg på din egen webbplats, hämta snippet.title och snippet.description som en utkasttextbeskrivning för inbäddning.

YouTube Data API v3 är ett moget, stabilt och gratis verktyg. När du har bemästrat det grundläggande anropet från denna handledning öppnar du dörren till dussintals andra metoder: sökning, spellistor, kommentarer, prenumerationer. 🔗 Officiell YouTube Data API v3-dokumentation