入门 | 15 分钟 | 掌握跨平台情报收集,调研效率翻倍
TIP
last30days-Skill 是目前 ClawHub 上最全面的 AI 调研类 Skill,支持 10+ 信号源并行搜索,自动去重评分,生成带引用的事实性报告。
GitHub: mvanhorn/last30days-skill
目标读者画像
- 1-5 年经验开发者
- 日常需要做 AI 工具选型、竞品调研、技术趋势追踪
- 有一定命令行基础,熟悉 Claude Code 或 Codex CLI
- 希望摆脱"刷 Reddit/HN 找信息"的碎片化流程
核心依赖与环境
| 依赖 | 说明 | 必须 |
|---|---|---|
| Node.js 18+ | Skill 运行环境 | 是 |
| Python 3.10+ | 主脚本语言 | 是 |
| ScrapeCreators API Key | Reddit/TikTok/Instagram 三合一 | 是 |
| 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 # 24h 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 三平台的统一入口,一个 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 的 Value
# 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+ 信号源。一次搜索最多耗时 2-8 分钟,niche 话题时间更长。
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 (带来源链接)
...
报告会自动:
- 收敛检测:多个平台同时提到的内容权重更高
- 去重处理:语义相似的帖子只保留最优一条
- 时效衰减:越新的内容排名越靠前
- 引用标注:每条结论都附有原始链接
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 分两步走:
# scripts/lib/openai_reddit.py(简化版)
def search_reddit(query: str, days: int = 30) -> list[dict]:
# 第一步:用 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
)
# 第二步:拉取原始帖子 JSON,获取真实点赞/评论数
enriched = reddit_enrich.fetch_threads(response.urls, days)
return enriched
TIP
v2.9 之后 Reddit 默认走 ScrapeCreators,一个 Key 覆盖 Reddit + TikTok + Instagram 三平台,比之前的独立方案更稳定。
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()
# 五因子评分模型
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. 跨平台收敛加分(多平台同时提到 → 权重 bonus)
convergence_score = detect_convergence(item, all_results)
# 5. 时效衰减(每天乘以 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 最酷的功能之一——直接对比两个工具:
/last30days cursor vs windsurf
或者命令行:
python3 ~/.claude/skills/last30days/scripts/last30days.py \
"cursor vs windsurf" \
--emit=compact
4.2 并行三路调研机制
对比模式会触发三次独立调研:
# scripts/lib/score.py(对比模式分支)
def run_comparative_mode(query_a: str, query_b: str, base_query: str):
# 三路并行搜索
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 leads in community engagement and code completion quality.
Windsurf excels in contextual understanding for complex refactors.
**Recommendation**: Use Cursor for daily coding; Windsurf for architecture planning.
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 Session 启动自动校验
v2.9.5 新增了 Session 启动时的配置检查。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-你的key" >> ~/.config/last30days/.env
Q3: 搜索很慢(超过 10 分钟)
原因:默认最多并行 10 个来源,niche 话题需要更多 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 on scripts
原因:shell 脚本没有执行权限。
解决:
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_你的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 里的权重是硬编码的,如果你对某个来源有特殊偏好,可以 fork 之后修改:
# 把 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 pipeline):
# 生成带引用的 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