HomeBlogTranscribePlansAPI Keys

youtube-transcript-api blockerat? Så fixar du IP-bannlysningar på AWS/GCP

Python-traceback som visar ett IpBlocked-fel från youtube-transcript-api på en molnserver

Skriptet gick felfritt på din laptop i veckor. Sedan driftsatte du det — Lambda, en EC2-maskin, Cloud Run, en Heroku-dyno, spelar ingen roll — och varenda anrop till youtube-transcript-api dör nu med något i stil med:

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

Eller webbläsarvarianten av samma vägg: "Sign in to confirm you're not a bot." Inget i din kod har ändrats. Biblioteket är inte trasigt. Din IP-adress är problemet.

Varför det bara går sönder i produktion

youtube-transcript-api fungerar genom att hämta undertextdata på samma sätt som YouTube-spelaren gör — ingen API-nyckel, bara HTTP-requests till YouTube. YouTube tolererar det från hemuppkopplingar, vilket är varför lokal utveckling känns problemfri. Men IP-intervallen för AWS, GCP, Azure och Heroku är allmänt kända, och YouTube utmanar generellt all trafik från de ASN:en. Det spelar ingen roll att du gör tre requests om dagen; blockeringen gäller nätverkskvarteret, inte ditt beteende. Starta om instansen, skaffa en ny elastisk IP, driftsätt om funktionen — du hamnar på en annan adress från samma blockerade pool.

Det här är värt att ta till sig, för den första instinkten (lägg till retries, lägg till fördröjningar, rotera user agents) hjälper inte. Signalen YouTube nycklar på är varifrån paketen kommer.

Fix 1: kör egna residential proxies

Biblioteket stöder detta direkt — det levereras med WebshareProxyConfig och en GenericProxyConfig för valfri leverantör. Dirigera requests genom residential-IP:n så upphör blockeringarna för det mesta. Det fungerar på riktigt; det är så alla som scrapar YouTube i skala överlever.

Den ärliga kostnadskalkylen, dock:

Om du redan kör proxyinfrastruktur för annan scraping är det rimligt att haka på det här. Om transkriptioner är det enda du behöver skriver du upp dig på att driva en proxyflotta för att stödja ett enda funktionsanrop.

Fix 2: anropa en endpoint som redan utkämpar den här striden

youtube2text.org sköter rotationen av residential proxies på serversidan, så din molnfunktion gör en tråkig HTTPS-request till ett vanligt API. Migreringen är nästan en sök-och-ersätt.

Före:

from youtube_transcript_api import YouTubeTranscriptApi

transcript = YouTubeTranscriptApi().fetch(video_id)
text = " ".join(snippet.text for snippet in transcript)

Efter:

import requests

r = requests.get(
    "https://youtube2text.org/api/transcribe",
    params={"url": video_id},          # full URLs work too
    headers={"x-api-key": "yt_YOUR_KEY"},
)
text = r.json()["result"]["content"]

För att prova innan du skapar konto, hämta den delade demonyckeln — curl -s https://youtube2text.org/api/demo-key — som tillåter 5 videor/månad per IP. Fel returneras som strukturerad JSON med koder värda att hantera: TRANSCRIPT_UNAVAILABLE (404) betyder att videon verkligen saknar undertexter — ingen blockering, och ingen proxy löser det; RATE_LIMIT_EXCEEDED (429) innehåller en retry-ledtråd. En mer komplett Python-genomgång finns i Python-integrationsguiden.

Vilken fix är rätt för dig

En egen nyckel (skild från den delade demokvoten) kräver en Google-inloggning på youtube2text.org/app/keys — gratisnivån är 5 videor/månad, betalplaner från 5,99 USD/månad för 50 videor upp till 19,99 USD obegränsat. Inget telefonnummer, inget kort för gratisnivån.