入門 | 15 分 | クロスプラットフォームの情報収集をマスターし、調査効率を倍増させる
TIP
last30days-Skill は、現在 ClawHub で最も包括的な AI 調査用 Skill です。10 以上のシグナルソースを並行検索し、自動的な重複排除とスコアリングを行い、引用付きの実証的なレポートを生成します。
GitHub: mvanhorn/last30days-skill
対象読者イメージ
- 実務経験 1〜5 年のデベロッパー
- 日常的に AI ツールの選定、競合調査、技術トレンドの追跡が必要な方
- 基本的なコマンドライン操作ができ、Claude Code や Codex CLI に慣れている方
- Reddit や Hacker News を巡回して情報を探す「断片的なプロセス」から脱却したい方
必須依存関係と環境
| 依存関係 | 説明 | 必須 |
|---|---|---|
| Node.js 18+ | Skill の実行環境 | はい |
| Python 3.10+ | メインスクリプト言語 | はい |
| ScrapeCreators API Key | Reddit/TikTok/Instagram 統合 API | はい |
| Claude Code または Codex CLI | Skill の実行基盤 | はい |
| X AUTH_TOKEN / CT0 | X 検索認証(オプション) | いいえ |
| Bluesky App Password | Bluesky 検索(オプション) | いいえ |
| Polymarket Gamma API | 予測市場データ(無料) | いいえ |
プロジェクト構造ツリー
last30days-skill/
├── SKILL.md # Skill 定義ファイル(~/.claude/skills/ にデプロイ)
├── SPEC.md # 完全な技術仕様ドキュメント
├── CLAUDE.md # Claude Code 開発ガイドライン
├── scripts/
│ ├── last30days.py # Python メインエントリ(リサーチエンジン)
│ ├── sync.sh # デプロイ同期スクリプト
│ └── lib/
│ ├── __init__.py # パッケージエントリ
│ ├── env.py # 環境変数の読み込み
│ ├── dates.py # 日付範囲と信頼度の計算
│ ├── cache.py # 24時間 TTL キャッシュ
│ ├── http.py # 標準ライブラリ HTTP クライアント
│ ├── models.py # OpenAI/xAI モデルの自動選択
│ ├── openai_reddit.py # Reddit 検索(OpenAI Responses API)
│ ├── xai_x.py # X 検索(xAI Responses API)
│ ├── reddit_enrich.py # Reddit 投稿の詳細メトリクス取得
│ ├── hackernews.py # Hacker News(Algolia 無料 API)
│ ├── polymarket.py # Polymarket 予測市場(Gamma API)
│ ├── bluesky.py # Bluesky/AT Protocol 検索
│ ├── truthsocial.py # Truth Social 検索
│ ├── normalize.py # 生レスポンス → 標準 Schema 変換
│ ├── score.py # マルチシグナル・スコアリングモデル
│ ├── dedupe.py # ニア重複検知
│ ├── render.py # Markdown / JSON レポート描画
│ └── schema.py # 型定義とバリデーション
├── skills/last30days/
│ └── last30days.sh # Shell ラッパー(Claude Code Skill エントリ)
└── fixtures/ # テスト用フィクスチャデータ
Step 1 インストールと認証設定
1.1 Claude Code プラグインによるインストール(推奨)
すでに Claude Code を使用している場合は、プラグインコマンドで完結します:
/plugin marketplace add mvanhorn/last30days-skill
/plugin install last30days@last30days-skill
または公式ツール ClawHub を使用してインストールします:
clawhub install last30days-official
WARNING
プラグインによるインストールには、Claude Code のバージョンが /plugin コマンドをサポートしている必要があります。まず claude --version が 1.0 以上であることを確認してください。
1.2 手動 Git Clone によるインストール
プラグインを使いたくない場合は、ローカルに直接クローンします:
# Claude Code の skills ディレクトリにクローン
git clone https://github.com/mvanhorn/last30days-skill.git \
~/.claude/skills/last30days
# ディレクトリに移動してファイルを確認
cd ~/.claude/skills/last30days
ls -la scripts/
1.3 ScrapeCreators API Key の設定(必須)
これは Reddit/TikTok/Instagram の 3 プラットフォーム統合エントリであり、1 つの Key ですべて対応可能です:
- scrapecreators.com にアクセスして登録し、API Key を取得します。
- 設定ファイルを作成します:
mkdir -p ~/.config/last30days
cat > ~/.config/last30days/.env << 'EOF'
# 必須:Reddit + TikTok + Instagram 統合 Key
SCRAPECREATORS_API_KEY=sc_xxxxxxxxxxxxxxxxxxxx
# オプション:OpenAI API(Codex ログイン後は省略可能)
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
EOF
chmod 600 ~/.config/last30days/.env # 機密ファイルの保護
1.4 X / Bluesky のオプション認証設定
X 検索(推奨方法):
# 1. x.com にログインし、ブラウザの DevTools (F12) を開く
# 2. Application → Cookies → auth_token と ct0 の値をコピー
# 3. .env に書き込む
cat >> ~/.config/last30days/.env << 'EOF'
# X 検索認証(cookie 方式)
AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxx
CT0=xxxxxxxxxxxxxxxxxxxx
# X 代替案:xAI API(cookie 不要)
XAI_API_KEY=xai-xxxxxxxxxxxxxxxxxxxx
EOF
Bluesky 検索:
# 1. bsky.app/settings/app-passwords でアプリパスワードを作成
# 2. .env に書き込む
cat >> ~/.config/last30days/.env << 'EOF'
# Bluesky/AT Protocol
BSKY_HANDLE=yourhandle.bsky.social
BSKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx
EOF
TIP
X の cookie と Bluesky のパスワードはオプションです。手間をかけたくない場合は、無料の Polymarket、Hacker News、Reddit を利用するだけで、ほとんどのシナリオをカバーできます。
1.5 インストールの成功確認
# 簡単なテストを実行(--mock はローカルテストデータを使用し、API クォータを消費しません)
python3 ~/.claude/skills/last30days/scripts/last30days.py "Claude Code tips" --mock --emit=compact
以下のような出力が表示されれば、正常に動作しています:
=== last30days Report: Claude Code tips ===
Sources: reddit, hackernews | Time: 2026-03-25 | Mode: mock
[results...]
Step 2 基本的な使い方
2.1 /last30days コマンドライン
Claude Code 内で直接コマンドを入力します:
/last30days best Claude Code prompts
Codex CLI の場合:
python3 ~/.claude/skills/last30days/scripts/last30days.py "best Claude Code prompts" --emit=compact
TIP
デフォルトでは直近 30 日間のトレンドコンテンツを検索します。Reddit、X、YouTube、TikTok、Instagram、Hacker News、Polymarket、Bluesky など 10 以上のソースを網羅します。1 回の検索に通常 2〜8 分かかりますが、ニッチなトピックではさらに時間を要する場合があります。
2.2 レポート構造の解説
実行後、以下のような構造化レポートを受け取ります:
# last30days Report: best Claude Code prompts
## Sources Searched (6 active)
reddit | x | hackernews | polymarket | youtube | reddit_threads
## Top Findings
...
## Best Practices (コミュニティで検証済みの手法)
...
## Prompt Pack (そのままコピー可能)
...
## Recent Developments
...
## References (ソースリンク付き)
...
レポートは自動的に以下の処理を行います:
- 収束検知:複数のプラットフォームで同時に言及されているコンテンツの重みを高くします。
- 重複排除:意味的に類似した投稿は、最適な 1 つだけを保持します。
- 鮮度減衰:新しいコンテンツほど上位にランク付けされます。
- 引用の明記:すべての結論にオリジナルリンクを付与します。
2.3 --quick クイックモード
急いでいる場合は、--quick を追加して一部のディープ検索をスキップします:
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"Cursor AI vs Windsurf" \
--quick \
--emit=compact
2.4 --days=N カスタム期間設定
30 日だけでなく、期間をカスタマイズできます:
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"OpenClaw latest news" \
--days=7 \
--emit=compact
2.5 --refresh キャッシュの強制リフレッシュ
デフォルトでは結果が 24 時間キャッシュされます。再検索したい場合:
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"AI code editors comparison" \
--refresh \
--emit=compact
Step 3 マルチソース並行検索メカニズム
3.1 Reddit 検索の原理
Reddit は最も重要なシグナルソースです。Skill は 2 段階で実行されます:
# scripts/lib/openai_reddit.py(簡略版)
def search_reddit(query: str, days: int = 30) -> list[dict]:
# ステップ1:OpenAI Responses API + web_search で初期調査を行う
response = openai.responses.create(
model="gpt-4o",
input=f"Find active Reddit discussions about: {query}",
tools=[{"type": "web_search"}],
max_tokens=2000
)
# ステップ2:オリジナルの投稿 JSON を取得し、実際の「いいね」/コメント数を取得する
enriched = reddit_enrich.fetch_threads(response.urls, days)
return enriched
TIP
v2.9 以降、Reddit はデフォルトで ScrapeCreators を使用します。1 つの Key で Reddit + TikTok + Instagram の 3 プラットフォームをカバーし、以前の独立したソリューションよりも安定しています。
3.2 Hacker News の統合
無料でアクセスでき、API Key は不要です:
# scripts/lib/hackernews.py
def search_hackernews(query: str, days: int = 30) -> list[dict]:
# HN Algolia API は無料で公開されている
url = "https://hn.algolia.com/api/v1/search"
params = {
"query": query,
"tags": "story",
"numericFilters": f"created_at_i>{cutoff_timestamp(days)}"
}
resp = requests.get(url, params=params)
items = resp.json()["hits"]
# points + num_comments で総合的にソート
return sorted(items, key=lambda x: x["points"] + x["num_comments"] * 2, reverse=True)
3.3 Polymarket 予測市場データ
これは last30days が他の調査ツールと一線を画す核心的な特徴です。「人々が何を言っているか」だけでなく、「人々がいくら賭けているか」も確認します:
# scripts/lib/polymarket.py
def search_polymarket(query: str) -> list[dict]:
# Gamma API は無料でアクセス可能
url = "https://gamma-api.polymarket.com/markets"
resp = requests.get(url, params={"topic": query, "limit": 20})
markets = resp.json()
# 5因子スコアリングモデル
for m in markets:
m["composite_score"] = (
m["text_relevance"] * 0.30 +
m["volume_24h"] * 0.30 +
m["liquidity"] * 0.15 +
m["price_velocity"] * 0.15 +
m["outcome_competitiveness"] * 0.10
)
return sorted(markets, key=lambda x: x["composite_score"], reverse=True)
実際の効果:「OpenClaw」を検索すると、Reddit の投稿だけでなく、Polymarket 上の「OpenClaw 月間アクティブユーザー数」に関する予測市場データも表示されます。身銭を切って賭けられたオッズは、どの投稿よりも説得力があります。
3.4 マルチシグナル・スコアリングモデルの解析
すべてのソースからの結果は、統一されたスコアリング・パイプラインに集約されます:
# scripts/lib/score.py
def compute_composite_score(item: dict, query: str, days: int) -> float:
# 1. テキスト関連性(双方向の類似度 + 類義語拡張)
text_score = bidirectional_similarity(item["text"], query)
# 2. エンゲージメント速度の正規化
engagement_score = normalize_velocity(item["engagement"])
# 3. ソースの権威性重み付け(HN > Reddit > X > TikTok)
authority_score = SOURCE_WEIGHTS[item["source"]]
# 4. クロスプラットフォーム収束ボーナス(複数で言及されている場合に加算)
convergence_score = detect_convergence(item, all_results)
# 5. 鮮度減衰(1日ごとに 0.98 の指数関数的減衰)
recency_score = 0.98 ** days_since_post(item["timestamp"])
return (
text_score * 0.35 +
engagement_score * 0.25 +
authority_score * 0.20 +
convergence_score * 0.10 +
recency_score * 0.10
)
v2.5 のブラインドテスト・スコアは、v1 の 3.73/5.0 から 4.38/5.0 に向上し、約 17% 改善されました。
Step 4 比較モード(X vs Y)
4.1 「Cursor vs Windsurf」のケース
last30days の最もクールな機能の 1 つが、2 つのツールを直接比較することです:
/last30days cursor vs windsurf
またはコマンドライン:
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"cursor vs windsurf" \
--emit=compact
4.2 並行 3 ルート調査メカニズム
比較モードでは、3 つの独立した調査がトリガーされます:
# scripts/lib/score.py(比較モード分岐)
def run_comparative_mode(query_a: str, query_b: str, base_query: str):
# 3つのルートで並行検索
results_a = run_research(query_a) # ルート1:Cursor のみ検索
results_b = run_research(query_b) # ルート2:Windsurf のみ検索
results_base = run_research(base_query) # ルート3:両者の比較議論を検索
# サイドバイサイドの比較レポートを生成
return render_comparison(results_a, results_b, results_base)
4.3 比較レポートの読み方
出力されるレポート形式は以下のようになります:
## Comparative Analysis: Cursor vs Windsurf
### Strengths
| Dimension | Cursor | Windsurf |
|---|---|---|
| コード補完速度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| コンテキスト理解 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 複数ファイル編集 | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| コミュニティ・エコシステム | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
### Weaknesses
| Dimension | Cursor | Windsurf |
|---|---|---|
| メモリ使用量 | 高 | 中 |
| オフラインサポート | 悪い | 良い |
### Community Sentiment (30-day)
- Cursor: 78% positive (1,240 discussions)
- Windsurf: 65% positive (890 discussions)
### Data-Driven Verdict
Cursor はコミュニティのエンゲージメントとコード補完の品質でリードしています。
Windsurf は複雑なリファクタリングにおけるコンテキスト理解に優れています。
**Recommendation**: 日常的なコーディングには Cursor、アーキテクチャ設計には Windsurf を推奨します。
Step 5 他の Skill / CI パイプラインへの組み込み
5.1 コンテキスト注入として利用
他の Skill から last30days の調査結果を直接参照できます:
## Recent Research Context
!python3 ~/.claude/skills/last30days/scripts/last30days.py \
"your research topic" \
--emit=context
5.2 ファイルからコンテキストを読み込む
## Research Context
!cat ~/.local/share/last30days/out/last30days.context.md
5.3 JSON 出力を CI/CD に統合
調査結果を自動化パイプラインに注入します:
# プログラムで利用するために JSON 形式で出力
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"best LLM for code review 2026" \
--emit=json > research.json
# 推奨される Top 3 モデルを確認
python3 -c "
import json
data = json.load(open('research.json'))
for r in data['top_results'][:3]:
print(f\"- {r['title']} (score: {r['score']:.2f})\")
"
5.4 プロジェクトレベルの .env による上書き
グローバル設定をしたくない場合は、プロジェクトのルートディレクトリに .claude/last30days.env を配置すると、グローバル設定が上書きされます:
mkdir -p .claude
cat > .claude/last30days.env << 'EOF'
# このプロジェクトにのみ適用される API Key
SCRAPECREATORS_API_KEY=sc_project_specific_key
OPENAI_API_KEY=sk-project-specific-key
EOF
TIP
これはチームでの共同作業時に非常に有用です。各メンバーが自分の Key を使いつつ、Skill の動作を統一できます。
5.5 セッション開始時の自動チェック
v2.9.5 では、セッション開始時の構成チェックが追加されました。Claude Code の起動ごとに、.env の設定が完全であるか自動的に検証されます:
# 手動で検証を実行
python3 ~/.claude/skills/last30days/scripts/last30days.py \
--validate-config
必要な Key が不足している場合は、明確なヒントが表示されます:
❌ SCRAPECREATORS_API_KEY is missing (required)
✅ OPENAI_API_KEY found
⚠️ BSKY_HANDLE is missing (optional)
よくあるトラブルシューティング
Q1: 実行時に SCRAPECREATORS_API_KEY 欠落のエラーが出る
原因:環境変数が正しく読み込まれていません。
解決策:
# Key の存在を確認
cat ~/.config/last30days/.env | grep SCRAPECREATORS_API_KEY
# プラグインでインストールした場合は、手動同期を試す
bash ~/.claude/skills/last30days/scripts/sync.sh
Q2: X 検索が常に空の結果を返す
原因:AUTH_TOKEN / CT0 cookie が期限切れ、または無効です。
解決策:
# 1. x.com に再ログインする
# 2. 最新の auth_token と ct0 をコピーし直す
# 3. .env を更新する
# または xAI API の代替案(cookie 不要)を利用する
echo "XAI_API_KEY=xai-your-key" >> ~/.config/last30days/.env
Q3: 検索が非常に遅い(10 分以上かかる)
原因:デフォルトで最大 10 個のソースを並行検索しており、ニッチなトピックでは API のリトライが多く発生します。
解決策:
# 1. --quick を使用してディープ検索の一部をスキップする
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"niche topic" \
--quick
# 2. タイムアウトが頻発しているソースがないか確認する
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"topic" \
--sources=reddit # Reddit のみを検索し、デバッグを高速化
Q4: Polymarket が関連性のない市場を返す
原因:Polymarket のトピックマッチングはキーワードに基づいており、一部のトピックにはアクティブな市場がありません。
解決策:
# キーワード拡張を手動で指定する
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"AI coding assistant" \
--polymarket-tags="artificial intelligence,llm,gpt" \
--emit=compact
Q5: Claude Code でスクリプトの Permission denied が出る
原因:シェルスクリプトに実行権限がありません。
解決策:
chmod +x ~/.claude/skills/last30days/skills/last30days.sh
chmod +x ~/.claude/skills/last30days/scripts/last30days.py
Q6: レポートの Reddit 投稿が少ないが、実際には Reddit で大量の議論がある
原因:v2.9 以降、デフォルトで ScrapeCreators を使用します。Key は設定されているが形式が正しくない可能性があります。
解決策:
# ScrapeCreators Key が有効か検証する
curl -H "x-api-key: sc_your-key" \
https://api.scrapecreators.com/v1/reddit/search?q=test
# Key は有効だがデータがない場合は、OpenAI 代替に切り替わっていないか確認する
# .env に以下を追加して ScrapeCreators の使用を強制する
echo "FORCE_SCRAPECREATORS=1" >> ~/.config/last30days/.env
拡張リーディング / 応用方向
1. スコアリングモデルの調整
scripts/lib/score.py 内の重みはハードコードされています。特定のソースを優先したい場合は、フォークして修正できます:
# Hacker News の権威性重みを 0.20 から 0.35 に上げる
SOURCE_WEIGHTS = {
"hackernews": 0.35, # ↑ 0.20 から変更
"reddit": 0.25,
"x": 0.15,
"polymarket": 0.15,
"youtube": 0.10,
}
2. カスタムソースの追加
GitHub Issues や LinkedIn を追加したい場合は、hackernews.py のインターフェース仕様を参考に、scripts/lib/ 下に新しいモジュールを作成し、last30days.py で登録します。詳細は SPEC.md を参照してください。
3. 定期調査の自動化
cron を使用して定期的に調査を実行し、リサーチライブラリを自動更新します:
# 毎日午前 8 時に "AI tools weekly" の調査を実行
0 8 * * * python3 ~/.claude/skills/last30days/scripts/last30days.py \
"AI developer tools weekly" \
--days=7 \
--emit=md \
--output ~/Documents/Last30Days/ai-tools-weekly-$(date +\%Y-\%m-\%d).md
4. ナレッジベースとの連携
調査結果を個人のナレッジベース(RAG パイプライン)に直接注入します:
# 引用付きの context を生成し、別の Skill に渡す
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"Claude Code advanced techniques" \
--emit=context > ~/.knowledge/last30_context.md
関連リソース
- GitHub: mvanhorn/last30days-skill
- ClawHub: last30days-official
- ScrapeCreators API: scrapecreators.com
- OpenClaw 公式サイト: openclaw.ai
- Hacker News Algolia API: hn.algolia.com/api
- Polymarket Gamma API: gamma-api.polymarket.com