YouTube Transcript API di Python: 10 Baris dengan requests

youtube_transcript_api._errors.IpBlocked:
Could not retrieve a transcript for the video.
YouTube is blocking requests from your IP.
Jika traceback itu yang membawa Anda ke sini, selamat datang. Itu adalah mode kegagalan standar dari paket pip populer tersebut begitu kode Anda meninggalkan laptop dan mendarat di AWS, GCP, atau IP datacenter lainnya. Tulisan ini menunjukkan rute lain: YouTube transcript API yang di-hosting, yang Anda panggil dari Python hanya dengan requests. Di akhir tulisan Anda akan punya skrip sepuluh baris yang mengubah URL YouTube apa pun menjadi teks transkrip, plus cabang penanganan yang benar untuk rate limit dan video tanpa caption.
Mengapa library pip itu mati di produksi
youtube-transcript-api melakukan scraping YouTube langsung dari mesin mana pun yang menjalankannya. Secara lokal itu tidak masalah. Deploy, dan deteksi bot YouTube menandai rentang IP penyedia cloud Anda dalam hitungan hari, kadang menit. Saya menuliskan detail lengkapnya di mengapa YouTube transcript API diblokir — versi singkatnya: Anda berakhir menyewa residential proxy demi membaca caption publik, yang absurd.
youtube2text.org mengerjakan bagian yang menghadap YouTube di sisi server. Kode Anda membuat satu panggilan HTTPS dan mendapat JSON kembali.
Sepuluh barisnya
Tidak perlu akun untuk mencobanya — ada endpoint demo key:
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])
Parameter url menerima bentuk URL YouTube apa pun — watch?v=, youtu.be, shorts, embed — atau video id 11 karakter saja. Responsnya memberi Anda videoId, title, pubDate, content, contentSize, dan flag truncated.
Satu catatan tentang demo key itu: ia dipakai bersama oleh semua orang dan dibatasi 5 video per bulan per IP. Cukup untuk coba-coba, tidak berguna untuk hal yang serius.
Menangani 429 dan 404 secara dewasa
raise_for_status() cukup untuk demo, tetapi error dikembalikan sebagai JSON terstruktur dengan code yang bisa Anda cabangkan:
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 layak mendapat sedikit kejujuran: transkrip berasal dari track caption YouTube (manual atau otomatis), dan sebagian video memang tidak memilikinya. Tidak ada API yang bisa menyulap teks yang tidak ada — untuk itu Anda butuh speech-to-text sungguhan, yang saya bandingkan di Whisper vs caption YouTube. Mencoba lagi tidak akan membantu, jadi jangan.
maxChars dan anggaran token LLM
Jika transkrip akan masuk ke prompt, ukurannya penting bagi Anda. Transkrip podcast tiga jam dengan senang hati melahap 100 ribu token. Parameter maxChars membatasi output-nya — default dan maksimum keduanya 150000:
resp = requests.get(API,
params={"url": video_url, "maxChars": 20000},
headers={"x-api-key": KEY}, timeout=60)
Dengan aturan kasar 4 karakter per token, maxChars=20000 berarti sekitar 5 ribu token. Periksa result["truncated"] untuk tahu apakah Anda mendapatkan semuanya. Jika Anda merangkai ini ke pipeline retrieval alih-alih satu prompt tunggal, tulisan integrasi LangChain membahas chunking dengan benar.
Lepas dari demo key
Ketika 5 video bersama per bulan tidak lagi cukup, masuk dengan Google di youtube2text.org/app/keys dan cetak key Anda sendiri — tanpa nomor telepon, tanpa kartu kredit. Paket gratis 5 video per bulan per key; paket berbayar mulai dari $5,99 untuk 50. Sepuluh baris di atas tidak berubah, hanya string di header-nya saja.