AI-news/README.md
2026-04-17 21:58:37 +09:00

318 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AIニュース
Xのタイムラインから24時間以内のAI関連ニュースを自動収集し、Geminiで分析してSlackに投稿するツールです。
```
┌──────────────────────────────────────────────────────────┐
│ 🤖 24時間以内のAIトレンド │
│ │
│ 🔥 主要なニュース・話題 │
│ ────────────────────────────── │
│ GPT-5.5が発表、ネイティブtool useに対応 │
│ - エージェント時代の到来を示す大型アップデート │
│ - 複数のMCPサーバーを同時接続して自動実行が可能に │
│ │
│ ⚡️ 注目のアップデート │
│ ────────────────────────────── │
│ Cursor Background Agent — 寝ている間にPRを作成 │
│ - コードレビューコメントまで自動付与 │
│ │
│ 💡 技術トレンド │
│ ────────────────────────────── │
│ テスト時計算量スケーリングへのパラダイムシフト │
│ - より大きなモデルからよりスマートな推論へ │
│ │
│ AIニュースで自動生成 │
└──────────────────────────────────────────────────────────┘
```
Slackにはこのようなニュース分析レポートが毎朝届きます。
---
## 全体像
```
┌─────────────┐
│ トリガー │ GitHub Actions
│ (いつ動く) │ → 毎朝 07:30 JST定期実行を有効化した場合
└──────┬──────┘
┌─────────────┐
│ ソース元 │ X旧Twitter
│ (データ) │ → ホームタイムラインから24時間以内のツイートを取得
└──────┬──────┘
┌─────────────┐
│ 処理する場所 │ GitHub Actions 上の Node.js
│ (加工) │ → Gemini でトレンド分析し、構造化JSONに変換
└──────┬──────┘
┌─────────────┐
│ 届ける先 │ Slack
│ (配信) │ → チャンネルにニュース分析レポートを投稿
└─────────────┘
```
---
## 料金について
| サービス | 料金 |
|---|---|
| GitHub Actions | 毎月2,000分無料実行は数分で完了 |
| X APIpay-per-use | Post Read $0.005/件。500件/日×30日 = **約$75/月**。100件/日なら約$15/月 |
| Jina Reader | 無料枠あり1Mトークン、使い切り型 |
| GeminiFlash + Pro | 無料枠で完結1日1回の実行なら超過しない |
| Slack | 無料ワークスペースで可 |
X API 以外は全て無料枠で動きます。X API のコストを抑えたい場合は `src/settings.ts``maxTweets` を 100〜200 に下げてください。
> Jina Reader の無料1Mトークンは**アカウントに対する一括付与で、月次リセットされません**。枯渇してもツール自体は壊れず、ツイート本文だけで分析を続行します。
---
## セットアップ
### 準備するもの
- **GitHub アカウント**
- **Slack ワークスペース**(無料プランで可)
- **Google アカウント**Gemini API キー取得用)
- **Jina AI アカウント**(無料登録)
> このツールは GitHub Actions が全自動で実行します。あなたの PC で `npm install` を実行する必要はありません。
### Part A: ツール本体を GitHub に置く
1. https://github.com/new にアクセス
2. **Repository name**`ai-news` と入力
3. **Private** を選択APIキーの設定を含むため、**必ず Private** にしてください)
4. 「Add a README file」のチェックは**外したまま**にする
5. 「Create repository」をクリック
Cursor で AI に以下のように依頼してください:
> 「このコードを GitHub にpushして。リポジトリは `あなたのユーザー名/ai-news` です」
### Part B: Slack App を作成する
1. https://api.slack.com/apps にアクセスし「Create New App」をクリック
2. 「From scratch」を選択し、アプリ名例: AIニュースとワークスペースを設定
3. 左メニュー「OAuth & Permissions」→ Bot Token Scopes に **`chat:write`** を追加
4. 「Install to Workspace」→ 許可する
5. 表示される **Bot User OAuth Token**`xoxb-` で始まる)をコピー
6. レポートを投稿したいチャンネルにボットを追加(チャンネル設定 → インテグレーション → アプリを追加)
7. チャンネルの **チャンネルID** を確認(チャンネル名を右クリック → チャンネル詳細 → 最下部に表示)
GitHub Secrets に登録:
- `SLACK_BOT_TOKEN` — Bot User OAuth Token`xoxb-...`
- `SLACK_CHANNEL` — チャンネルID`C...`
### Part C: Gemini API キーを取得する
1. https://aistudio.google.com/apikey にアクセス
2. 「Create API Key」をクリック
3. 表示されたキーをコピー
GitHub Secrets に登録:
- `GEMINI_API_KEY` — コピーしたキー
> 無料枠で動きます。クレジットカードの登録は不要です。
### Part D: Jina API キーを取得する
1. https://jina.ai にアクセスし、アカウントを作成(またはログイン)
2. ダッシュボードで API キーを確認
GitHub Secrets に登録:
- `JINA_API_KEY` — コピーしたキー
> 無料枠1Mトークンで動きます。個人の学習・ニュース収集用途なら問題ありません。業務利用する場合は Paid プランjina.ai/pricingへの移行が必要です。
### Part E: モックルートで初回実行
X API の設定なしで動作確認できます。
1. リポジトリの「**Actions**」タブを開く
2. **左サイドバー**から「**Daily AI News**」をクリック
3. 「**Run workflow**」ボタンをクリック
4. **use_sample_data** にチェックを入れる
5. 緑の「**Run workflow**」ボタンをクリック
数分後、Slack にサンプルデータによる分析レポートが届きます。
> ここまでで「Gemini による分析 → Slack 投稿」の流れが確認できました。以降は本番の X 連携に進みます。
---
### Part F: X Developer アプリを作成する
**このツールで一番大変なステップです。** ここを越えれば、あとは動かすだけです。
#### 2026年の X API 料金体系
2026年2月以降、X API は **pay-per-use**(従量課金)型に移行しました。以前の月額 $200 の Basic プランは新規受付を停止しています。
- **初期費用なし**。クレジットカードを登録して、使った分だけ請求される仕組みです
- Post Readツイート取得は 1件あたり $0.005
#### 手順
1. [console.x.com](https://console.x.com/) にアクセスし、自分の X アカウントでログイン
2. 開発者規約が表示されたら内容を確認して同意
3. 左メニューの「クレジット」→「クレジットを購入」で最低 $5 をチャージ
4. プロジェクト名を入力(例: `ai-news`)し、ユースケースを選択
5. アプリケーション名を入力(例: `ai-news-2026`。世界中で一意の名前が必要)
アプリ情報の入力例Use case の Description:
> Personal project to collect AI-related tweets from my timeline and summarize them using Gemini API. The summaries are posted to my private Slack workspace for personal news curation. Non-commercial, personal use only.
6. 左メニュー「アプリ」→ 作成したアプリを開き、**User authentication settingsユーザー認証設定** を入力:
- **アプリの権限**: 「読む」を選択(タイムライン取得だけなので読み取り専用で十分)
- **アプリの種類**: 「ウェブアプリ、自動化アプリまたはボット」を選択
- **コールバックURI / リダイレクトURL必須**: `https://example.com`(このツールでは使わないが空にできない)
- **ウェブサイトURL必須**: `https://example.com`
- 「変更を保存する」をクリック
7. 「**キーとトークン**」タブを開く。このタブには4つのセクションが並んでいるが、**このツールで使うのは2つだけ**。
```
┌─ 使う2つ─────────────────────────────────────┐
│ コンシューマーキー │
│ → API Key / API Key Secret │
│ OAuth 1.0 キー │
│ → アクセストークン / アクセストークンシークレット │
└──────────────────────────────────────────────────┘
┌─ 使わない(触らなくてよい)─────────────────────────┐
│ ベアラートークン │
│ OAuth 2.0 クライアントID・シークレット │
└──────────────────────────────────────────────────┘
```
- **「コンシューマーキー」** セクションの「再生成」をクリック → **API Key****API Key Secret** を即メモ
- **「OAuth 1.0 キー」** セクションの「アクセストークン」の「生成する」をクリック → **Access Token****Access Token Secret** を即メモ
> どちらも画面を閉じるとキーは二度と表示されません。必ず全4つをコピーしてから次に進んでください。
GitHub Secrets に登録:
- `X_CONSUMER_KEY` — 「コンシューマーキー」の API Key
- `X_CONSUMER_SECRET` — 「コンシューマーキー」の API Key Secret
- `X_ACCESS_TOKEN` — 「OAuth 1.0 キー」のアクセストークン
- `X_ACCESS_TOKEN_SECRET` — 「OAuth 1.0 キー」のアクセストークンシークレット
> 申請が通らない場合や時間がかかる場合は、Part E のモックルートで開発・カスタマイズを進めてください。X 連携は後からいつでも有効にできます。
### Part G: 本番ルートで実行
1. リポジトリの「**Actions**」タブを開く
2. 「**Daily AI News**」→「**Run workflow**」
3. **use_sample_data のチェックは外したまま**実行
4. Slack に自分のタイムラインからの本物のニュース分析が届く
### チェックポイント
- [ ] Slack に AI トレンド分析レポートが届いた
- [ ] レポートに自分がフォローしているアカウントの情報が含まれている
---
## 定期実行を有効にする
`.github/workflows/daily-news.yml``schedule` ブロック2行のコメントを外す:
変更前:
```yaml
# schedule:
# - cron: '30 22 * * *' # 毎日 07:30 JST
```
変更後:
```yaml
schedule:
- cron: '30 22 * * *' # 毎日 07:30 JST
```
先頭のスペース(インデント)はそのまま残してください。時刻は UTC で指定します。
---
## テストで動作確認
ツールの核心ロジックが正しく動いているか、テストで確認できます。
```bash
npm test
```
全てのテストが通れば、ツールのロジックは正常です。
設定を変更した後(`src/settings.ts` や `src/analysis/prompts.ts` を編集した後)は、`npm test` を走らせて変更が壊れていないことを確認してください。
---
## カスタマイズ
設定は `src/settings.ts` に集約されています。
### レシピ 1: 分析カテゴリを変える
`src/analysis/schema.ts``tech_trends``design_trends` にリネームし、`src/analysis/prompts.ts` のプロンプトも合わせて変更すると、デザイン系トレンドの分析ツールになります。
### レシピ 2: 特定キーワードだけ分析する
`src/sources/x-timeline.ts` の取得後に以下のフィルタを挿入:
```ts
const filtered = tweets.filter(t => /GPT|Claude|Gemini/i.test(t.text));
```
### レシピ 3: 複数チャンネルに分けて投稿
`src/delivery/slack.ts``main_news``#ai-news`、`tech_trends` は `#ai-tech` のように section ごとにチャンネルを分けられます。
---
## 応用例
4パーツの一部を差し替えると、まったく別のツールになります。
- **ソース元を RSS に差し替える** → 毎朝のニュース要約ツール
- **処理を感情分析に差し替える** → 競合の口コミ見張り番
- **届ける先を Notion に差し替える** → 毎朝の社内ニュースDB
---
## セキュリティ
- **リポジトリは Private に**: API キーを GitHub Secrets に保存しているため、公開リポジトリにしないでください
- **Slack Bot Token**: Bot Token Scopes は `chat:write` のみに制限してください
- **トークンが漏洩した場合**:
- X: console.x.com → アプリ → キーとトークン → 該当セクションの「再生成」で即時失効
- Gemini: aistudio.google.com でキーを削除して再発行
- Slack: api.slack.com でトークンをローテーション
---
## 困ったとき
1. **まず AI に聞く**: Cursor で「セットアップで〇〇のエラーが出ました」と伝えてください
2. **GitHub Actions のログを確認**: Actions タブ → 失敗したジョブ → `[USER-FACING]` の行を読む
3. **エラー別の対処法**: [docs/troubleshooting.md](docs/troubleshooting.md) に主要なエラーと対処法をまとめています
4. **Slack で相談**: ADS Slack の質問チャンネルに投稿してください
---
## 技術スタック
| 項目 | 選定 | 理由 |
|---|---|---|
| 実行基盤 | GitHub Actions | 無料枠で十分、セットアップが簡単 |
| 言語 | TypeScriptNode.js 22 | X API公式SDKがTS対応、型安全 |
| X API | twitter-api-v2 | OAuth 1.0a対応のデファクト |
| URL本文取得 | Jina Reader | LLM最適化されたMarkdown化 |
| AIURL要約 | Gemini 2.5 Flash | 大量処理に適した軽量モデル |
| AI最終分析 | Gemini 2.5 Pro | 高品質な構造化出力 |
| 通知 | Slack APIBlock Kit | 構造化された見やすいレポート |