Claude CodeとGitHub Actionsで「毎朝6時に届くAIニュース」を自動生成する仕組みを作った

AIニュースの収集・選別・日本語化・ポッドキャスト化・メール配信までを全自動化した記録。91号の運用実績と、実際にかかった費用の内訳、40日間止まっていた原因まで公開します。

公開 2026-08-25 ・ 最終更新 2026-08-26

毎朝6時、スマホに「今日のAIニュース」が届きます。記事を選んだのも、日本語に要約したのも、音声で読み上げたのも、メールを送ったのも、すべてプログラムです。人間は一切関与していません。

この記事では、その仕組みをどう作ったか、そして89日間動かし続けて実際にいくらかかったかを、包み隠さず公開します。

作ろうと思ったきっかけは、自分の勉強と、生徒さんへの発信のためでした。 毎日AIの最新ニュースを追いかけるのが、だんだん大変になってきたのです。

しばらくは、他の発信者の方が出しているAIニュースに頼っていました。 精度がとても高くて、正直それで十分だったからです。

風向きが変わったのは、Claude Fable が使えるようになってからでした。 自分の用途に合わせてカスタマイズしたニュースサイトのほうが、 明らかに使いやすくなったのです。「既製品より自作のほうが便利」という線を、 AIの性能が越えてきたという実感がありました。

結論:91号を配信して、追加でかかった費用は103円

先に結果からお見せします。

項目 実績
配信したダイジェスト 91号
生成したポッドキャスト 75エピソード
自動で育った用語辞書 79語
Claude API 料金 68円
音声合成(Google TTS)料金 35円
サーバー代 0円(GitHub Pages)
実行環境の費用 0円(GitHub Actions 無料枠)
追加費用の合計 103円

「AIで自動化」と聞くと月数千円かかりそうに思えますが、やり方を選べばほぼ無料で回ります。ポイントは4つです。

  1. 記事の選別と日本語化を Claude Code のサブスクリプション枠で動かす(従量課金APIを使わない)
  2. 音声合成を無料のものに切り替える(edge-tts を使用。Google TTSは最初の8本のみ)
  3. 実行環境とホスティングを無料枠で完結させる(GitHub Actions + GitHub Pages)
  4. 記事の選別を機械任せにせず、AIに「捨てさせる」

4つ目が効きます。当初は取得した50件をそのまま全部載せていましたが、 AIに「AIに実質的に関係する記事だけを残す」と指示して8〜12件に絞ったところ、 読みやすさが劇的に変わりました。自動化の質は、何を出すかより何を捨てるかで決まります。

サブスクリプション枠で動かす方法

Claude Code には claude setup-token というコマンドがあり、 長期トークンを発行して GitHub Actions のシークレットに CLAUDE_CODE_OAUTH_TOKEN として登録すれば、月額プランの枠内で実行できます。

ここで一度ハマりました。環境に古い ANTHROPIC_API_KEY が残っていると、そちらが優先されて認証に失敗します。 有効なトークンを持っていても 401 が返るので、トークンを使うときは API キーを子プロセスの環境から外す必要がありました。

全体の流れ

処理は毎朝1本のスクリプトが順番に実行しています。

① RSS/APIからニュースを収集
      ↓
② キーワードで5カテゴリに分類
      ↓
③ Claude Haiku で日本語タイトル+要約を生成
      ↓
④ HTMLダイジェストを組み立てて保存
      ↓
⑤ 台本を書いて音声合成 → ポッドキャストMP3
      ↓
⑥ GitHubにpush(=サイトが自動更新)
      ↓
⑦ メールで配信

これを GitHub Actions の schedule で毎日叩いているだけです。パソコンの電源は関係ありません。GitHubのサーバーが勝手に動いてくれます。

40日間、気づかずに止まっていた話

正直に書いておきます。この仕組み、途中で40日間まったく動いていませんでした。

