HomeBlogTranscribePlansAPI Keys

YouTube Transkrypcja API w Python: 10 Linii z requests

Skrypt Python pobierający transkrypcję YouTube jako JSON za pomocą biblioteki requests

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

Jeśli ten traceback Cię tutaj przywiódł, witaj. To standardowy tryb awarii popularnego pakietu pip w momencie, gdy Twój kod opuszcza laptop i ląduje na AWS, GCP lub jakimkolwiek innym adresie IP centrum danych. Ten post pokazuje inną trasę: hostowany interfejs API transkrypcji YouTube, który wywoływasz z Python nic poza requests. Pod koniec będziesz mieć dziesięcioliniowy skrypt, który zamienia każdy URL YouTube w tekst transkrypcji, plus właściwe gałęzie dla limitów szybkości i filmów bez napisów.

Dlaczego biblioteka pip umiera w produkcji

youtube-transcript-api skruba YouTube bezpośrednio z maszyny, która go uruchamia. Lokalnie to dobrze. Wdrażaj to, a detekcja botów YouTube oznacza zakres IP Twojego dostawcy chmury w ciągu dni, czasami minut. Napisałem szczegóły w dlaczego interfejs API transkrypcji YouTube zostaje zablokowany — krótko: kończy się wynajmowaniem serwera proxy mieszkalnego do czytania publicznych napisów, co jest absurdalne.

youtube2text.org robi część skierowaną na YouTube po stronie serwera. Twój kod robi jedno wywołanie HTTPS i otrzymuje JSON z powrotem.

Te dziesięć linii

Nie potrzeba konta do spróbowania — jest punkt końcowy klucza demo:

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])

Parametr url akceptuje dowolny kształt URL YouTube — watch?v=, youtu.be, shorts, embedy — lub gołe 11-znakowe id wideo. Odpowiedź daje Ci videoId, title, pubDate, content, contentSize i flagę truncated.

Jedno zastrzeżenie do tego klucza demo: jest wspólny dla wszystkich i ograniczony do 5 filmów na miesiąc na IP. Fajnie do kopania opon, bezużyteczne do czegokolwiek realnego.

Obsługa 429 i 404 jak dorosły

raise_for_status() jest w porządku dla demo, ale błędy wracają jako ustrukturyzowany JSON z code, w którym możesz się rozgałęzić:

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 zasługuje na chwilę szczerości: transkrypcje pochodzą z YouTube's pasów napisów (ręczny lub autogenerowany), i niektóre filmy po prostu ich nie mają. Żaden API nie może wymyślić tekstu, który nie istnieje — w tych przypadkach potrzebowałbyś rzeczywistej zamiany mowy na tekst, którą porównałem w Whisper vs YouTube captions. Ponowne próby nie pomogą, więc tego nie rób.

maxChars i budżety tokenów LLM

Jeśli transkrypcja zmierza do promptu, zależy Ci na rozmiarze. Transkrypcja trzymiesięcznego podcastu z radością zjedzą 100k tokenów. Parametr maxChars ogranicza wyjście — domyślnie i maksimum to zarówno 150000:

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

W przybliżeniu 4-znaki-na-token regule, maxChars=20000 ląduje około 5k tokenów. Sprawdź result["truncated"], aby wiedzieć, czy masz całą rzecz. Jeśli podłączasz to do rurociągu pobierania zamiast jednego promptu, post integracji LangChain obejmuje prawidłowe dzielenie na fragmenty.

Wyjście z klucza demo

Gdy 5 wspólnych filmów na miesiąc przestaje być wystarczające, zaloguj się za pomocą Google na youtube2text.org/app/keys i utwórz własny klucz — brak numeru telefonu, brak karty kredytowej. Bezpłatny poziom to 5 filmów na miesiąc na klucz; płatne poziomy zaczynają się od 5,99 USD za 50. Te dziesięć linii powyżej się nie zmienia, tylko ciąg w nagłówku.