白井さんが毎朝最新のAI/デザイントレンドを把握できる「情報キャッチアップ専用タブ」をポータルに追加する。
収集テーマ:
収集元:
完成イメージ:
| プラットフォーム | 取得方法 | 費用 | 精度 | 備考 |
|---|---|---|---|---|
| YouTube | YouTube Data API v3(公式) | 無料 | ★★★ | 10,000 units/日。検索1回=100units → 100回/日まで無料 |
| X (Twitter) | Google Custom Search site:x.com | 無料※ | ★★ | 100クエリ/日まで無料。超過時 $5/1,000クエリ |
| Threads | Google Custom Search site:threads.net | 無料※ | ★★ | 同上 |
※ Google Custom Search APIの無料枠は100クエリ/日。本システムの予想使用量は 6クエリ/日(テーマ3×2プラットフォーム)なので常に無料枠内。
site:x.com AIデザイン のように検索すると、Googleのインデックスを通じて公開投稿を取得できる(間接的だが合法的かつ無料)要約はAnthropicのAPIを使わず、Claude Code CLIを非対話モードで呼び出す方式。 claude -p "〇〇して" という形でシェルから自動実行でき、Maxプランの枠内なので追加費用¥0。
【毎朝 8:00 自動・launchd 1本で完結】
① Pythonスクリプト
YouTube文字起こし・X・Threads の本文テキストを取得
→ Supabaseに「生テキスト」として保存
② Claude Code CLI(自動起動)
claude -p "Supabaseの未要約データを読んで要約してSupabaseに書き戻して"
→ 要約完了 → ポータルに反映
※どちらも追加費用¥0(Maxプラン内)
【白井さんは朝ポータルを開くだけ】
→ 要約済みの情報が並んでいる状態
→ 合計費用:月額¥0(Maxプラン契約済みのため)
| API | 取得場所 | 費用 | 所要時間 |
|---|---|---|---|
| YouTube Data API v3 | Google Cloud Console | 無料 | 15分 |
| Google Custom Search API | Google Cloud Console(同じプロジェクトでOK) | 無料 | 5分 |
| カスタム検索エンジンID | Programmable Search Engine | 無料 | 10分 |
合計費用見込み:月額 ¥0(Maxプラン内で完結)
trend_posts)CREATE TABLE trend_posts (
id BIGSERIAL PRIMARY KEY,
platform TEXT NOT NULL, -- 'youtube' / 'x' / 'threads'
topic TEXT NOT NULL, -- 'ai_design' / 'claude_code' / 'ai_general'
title TEXT NOT NULL, -- 動画タイトル or 投稿冒頭テキスト
url TEXT NOT NULL UNIQUE, -- 元記事URL
thumbnail TEXT, -- サムネイルURL(YouTube)
author TEXT, -- 投稿者名
published_at TIMESTAMPTZ, -- 投稿日時
collected_at TIMESTAMPTZ DEFAULT NOW()
);
-- インデックス
CREATE INDEX idx_trend_posts_topic ON trend_posts(topic);
CREATE INDEX idx_trend_posts_platform ON trend_posts(platform);
CREATE INDEX idx_trend_posts_collected_at ON trend_posts(collected_at DESC);
キーワード一致だけでなく、発信者の信頼性 × コンテンツの伸び の2軸でスクリーニングする。
Layer 1: キーワード一致(基本フィルター)
↓ テーマキーワードにマッチする投稿を粗く取得
Layer 2: 発信者フィルター(信頼性)
↓ フォロワー/チャンネル登録者数が一定以上 or ホワイトリスト登録者
↓ ここで低品質アカウントを大量に除外
Layer 3: 伸びスコアフィルター(急上昇判定)
↓ 日あたり再生数・エンゲージメント率でスコアリング
Layer 4: Claude APIによる関連性スコア(オプション)
↓ タイトルを読んで「白井さんの知りたいテーマに合っているか」0〜10点評価
↓ 7点以上のみ保存
YouTube:チャンネル登録者数フィルター(APIで自動取得)
① search.list で動画を取得 → channelId も同時に取得
② channels.list(id=channelId) で subscriberCount を取得
③ 閾値チェック:
- subscriberCount >= 5,000 → 保存対象
- subscriberCount < 5,000 → 除外
④ subscriberCount をスコアに乗算:
登録者10万以上 → スコア×2.0
登録者1万以上 → スコア×1.5
登録者5千以上 → スコア×1.0
X・Threads:ホワイトリスト方式(APIで登録者数が取れないため)
Google Custom Search APIでは投稿者のフォロワー数が取得不可。代わりに:
方法A:信頼アカウント ホワイトリスト
→ 品質の高いAI系インフルエンサーのアカウントリストを設定ファイルに保存
→ 「このアカウントからの投稿のみ」に絞り込む
→ 例: site:x.com/levelsio, site:x.com/AnthropicAI 等
方法B:ドメイン別 Google CSE 設定
→ Programmable Search Engineで「信頼サイトリスト」を事前登録
→ 登録サイトのみから検索(ホワイトリスト管理をGoogleに委譲)
→ 方法Bを採用(運用が楽・クララがCSEの設定ファイルを管理するだけ)
参考:日本語AI系 信頼アカウントリスト(初期設定)
| カテゴリ | X/Threadsアカウント例 |
|---|---|
| Claude Code / Anthropic | @AnthropicAI, @ClaudeAI |
| AI全般(国内) | フォロワー1万以上の生成AI系アカウント |
| AIデザイン | フォロワー5千以上のデザイン×AI系アカウント |
channel_subscribers BIGINT, -- チャンネル登録者数(YouTubeのみ)
quality_score NUMERIC, -- 総合品質スコア(0〜10)
is_whitelisted BOOLEAN DEFAULT FALSE, -- ホワイトリスト発信者か
単に新着や再生数だけでなく、急上昇しているコンテンツを優先して取得する。
伸びスコア = 総再生数 ÷ 公開からの経過日数
取得フロー:
① search.list
→ キーワード + publishedAfter=30日前 + order=viewCount
→ 直近30日以内の動画に絞って再生数順で最大20件取得
② videos.list(統計取得)
→ ①の動画IDをまとめて渡す
→ viewCount・likeCount・publishedAt を取得
③ Python側でスコア計算
views_per_day = viewCount ÷ 経過日数
engagement = likeCount ÷ viewCount
総合スコア = views_per_day × (1 + engagement × 10)
→ スコア上位10件のみ保存
スコア判定例:
| 動画 | 再生数 | 投稿日 | 日あたり再生 | 判定 |
|---|---|---|---|---|
| A | 50万 | 3日前 | 16.7万/日 | ✅ 急上昇 |
| B | 200万 | 180日前 | 1.1万/日 | 普通 |
| C | 10万 | 7日前 | 1.4万/日 | ✅ 伸び中 |
Google Custom Search APIではいいね数・RT数が取得できないため、伸び判定ができない。代わりに:
dateRestrict=d7 パラメータ使用)collect_trends.py
├─ YouTube Data API v3
│ ├─ search.list(キーワード + 直近30日 + 再生数順)
│ ├─ videos.list(統計取得)
│ ├─ 伸びスコア計算(views_per_day × engagement補正)
│ └─ 上位10件 → Supabase保存
├─ Google Custom Search API
│ ├─ site:x.com + キーワード + dateRestrict=d7 → X投稿取得
│ └─ site:threads.net + キーワード + dateRestrict=d7 → Threads投稿取得
└─ Supabase INSERT(重複はURL UNIQUE制約でスキップ)
検索キーワード一覧:
| テーマ | 検索キーワード(日本語・英語) |
|---|---|
| AIデザイン | AIっぽくない デザイン / AI generated design tips / AI LP制作 コツ |
| Claude Code | Claude Code / Claude Code 使い方 / Claude Code tips |
| AI全般 | AI最新情報 / 生成AI 活用 / AI tools 2025 |
Supabaseテーブルに追加するカラム(伸び指標):
views_count BIGINT, -- 再生数(YouTube)
views_per_day NUMERIC, -- 日あたり再生数(YouTubeのみ)
trending_score NUMERIC, -- 伸びスコア(YouTubeのみ)
「📡 トレンド」タブ
├─ フィルターバー
│ ├─ テーマ: [すべて] [AIデザイン] [Claude Code] [AI全般]
│ └─ 媒体: [すべて] [YouTube] [X] [Threads] [🔥急上昇]
└─ 一覧(セクション区切り:急上昇 / テーマ別)
├─ プラットフォームアイコン
├─ サムネイル(YouTube)
├─ タイトル
├─ 1〜2行のフック(白井さんに刺さる一言)
├─ タグ(テーマ・キーワード・急上昇)
└─ クリックで展開
├─ ✦ なぜあなたに刺さるか(常時表示)
├─ [📋 要点] / [📄 詳細記事] タブ切り替え
│ ├─ 要点タブ(デフォルト)
│ │ ├─ 📄 内容まとめ
│ │ ├─ 🎯 要点(番号付き)
│ │ ├─ ✨ 導入すると(色分け4セルグリッド)
│ │ └─ → 試すアクション
│ └─ 詳細記事タブ
│ └─ 元リンクを開かずにポータル内で読める長文記事(背景・詳細解説・白井さんへの示唆)
├─ [💡 ネタストックに追加] ← 押すとSupabase neta_stockに即登録
├─ [やらない] ← カードをグレーアウト
└─ メモ欄(自由記入 → Supabase自動保存)
「💡 ネタストックに追加」ボタンの動作:
neta_stock テーブルにINSERTtitle(タイトル)/ source_url(元URL)/ platform(YouTube等)/ source("trend"固定)/ memo(メモ欄の内容)/ priority("中"デフォルト)/ status("💡ストック中")ジョブ名: com.shirai.trend-collector
実行時刻: 毎朝 8:00 AM
スクリプト: ~/scripts/collect_trends.py
環境変数: YOUTUBE_API_KEY, GOOGLE_CSE_KEY, GOOGLE_CSE_ID
白井さんが必要なのは:なし(すべてクララが実施)
以下はクララが席外し(Playwright)で実施:
security add-generic-password)trend_posts テーブル作成collect_trends.py 作成・テスト定期実行一覧.md 更新make_report.py でHTML変換)D031_トレンド情報収集ポータル/レポート/YYYY-MM-DD_d031-trend-portal-complete.html