原因は障害でも不具合でもなく、GitHub の画面で ワークフローを「Disable」したまま忘れていただけです。 毎朝メールが届かないことに気づくまで、それなりの日数がかかりました。

ここから得た教訓は、動かなくなったことに気づく仕組みまで含めて自動化しないと、 自動化は静かに死ぬということです。実行ログを見に行かないと分からない状態は、 実質的に監視していないのと同じでした。

なぜ「自分のパソコン」で動かさないのか

自動化でつまずきやすいのが、ここです。自分のPCで cron を組むと、PCを閉じている間は動きません。旅行に行けば止まります。

GitHub Actions ならクラウド側で実行されるので、こちらは何もしなくていい。しかもパブリックリポジトリなら実行時間は無料です。

on:
  schedule:
    # UTC 21:00 = 日本時間の翌朝6:00
    - cron: '0 21 * * *'
  workflow_dispatch:   # 手動実行もできるようにしておく

ひとつ落とし穴があります。GitHub Actions は UTC(協定世界時)で動くため、Pythonの中で普通に「今日の日付」を取ると日本時間とズレて前日扱いになります。日本時間基準で日付を確定させる処理を必ず入れてください。

JST = timezone(timedelta(hours=9))
target_date = datetime.now(JST).replace(tzinfo=None)

① ニュースをどこから集めるか

有料のニュースAPIは使っていません。無料のRSSフィードだけで十分な量が集まります。実際に使っているソースは次のとおりです。

RSSは requests で取ってきて xml.etree.ElementTree で解析するだけ。専用ライブラリも不要です。日付の書式がソースごとにバラバラなので、そこだけ複数フォーマットを試す処理を書いておくと安定します。

② 選別と日本語化 ─ ここが品質を決める

最初の実装では、分類をキーワードマッチ、日本語化を Google 翻訳の無料エンドポイントで 処理していました。API 呼び出しがほぼゼロで済むので安上がりだったのですが、 出てくるものがひどかった。

安く済ませた分がそのまま品質に出ていたわけです。ここを Claude に置き換えました。 やらせているのは4つです。

  1. AI に実質的に関係する記事だけを残す(無関係なものを捨てる)
  2. 同じ出来事を報じた記事を1本にまとめる
  3. 翻訳ではなく、日本語の見出しとして書き直す
  4. 「何が起きたか」に加えて「なぜ重要か」まで要約に含める

3番目が肝でした。「翻訳して」と指示すると直訳が返ってきます。 「日本語の見出しとして書き直して。固有名詞は訳さないで」と指示を変えるだけで、 出力の質がまるで変わりました。

要約の精度は高い。でも「レベル感」は合わない

実際に動かしてみて感じたのは、最近のAIの要約そのものは、もう十分に精度が高いということです。 事実関係を取り違えることはほとんどありません。

ただ、ずっと変わらない不満がひとつあります。 誰に向けて書いているのかがはっきりしていないと、レベル感が合わないのです。

同じニュースでも、業界の人に向けた要約と、これから学ぶ人に向けた要約は まったく別物になるはずです。ところが指示を出さないと、AIは 「なんとなく全方位に向けた、誰にも刺さらない中間の文章」を書いてきます。 用語の説明を省くべきか足すべきかの判断ができないからです。

この不満が、次に作る機能の出発点になりました。

③ 専門用語に自動で解説をつける

前の章で書いた「レベル感が合わない」問題への答えが、この機能です。

要約の文章そのもので初心者と中級者の両方を満足させるのは無理があります。 やさしく書けば物足りず、正確に書けば専門用語だらけになる。 だったら、本文は普通に書いて、つまずく語にだけ解説を添えればいい。 読む人が自分の必要な分だけ深く潜れる構造にする、という発想です。

具体的には、記事中の企業名・ツール名・専門用語に自動で解説をつける仕組みを作りました。

用語には色がつき、パソコンならカーソルを乗せると説明が出て、 クリックすると解説ページに飛びます。スマホはカーソルが無いので、 タップすると画面下から解説シートがせり上がる方式にしました。

