HomeBlogTranscribePlansAPI Keys

RSSとAPI 1つで作るYouTubeチャンネルニュースレターの自動化

RSSフィードのエントリがスクリプトを通ってメールニュースレターのダイジェストになる様子

YouTubeチャンネルのニュースレター自動化に必要なのは、きっかり3つの部品だけです。YouTubeがすべてのチャンネルにひっそりと公開しているRSSフィード、文字起こしAPI、そしてcronジョブ。私の月曜朝のダイジェスト — 自分のニッチ分野の6チャンネルを、サムネイルのタイトルではなく実質のある内容で要約したもの — は、約40行のPythonで4か月間ノーメンテナンスで動き続けています。その作り方を紹介します。

YouTubeが宣伝していないRSSフィード

すべてのチャンネルには、次のURLでフィードがあります。

https://www.youtube.com/feeds/videos.xml?channel_id=CHANNEL_ID

チャンネルIDを調べるには、チャンネルページを開いてソースを表示し、channelId を検索します。フィードは最新のアップロード(おおむね直近15本)を公開日付きで返します — APIキーもOAuthもYouTube Data APIのクォータも不要です。これがパイプライン全体のトリガーになります。

スクリプト

フィードをポーリングし、直近7日分に絞り、文字起こしして、要約します。

import feedparser, requests
from datetime import datetime, timedelta, timezone

CHANNELS = ["UC_channel_id_1", "UC_channel_id_2"]
API_KEY = "yt_your_key"
cutoff = datetime.now(timezone.utc) - timedelta(days=7)

videos = []
for cid in CHANNELS:
    feed = feedparser.parse(
        f"https://www.youtube.com/feeds/videos.xml?channel_id={cid}")
    for e in feed.entries:
        published = datetime(*e.published_parsed[:6], tzinfo=timezone.utc)
        if published < cutoff:
            continue
        r = requests.get("https://youtube2text.org/api/transcribe",
            params={"url": e.link, "maxChars": 60000},
            headers={"x-api-key": API_KEY}, timeout=60).json()
        if "result" in r:
            videos.append(r["result"])

result には titlepubDate、そして最大60,000文字の content が含まれます。話し言葉にして約45分ぶんで、ダイジェスト要約には十分すぎる量です。各動画をお好みのLLMに、意図的に地味なプロンプトで渡します。

Summarize this video transcript for a newsletter digest.
Three sentences, no hype, end with one concrete takeaway
a reader can act on. Video: {title}
{content}

要約を連結し、リンクを添え、お好みのメールツールに流し込んで(私は素のSMTP呼び出しを使っています)、スケジュールを設定します: 0 7 1 python3 /home/you/digest.py

クォータの計算

週2本ペースの6チャンネルで、月におよそ48〜50本の文字起こしになります。$5.99のベーシックプラン(月50本)でギリギリ収まります — これを気持ちいいと感じるかヒヤヒヤすると感じるかは性格次第です。チャンネルの投稿頻度が高いなら、$9.99のプロプラン(500本)でその不安は消えます。無料プランの月5本は、単一チャンネルのダイジェスト — たとえば自分の登録者に今週のアップロードのまとめを送る用途 — に向いています。

2つの失敗モード

どちらもタイミングの問題で、どちらも正直に対処する価値があります。1つ目: cronジョブの1時間前に公開された動画は、まだ字幕の処理が終わっていないことがあり、APIは TRANSCRIPT_UNAVAILABLE を返します。私はそれらのIDをログに残して次回の実行でリトライし、取りこぼさないようにしています — ダイジェストを週の締めから1日遅らせて実行するのも有効です。2つ目: RSSフィードには最近のアップロードしか載らないため、毎日投稿するチャンネルを月1回のペースでポーリングすると、動画を静かに取りこぼします。私が試したどのチャンネルでも週1回のポーリングで安全でした。1日2本を超えて投稿するソースがあるなら、週2回ポーリングしてください。

スクリプトを保守したくない場合は

同じパイプラインは、RSSトリガーノードを持つノーコードツールでも組めます。n8n版Make版がそれぞれ手順を丁寧に解説しています。3文のダイジェストより濃い動画ごとの紹介文がほしいなら、ショーノートのプロンプトがこのループにそのまま組み込めます。

youtube2text.org/app/keys でGoogleサインインすれば1分足らずでキーが手に入ります — カードも電話番号も不要です。あなたの月曜の受信トレイが、ようやく働き始めます。