Node.js での YouTube トランスクリプト: ネイティブfetch、npmインストール不要

これのためにパッケージは必要ありません。Node.jsでYouTubeトランスクリプトを取得することは1つのHTTPSコール、fetchはNode 18以来グローバルであり、エンドポイントは素のJSONを話します。このポストのすべてはpackage.jsonなしの空のディレクトリで実行されます―最後には、任意のYouTube URLの場合、タイトル、公開日、完全なトランスクリプトテキストを返すtranscribe()関数、推測しないエラーハンドリングがあります。
npmレジストリには12ダースのトランスクリプトスクレイパーがあり、同じ運命を共有しています: サーバーのIPを使用してYouTubeから取得し、YouTubeはデータセンターIPをブロックします。ホストされたAPIはそれを完全に回避します。
全体
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));
index.mjsとして保存(トップレベルawaitはESMが必要)、node index.mjsを実行してください。urlパラメータは任意のYouTube URLバリアントまたは裸の11文字ビデオIDを取り、maxCharsは文字起こし長をキャップします―150000はデフォルトと天井の両方なので、テキストがLLMプロンプトに入っているときに削除してください。
まだキーを持っていない? デモを取得:
curl https://youtube2text.org/api/demo-key
{"success":true,"apiKey":"yt_..."}を返します。すべての匿名ユーザーで共有され、月5ビデオあたりIPに制限されることに注意してください―タイヤ キック キー、本番キーではありません。
エラーはJSONなので、そのように扱ってください
すべての失敗には安定したcodeフィールドがあります。分岐する価値のあるもの:
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は全体的なアプローチの正直な制限です: 文字起こしはYouTubeの独自の字幕トラック、手動または自動生成、英語を優先し、存在する言語にフォールバック。字幕が無効にされているビデオは404を返し、再試行することはありません。例外パスではなく、通常のケースとして処理してください。
TypeScript、これがあなたのことなら
レスポンス形状は安定しているため、いくつかのインターフェースはゼロの依存関係で完全なタイプ安全性を取得します:
interface TranscriptResult {
videoId: string;
title: string;
pubDate: string;
content: string;
contentSize: number;
truncated: boolean;
}
interface ApiError {
code: string;
message: string;
status: number;
retryAfterSeconds?: number;
}
bodyを{ result: TranscriptResult } | { error: ApiError }としてタイプし、res.okに絞ります。any、キャストなし。
これが何にプラグインするか
ほとんどの人がNodeからこれを呼び出すことは、トランスクリプトを言語モデルまたはコンテンツパイプラインにフィードしています―トークをドラフトに変えることはYouTubeビデオをブログポストにでカバーされ、エージェントフレームワークがMCPを話す場合、Claude and CodexのためのMCPサーバーを使用してHTTP層を完全にスキップできます。同じエンドポイントはスタックが混在している場合、Pythonから同等に機能します―Pythonバージョンを参照してください。
完全なパラメータとエラーリファレンスはyoutube2text.org/api.mdにあります。マシンが読むために書かれており、副作用として人間にとってはそれほど短いです。