仕組みとしては、用語辞書のすべての表記ゆれから正規表現を1本組み立て、 本文と照合しているだけです。ただし細かい調整が必要でした。

拾う基準は「日本の中学生が、英語の授業で習う範囲の単語だけで読めるか」に置きました。 中学校でAIの学習が始まる時代なので、そこを下限に据えるのが自然だと考えたからです。 Jalapeño のように読み方から分からない綴りには、カタカナの読みも付けています。

そして辞書は毎朝ひとりでに増えます。記事を選別するついでに、 「今日出てきたが辞書に無い語」を最大5件抽出させて追記しているためです。 88語まで育ちました。

④ ポッドキャスト化 ─ 音声合成は無料でいい

最初の8エピソードは Google Cloud Text-to-Speech(Neural2)を使い、35円かかりました。その後 edge-tts に切り替えて以降の課金はゼロです。

pip install edge-tts

日本語音声の品質は、ニュースの読み上げ用途なら十分実用レベルです。2人の話者を交互に喋らせる「対話形式」にすると、単調な読み上げよりぐっと聴きやすくなります。

音声ファイルを結合するのに ffmpeg が必要ですが、GitHub Actions のランナーでは apt が不安定なことがあります。取得方法を複数用意してフォールバックさせておくと、朝のジョブが謎に落ちる事故を防げます。

⑤ 配信 ─ サイト・RSS・メールの3経路

生成物は3つの経路で届けています。

ここでハマったのが順番です。メールにサイトのリンクを載せるので、pushより先にメールを送ると「まだページが無い」状態でリンクを踏まれます。push → GitHub Pagesのデプロイ完了を待つ → メール送信、の順に固定しました。

作ってみて分かったこと

もともと、朝起きてコーヒーを飲みながらスマホで情報収集をするのが日課でした。 その時間が、自分でカスタマイズした内容になったことで、さらに充実したものになりました。

いちばん大きかったのは、他の発信者の方のブログや音声を巡回しなくて済むようになったことです。 必要な情報が一箇所にまとまっているので、あちこち開いて回る必要がありません。

そしてこれは、思いがけない副産物を生みました。SNSのデトックスになるのです。

情報収集のつもりでXやYouTubeを開くと、目的の情報にたどり着く前に おすすめのタイムラインに時間を持っていかれます。 巡回する必要がなくなると、その入口そのものを踏まなくて済む。 朝の時間が静かになりました。健康的だな、と思います。

これから作る人へ

同じものを作るのに必要なのは、次の3つだけです。

  1. Python の基礎(requests でAPIを叩けて、ファイルを読み書きできればOK)
  2. GitHub Actions の書き方(YAMLを20行ほど。テンプレを写経すれば動きます)
  3. AI の呼び出し方(月額プランがあるなら追加費用なしで組めます)

正直なところ、いちばん難しいのはコードではなく「毎日確実に動き続ける状態を保つこと」でした。RSSが落ちる、APIの仕様が変わる、ランナーの環境が変わる。エラーが出ても止まらない作りにしておくのが、結局いちばん重要です。

ゼロから独学でここまで持っていくのがしんどい場合は、体系立てて学べる講座を一度通しでやってしまうほうが早いこともあります。特に「Pythonは書けるがクラウド実行やAPI連携で毎回詰まる」という段階の人は、独学の遠回りが一番コスト高になりがちです。


この仕組みが毎朝生成しているダイジェストは、実際に公開しています。どんなアウトプットになるのかは、現物を見ていただくのが早いと思います。

あわせて読みたい
AIポッドキャストを毎朝自動生成して4ヶ月。音声代0円で分かった「聴かれる音声」の作り方
台本生成から音声合成、配信までを全自動にしたAIポッドキャストの運用記録。音声代0円の作り方、途中で切れる・棒読みになる

← 毎朝のAIニュースダイジェストを見る