Transkriptioner via YouTube Data API: därför misslyckas captions.download

Om du försöker hämta transkriptioner via YouTube Data API har du förmodligen redan gått in i väggen: captions.list returnerar glatt ID:n för undertextspår för vilken video som helst, men i samma ögonblick du anropar captions.download på ett av dem får du 403. Du dubbelkollar din API-nyckel, lägger till scopet youtube.force-ssl, provar OAuth — fortfarande 403. Det här är ingen bugg och inget kvotproblem. Det är avsiktligt, och dokumentationen gömmer undan det viktigaste.
Begränsningen, i exakta ordalag
captions.download kräver en OAuth-token från ett konto som äger videon. Inte vilket autentiserat konto som helst — kanalägaren (eller en innehållsansvarig med rättigheter till den). Captions-endpointerna finns för att kreatörer ska kunna hantera undertextspår på sina egna uppladdningar: ladda upp en .srt, rätta ett stavfel, ta bort en dålig autoöversättning. Att ladda ner undertexter från godtyckliga tredjepartsvideor ingick aldrig i kontraktet.
Felmeddelandet säger det rent ut när man läser det noggrant:
The permissions associated with the request are not sufficient
to download the caption track.
Så den vanliga eskaleringsvägen — API-nyckel → OAuth som dig själv → bredare scopes → servicekonto — leder ingenvart. Varje steg faller på samma ägarskapskontroll. Jag brände en eftermiddag på det här innan jag accepterade det, och att döma av trafiken på Stack Overflow har halva internet gjort detsamma.
Vad captions.list fortfarande duger till
För att vara rättvis mot Data API:et: captions.list fungerar med en vanlig API-nyckel och kostar ungefär 50 kvotenheter. Det berättar vilka spår som finns, deras språk och om de är automatgenererade (trackKind: "asr") eller manuellt uppladdade. Det är genuint användbart som en förhandskontroll — om en video helt saknar spår vet du på förhand att du behöver tal-till-text i stället för undertextextraktion. Data API:et förblir också rätt verktyg för sökning, uppräkning av spellistor och metadata. Det ger dig bara inte transkriptionstexten.
Alternativ 1: hämta undertexter på samma sätt som spelaren
Videospelaren tar uppenbarligen emot undertextdata utan ägarens OAuth-token, och bibliotek som youtube-transcript-api (Python) hämtar den på samma sätt. På din laptop fungerar det bra och tar tre rader.
Brasklappen dyker upp i produktion: YouTube utmanar aggressivt requests från datacenter-IP-intervall. Driftsätt samma tre rader på AWS, GCP eller Heroku och du börjar se "Sign in to confirm you're not a bot" och IpBlocked-fel. Jag har skrivit om det felläget och lösningarna separat i varför youtube-transcript-api blir blockerat i molnet — kortversionen: det går att lösa med residential proxies, men det är ett projekt i sig.
Alternativ 2: ett hostat transkriptions-API
Om du bara vill ha text ur en URL hoppar en hostad endpoint över båda problemen — inget ägarskapskrav, ingen proxybarnvakt. youtube2text.org kör undertexthämtningen bakom roterande residential proxies på serversidan, så din request kommer varifrån den nu kommer:
# grab a free demo key (shared, 5 videos/month per IP)
curl -s https://youtube2text.org/api/demo-key
# fetch a transcript
curl -s "https://youtube2text.org/api/transcribe?url=https://www.youtube.com/watch?v=VIDEO_ID" \
-H "x-api-key: yt_YOUR_KEY"
Svaret är ren JSON:
{"result": {"videoId": "...", "title": "...", "pubDate": "...",
"content": "full transcript text ...", "contentSize": 12345, "truncated": false}}
Om videon helt enkelt saknar undertexter får du TRANSCRIPT_UNAVAILABLE med 404 — samma situation som captions.list skulle ha visat som en tom spårlista, bara upptäckt i ett anrop i stället för två.
Det finns en längre genomgång med felhantering i hämta YouTube-transkriptioner med curl, och en Python-version i migrationsguiden för youtube-transcript-api om requests-baserad kod passar dig bättre.
En vettig kombinerad uppsättning
Vad jag faktiskt skulle bygga i dag, efter att ha slagits med det här från båda hållen:
- Data API för upptäckt — sökning, kanaluppladdningar, spellistor, publiceringsdatum. Det är pålitligt och generöst tilltaget kvotmässigt för metadata.
- En transkriptions-endpoint (hostad, eller egenscrapad med proxies om du gillar sådant) för själva texten.
- Tal-till-text som fallback enbart för videor som helt saknar undertexter.
Att försöka tvinga captions.download att göra mellanjobbet är den enda väg som kategoriskt inte kan fungera för videor du inte äger — inget scope, ingen nyckel och ingen konsolinställning ändrar på det.
Om du vill ha en egen nyckel i stället för den delade demonyckeln sker inloggning enbart med Google på youtube2text.org/app/keys — inget telefonnummer, inget kort. Gratisnivån är 5 videor/månad; betalplanerna börjar på 5,99 USD för 50.