HomeBlogTranscribePlansAPI Keys

YouTube Transkription API i Python: 10 rader med requests

Python-skript som hämtar en YouTube-transkription som JSON med requests-biblioteket

youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video.
YouTube is blocking requests from your IP.

Om det stacktrace ledde dig hit, välkommen. Det är det vanliga felläget för det populära pip-paketet när din kod lämnar din laptop och landar på AWS, GCP eller någon annan datacenterIP. Det här inlägget visar den andra vägen: ett hosted YouTube transkriptions-API som du anropar från Python med bara requests. I slutet har du ett tio-raders skript som förvandlar valfri YouTube URL till transkriptionstext, plus korrekta grenar för hastighetsbegränsningar och videor utan bildtexter.

Varför pip-biblioteket dör i produktion

youtube-transcript-api skrapar YouTube direkt från vilken maskin som kör det. Lokalt är det bra. Distribuera det, och Youtubes botdetektering flaggar din molnleverantörs IP-intervall inom dagar, ibland minuter. Jag skrev de gory-detaljerna i varför YouTube transkriptions-API blir blockerad — kort version: du slutar med att hyra residentiella proxyer för att läsa offentliga bildtexter, vilket är absurt.

youtube2text.org gör YouTube-delen på serversidan. Din kod gör ett HTTPS-anrop och får JSON tillbaka.

De tio raderna

Inget konto behövs för att prova det — det finns en demo-nyckelslutpunkt:

import requests

API = "https://youtube2text.org/api/transcribe"
KEY = requests.get("https://youtube2text.org/api/demo-key").json()["apiKey"]

resp = requests.get(API, params={"url": "https://youtu.be/dQw4w9WgXcQ"},
                    headers={"x-api-key": KEY}, timeout=60)
resp.raise_for_status()
result = resp.json()["result"]
print(result["title"])
print(result["content"][:300])

Parametern url accepterar valfri YouTube URL-form — watch?v=, youtu.be, shorts, inbäddningar — eller ett enkelt 11-teckens video-id. Svaret ger dig videoId, title, pubDate, content, contentSize och en truncated flagga.

En varning om den demo-nyckeln: den delas mellan alla och är begränsad till 5 videor per månad per IP. Bra för att testa, användbara för ingenting riktigt.

Hantera 429 och 404 som en vuxen

raise_for_status() är bra för en demo, men fel kommer tillbaka som strukturerad JSON med en code som du kan grena på:

import time

resp = requests.get(API, params={"url": video_url},
                    headers={"x-api-key": KEY}, timeout=60)
body = resp.json()

if resp.status_code == 200:
    transcript = body["result"]["content"]
elif resp.status_code == 429:
    time.sleep(body["error"]["retryAfterSeconds"])  # then retry
elif resp.status_code == 404:
    if body["error"]["code"] == "TRANSCRIPT_UNAVAILABLE":
        transcript = None  # video exists, but has no captions — skip it
    else:
        raise ValueError(f"No such video: {video_url}")  # VIDEO_NOT_FOUND
else:
    raise RuntimeError(body["error"]["message"])

TRANSCRIPT_UNAVAILABLE förtjänar ett ögonblick av ärlighet: transkriptioner kommer från Youtubes bildtextspår (manuella eller automatiskt genererade), och vissa videor har helt enkelt inte en. Inget API kan skapa text som inte finns — för dem skulle du behöva verklig tal-till-text, som jag jämförde i Whisper vs YouTube-bildtexter. Att försöka igen hjälper inte, så gör det inte.

maxChars och LLM-tokenbudgetar

Om transkriptionen är på väg in i en prompt bryr du dig om storlek. En tre-timmars podcasttranskription äter glatt upp 100k-token. Parametern maxChars begränsar utmatningen — standard och maximum är båda 150000:

resp = requests.get(API,
    params={"url": video_url, "maxChars": 20000},
    headers={"x-api-key": KEY}, timeout=60)

Med tumregeln ungefär 4-tecken-per-token hamnar maxChars=20000 runt 5k-token. Kontrollera result["truncated"] för att veta om du fick hela saken. Om du kopplar detta till en hämtningspipeline i stället för en enda prompt, täcker LangChain-integrationsinlägget chunking ordentligt.

Komma bort från demo-nyckeln

När 5 delade videor per månad slutar räcka till, logga in med Google på youtube2text.org/app/keys och skapa din egen nyckel — inget telefonnummer, inget kreditkort. Den fria nivån är 5 videor per månad per nyckel; betalningsnivåer börjar på $5,99 för 50. De tio raderna ovan förändras inte, bara strängen i headern.