Transkrip YouTube di Node.js: fetch Asli, Tidak Ada npm Install

Anda tidak perlu paket untuk ini. Mengambil transkrip YouTube di Node.js adalah satu panggilan HTTPS, fetch telah global sejak Node 18, dan endpoint berbicara JSON biasa. Semuanya dalam posting ini berjalan di direktori kosong tanpa package.json — di akhir Anda akan memiliki fungsi transcribe() yang mengembalikan judul, tanggal publikasi, dan teks transkrip lengkap untuk URL YouTube apa pun, dengan penanganan kesalahan yang tidak menebak.
Registri npm memiliki selusin scraper transkrip, dan mereka berbagi nasib: mereka mengambil dari YouTube menggunakan IP server Anda, dan YouTube memblokir IP datacenter. API yang dihosting menghindari itu sepenuhnya.
Seluruh hal
const KEY = process.env.YT2TEXT_KEY;
async function transcribe(videoUrl, maxChars = 150000) {
const qs = new URLSearchParams({ url: videoUrl, maxChars: String(maxChars) });
const res = await fetch(`https://youtube2text.org/api/transcribe?${qs}`, {
headers: { "x-api-key": KEY },
});
const body = await res.json();
if (!res.ok) {
const err = new Error(`${body.error.code}: ${body.error.message}`);
err.code = body.error.code;
err.retryAfterSeconds = body.error.retryAfterSeconds;
throw err;
}
return body.result;
}
const t = await transcribe("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
console.log(`${t.title} — ${t.contentSize} chars`);
console.log(t.content.slice(0, 300));
Simpan sebagai index.mjs (top-level await ingin ESM), jalankan node index.mjs. Parameter url mengambil varian URL YouTube apa pun atau id video 11 karakter bare, dan maxChars membatasi panjang transkrip — 150000 adalah default dan ceiling, jadi pangkas saat teks masuk ke prompt LLM.
Tidak ada kunci lagi? Ambil yang demo:
curl https://youtube2text.org/api/demo-key
Ini mengembalikan {"success":true,"apiKey":"yt_..."}. Peringatkan bahwa itu dibagikan di semua pengguna anonim dan terbatas pada 5 video per bulan per IP — kunci tire-kicking, bukan satu produksi.
Kesalahan adalah JSON, jadi perlakukan demikian
Setiap kegagalan memiliki bidang code stabil. Yang layak cabang pada:
try {
await transcribe("https://youtu.be/xxxxxxxxxxx");
} catch (err) {
switch (err.code) {
case "RATE_LIMIT_EXCEEDED":
console.log(`Back off for ${err.retryAfterSeconds}s, then retry`);
break;
case "TRANSCRIPT_UNAVAILABLE":
console.log("Video has no captions — nothing to fetch, skip it");
break;
case "VIDEO_NOT_FOUND":
case "INVALID_URL":
console.log("Bad input, fix the URL");
break;
default:
throw err; // UNAUTHORIZED, YOUTUBE_ERROR — genuinely unexpected
}
}
TRANSCRIPT_UNAVAILABLE adalah batasan jujur dari seluruh pendekatan: transkrip berasal dari trek caption YouTube sendiri, manual atau auto-generated, Bahasa Inggris disukai dengan fallback ke bahasa apa pun yang ada. Video dengan caption dinonaktifkan mengembalikan 404 dan tidak ada yang perlu dicoba ulang. Tangani sebagai kasus normal, bukan jalur pengecualian.
TypeScript, jika itu hal Anda
Bentuk respons stabil, jadi beberapa antarmuka memberi Anda keamanan jenis penuh tanpa ketergantungan:
interface TranscriptResult {
videoId: string;
title: string;
pubDate: string;
content: string;
contentSize: number;
truncated: boolean;
}
interface ApiError {
code: string;
message: string;
status: number;
retryAfterSeconds?: number;
}
Ketik body sebagai { result: TranscriptResult } | { error: ApiError } dan penyempitan pada res.ok. Tidak ada any, tidak ada casting.
Apa ini plug ke dalam
Sebagian besar orang memanggil ini dari Node memberi makan transkrip ke model bahasa atau pipeline konten — mengubah pembicaraan menjadi draf tercakup dalam YouTube video ke blog post, dan jika kerangka kerja agen Anda berbicara MCP Anda dapat melewati lapisan HTTP sepenuhnya dengan server MCP untuk Claude dan Codex. Endpoint yang sama bekerja identik dari Python jika tumpukan Anda dicampur — lihat versi Python.
Referensi parameter penuh dan kesalahan tinggal di youtube2text.org/api.md. Ini ditulis untuk mesin untuk dibaca, yang sebagai efek samping membuatnya singkat berkat untuk manusia juga.