318 lines
15 KiB
Markdown
318 lines
15 KiB
Markdown
# 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 API(pay-per-use) | Post Read $0.005/件。500件/日×30日 = **約$75/月**。100件/日なら約$15/月 |
|
||
| Jina Reader | 無料枠あり(1Mトークン、使い切り型) |
|
||
| Gemini(Flash + 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 | 無料枠で十分、セットアップが簡単 |
|
||
| 言語 | TypeScript(Node.js 22) | X API公式SDKがTS対応、型安全 |
|
||
| X API | twitter-api-v2 | OAuth 1.0a対応のデファクト |
|
||
| URL本文取得 | Jina Reader | LLM最適化されたMarkdown化 |
|
||
| AI(URL要約) | Gemini 2.5 Flash | 大量処理に適した軽量モデル |
|
||
| AI(最終分析) | Gemini 2.5 Pro | 高品質な構造化出力 |
|
||
| 通知 | Slack API(Block Kit) | 構造化された見やすいレポート |
|