TadFuji/ai-news-bot:用 Gemini 3.8 Flash 每日自动推送日语 AI 新闻
TadFuji/ai-news-bot
TadFuji 开源 ai-news-bot,一条基于 GitHub Actions 的全自动流水线,每天 03:00 抓取 66 个 RSS 源、07:07 由 Gemini 3.8 Flash 完成两段式策展,向 GitHub Pages、LINE、X 三渠道推送日语 AI 朝刊 Top 10。
世界のAIニュースを、朝7時に日本語で届ける完全自動パイプライン
📰 公開ポータル · ⚡ クイックスタート · 🏗️ アーキテクチャ · 🇺🇸 English
📖 概要
世界中の膨大なAIニュースから、日本のビジネスリーダーにとって真に価値のある情報だけを抽出し、日本語で要約・配信する完全自動化パイプラインです。
「情報の海で溺れない、賢明な判断を下すための羅針盤」
サーバー維持費ゼロ — GitHub Actions 上で完結し、GitHub Pages・LINE・X (Twitter) の3チャネルへ毎朝自動配信します。
パイプライン概要
| ステージ | 時刻 (JST) | 処理内容 | 出力 |
|---|---|---|---|
| 収集 | 03:00 | 66の RSSフィードをクロール、キーワードスコアリング | 約100件の候補記事 |
| 1次分析 | 03:00 | Gemini で翻訳・分類・スコアリング・So What分析 | 上位50件 スコアリング済み |
| 2次キュレーション | 07:07 | Gemini 編集キュレーション(テーマ・コメント・重複排除) | 朝刊 Top 10 |
| 配信 | 07:07 | マルチチャネル同時配信 | Web / LINE / X |
| 週刊コラム | 日曜 09:00 | AIが執筆するエッセイ形式のコラム | コラム + LINE配信 |
配信チャネル
- 🌐 GitHub Pages ポータル — ダークモード対応アーカイブ(OGP画像・sitemap.xml・RSS配信・JSON-LD 構造化データ・静的プリレンダリング対応)
- 📱 LINE — Flex Carousel で Top 3 をカード配信(記事ボタン・行動提案・シェア付き)
- 🐦 X (Twitter) — スレッド形式 + OGP画像カード(
X_THREAD_MODEで切替)
🎯 編集方針(Editorial Policy)
AIを単なる翻訳機ではなく、**「AIトレンドアナリスト」**として定義し、以下の3つの基準で情報を厳選します:
- 生存戦略 — 「この技術は私たちの働き方をどう変えるか?」
- リスク管理 — 「教育・著作権・セキュリティの観点で何に注意すべきか?」
- 身近な利便性 — 「LINEやExcelなど、日常ツールがどう進化したか?」
🏗️ アーキテクチャ
GitHub Actions を中核とした、モダンなサーバーレス・アーキテクチャです。
graph TD
subgraph "データソース"
RSS["66 RSS Feeds<br/>(ArXiv, HN, TechCrunch, NHK, 中国メディア, Workspace 等)"]
end
subgraph "Stage 1 — 03:00 JST"
COLLECT["collect_rss_gemini.py<br/>RSS収集 + 時間フィルタ"]
SCORE["キーワードスコアリング<br/>(config.py の AI_KEYWORDS)"]
GEMINI1["ai_client.py<br/>Gemini 1次分析: 翻訳 + 分類"]
end
subgraph "Stage 2 — 07:07 JST"
FRESH["追加RSS収集<br/>(速報キャッチ)"]
DEDUP["3日間の重複排除<br/>(URL ベース)"]
GEMINI2["curate_morning_brief.py<br/>Gemini 2次キュレーション"]
end
subgraph "出力生成"
BUILD["build_pages.py<br/>JSON + latest.json 生成"]
DIST["distribute_daily.py<br/>LINE + X 配信"]
end
subgraph "配信チャネル"
WEB["GitHub Pages"]
LINE["LINE Messaging API"]
X["X / Twitter"]
end
RSS --> COLLECT --> SCORE --> GEMINI1
GEMINI1 -->|"candidates_*.json"| FRESH
FRESH --> DEDUP --> GEMINI2
GEMINI2 -->|"morning_brief_*.json"| BUILD
GEMINI2 -->|"morning_brief_*.json"| DIST
BUILD --> WEB
DIST --> LINE
DIST --> X
style RSS fill:#1e293b,color:#e2e8f0
style GEMINI1 fill:#4f46e5,color:#fff
style GEMINI2 fill:#4f46e5,color:#fff
style WEB fill:#059669,color:#fff
style LINE fill:#06c755,color:#fff
style X fill:#1d9bf0,color:#fff
Loading
耐障害設計
| 機能 | 説明 |
|---|---|
| リトライ | Gemini API 呼び出しを最大2回、指数バックオフで再試行 |
| フォールバック | API障害時は翻訳済みフィールド (title_ja, summary_ja) を使用 |
| ヘルスチェック | フォールバック発動時に LINE 障害通知 + GitHub Actions を赤ステータスに |
| 重複排除 | 3日間のローリングウィンドウで同じ記事の再配信を防止 |
📂 プロジェクト構造
ai-news-bot/
├── .github/workflows/ # GitHub Actions(日次・週次・リント)
│ ├── collect_candidates.yml # Stage 1 (03:00 JST): RSS収集 + 1次分析
│ ├── daily_rss_gemini.yml # Stage 2 (07:07 JST): 朝刊キュレーション + 配信
│ ├── weekly_column.yml # 日曜コラム生成
│ ├── tests.yml # pytest 実行(push/PR)
│ └── lint.yml # ruff によるコード品質チェック
│
├── config.py # RSSソース (66件), AIキーワード, 設定
├── rss_client.py # RSS フィードパーサー
├── article_extractor.py # 記事本文の抽出(trafilatura)
├── dedup.py # 意味的重複排除(Jaccard 類似度)
│
├── collect_rss_gemini.py # Stage 1: 収集 + スコアリング + 1次分析
├── ai_client.py # Gemini API クライアント(プロンプト設計)
├── curate_morning_brief.py # Stage 2: 2次キュレーション + オーケストレーション
├── collect_ai_news.py # xAI Grok 経由のX調査収集(実験的・未自動化)
│
├── build_pages.py # 静的サイト生成(GitHub Pages 用 JSON/HTML)
├── distribute_daily.py # マルチチャネル配信オーケストレーター
├── line_notifier.py # LINE Messaging API(Flex Message 対応)
│
├── generate_weekly_column.py # 週刊コラム(AIエッセイ)生成
├── db_utils.py # データベース共通ユーティリティ
├── save_to_db.py # 国内ニュース → SQLite/MySQL
├── save_global_news.py # グローバルニュース → SQLite/MySQL
├── monitor_models.py # 月次AIモデルリリース監視
│
├── app.py # Streamlit ダッシュボード(管理用)
├── generators/ # OGP画像・PDFレポート・動画生成
├── utils/ # 補助スクリプト(PDF変換等)
├── tests/ # pytest テストスイート
├── ai_news.db # SQLite データベース(蓄積記事)
├── docs/ # GitHub Pages(公開ディレクトリ)
├── output/ # 中間生成物(gitignored)
│
├── .env.example # 環境変数テンプレート
├── requirements.txt # Python 依存関係
├── CONTRIBUTING.md # 貢献ガイドライン
├── HISTORY.md # 変更履歴
├── SECURITY.md # セキュリティポリシー
└── LICENSE # MIT ライセンス
⚡ クイックスタート
前提条件
- Python 3.10 以上
- Google AI Studio API Key(Gemini 用)
インストール
# リポジトリのクローン git clone https://github.com/TadFuji/ai-news-bot.git cd ai-news-bot # 仮想環境の作成 python -m venv .venv source .venv/bin/activate # Linux/macOS # .venv\Scripts\activate # Windows # 依存関係のインストール pip install -r requirements.txt # 環境変数の設定 cp .env.example .env # .env を編集して API キーを設定
環境変数
| 変数名 | 必須 | 説明 |
|---|---|---|
GOOGLE_API_KEY |
✅ | Google AI Studio の API キー(Gemini 用) |
LINE_CHANNEL_ACCESS_TOKEN |
任意 | LINE Messaging API アクセストークン |
LINE_USER_ID |
任意 | LINE 配信先ユーザー/グループ ID |
X_CONSUMER_KEY |
任意 | X (Twitter) API コンシューマーキー |
X_CONSUMER_SECRET |
任意 | X (Twitter) API コンシューマーシークレット |
X_ACCESS_TOKEN |
任意 | X (Twitter) アクセストークン |
X_ACCESS_TOKEN_SECRET |
任意 | X (Twitter) アクセストークンシークレット |
XAI_API_KEY |
任意 | xAI (Grok) API キー(X調査収集を使う場合) |
補足:
X_THREAD_MODEは秘密情報ではなくリポジトリ変数(Settings → Secrets and variables → Variables)です。1を設定するとX投稿をスレッド形式に切り替えます(未設定なら従来の単一投稿)。
ローカル実行
# Stage 1: ニュース収集・分析 python collect_rss_gemini.py # Stage 2: キュレーション・配信 python curate_morning_brief.py # 週刊コラム生成 python generate_weekly_column.py # 管理ダッシュボード起動 streamlit run app.py
GitHub Actions でのデプロイ
- このリポジトリを Fork
- Settings → Secrets → Actions で
GOOGLE_API_KEYを設定 - (任意)LINE / X のクレデンシャルを追加
- 毎日 03:00 と 07:07 JST に自動実行されます
🧠 AI キュレーションの仕組み
Gemini 3.8 Flash を使った2段階キュレーション設計です。
1次分析 — アナリストモード (ai_client.py)
AIに**「シニアAIトレンドアナリスト」**のペルソナを定義。各記事に対して:
- タイトル・要約を自然な日本語に翻訳
- カテゴリ分類(対話型AI / 画像・動画AI / 中国AI / ビジネス活用 / リスク・規制 / 日本市場 / 研究・技術 の7分類)
- So What? 分析(ビジネスインパクトの解説)
- 重要度を 1-10 でスコアリング
2次キュレーション — 編集長モード (curate_morning_brief.py)
AIが編集長として、スコアリング済み候補から最終 Top 10 を選定:
- その日のニュースを一本の物語として繋ぐテーマを生成
- 編集者目線の朝刊コメントを執筆
- 各記事の一言要約とアクションアイテムを作成
- カテゴリの多様性を担保(同一カテゴリ最大3件)
🔧 カスタマイズ
RSS ソースの追加
config.py を編集してフィードを追加:
RSS_FEEDS = [ {"name": "Example", "url": "https://example.com/rss", "region": "米国"}, # 現在 66 フィードを設定済み(米欧中日 / ニュース・ブログ・ラボ公式) ]
AI キーワードの調整
AI_KEYWORDS = [ "artificial intelligence", "machine learning", "LLM", "生成AI", "大規模言語モデル", # 網羅的なキーワードリスト ]
🤝 コントリビューション
バグ報告、新規 RSS ソースの推薦、プロンプト改善提案を歓迎します! 詳細は CONTRIBUTING.md をご覧ください。
特に歓迎する貢献:
- 🌐 新しい RSS フィードソース(日英以外の言語も)
- 🧪 パースやキュレーションロジックのユニットテスト
- 🎨 GitHub Pages の UI 改善
- 📊 分析ダッシュボード機能
📄 ライセンス
MIT License — 詳細は LICENSE を参照してください。
Built with ❤️ by Tad Fuji · Powered by Gemini 3.8 Flash
来源:GitHub · github.com