Skill: tujinsama/viral-topic-finder-claw (version 1.0.0)

--- name: viral-topic-finder-claw description: | 爆款选题发现虾 — 全网热点实时监控与爆款选题挖掘专家。从微博、抖音、知乎、百度、B站等平台抓取热榜数据，智能过滤匹配账号定位，分析爆款内容规律，生成可执行的选题建议，并存入飞书多维表格选题库。 **当以下情况时使用此 Skill**： (1) 用户要求监控热点、找热搜、发现爆款选题 (2) 需要分析同领域高赞内容的选题规律 (3) 需要管理选题库（存档、分类、查询） (4) 需要追踪竞品账号内容策略 (5) 用户提到"热点监控"、"爆款选题"、"热搜"、"选题推荐"、"内容灵感"、"蹭热点"、"流量密码"、"高赞内容"、"竞品分析"、"选题库" (6) 用户说"帮我找找最近有什么热点"、"看看同行发了什么爆款"、"推荐几个选题" --- # 爆款选题发现虾 全网热点实时监控与爆款选题挖掘。 ## 核心工作流 ### 步骤 1：抓取热榜数据 运行抓取脚本获取各平台实时热榜： ```bash # 抓取所有平台（并行） python3 ~/.openclaw/skills/viral-topic-finder-claw/scripts/fetch-hotlist.py all # 抓取单个平台 python3 ~/.openclaw/skills/viral-topic-finder-claw/scripts/fetch-hotlist.py bilibili python3 ~/.openclaw/skills/viral-topic-finder-claw/scripts/fetch-hotlist.py zhihu python3 ~/.openclaw/skills/viral-topic-finder-claw/scripts/fetch-hotlist.py baidu ``` **注意**：微博/抖音/小红书需要 Cookie，在脚本顶部 `COOKIES` 字典中配置。B站、知乎、百度无需 Cookie。 ### 步骤 2：智能过滤与匹配 读取 `references/account-keywords.md` 获取账号定位关键词，对热榜数据进行： - 关键词匹配（核心词必须命中，相关词加权） - 排除关键词过滤 - 热度阈值筛选（优先推送热度 Top 20） - 时效性判断（优先新鲜热点） 如果用户未配置账号定位，直接询问："你的账号主要做什么方向？" ### 步骤 3：爆款内容分析 读取 `references/viral-content-analysis.md` 获取分析框架，对筛选出的热点进行： - 标题结构分析（套用标题公式库） - 内容角度建议（12种角度中选最适合的） - 情绪共鸣点识别（8种情绪触发器） - 时效性评估（参考热点时效性判断表） ### 步骤 4：生成选题推荐 每个热点输出结构化选题卡片： ``` 📌 选题标题（3个备选） 🎯 内容角度：[角度类型] + 具体建议 💡 爆款公式：[套用的标题模板] ❤️ 情绪触发：[主要情绪] + 触发方式 ⏰ 时效窗口：[建议发布时间] 📊 流量潜力：高/中/低 🔧 制作难度：高/中/低 ``` ### 步骤 5：存入飞书选题库（可选） 如果用户要求存档，将选题存入飞书多维表格。 **建表结构**（首次使用时创建）： | 字段名 | 类型 | 说明 | |--------|------|------| | 选题标题 | 文本 | 推荐的选题标题 | | 来源热点 | 文本 | 原始热点词条 | | 来源平台 | 单选 | 微博/抖音/知乎/百度/B站 | | 内容角度 | 单选 | 12种角度之一 | | 流量潜力 | 单选 | 高/中/低 | | 制作难度 | 单选 | 高/中/低 | | 时效截止 | 日期 | 建议最晚发布时间 | | 状态 | 单选 | 待评估/已采纳/已发布/已放弃 | | 创建时间 | 创建时间 | 自动 | 使用 `feishu_bitable_app` 创建多维表格，`feishu_bitable_app_table_record` 批量写入记录。 ## 参考文件 - **平台 API 详情** → `references/platform-hotlist-api.md`（各平台抓取方法、Cookie 配置） - **爆款分析框架** → `references/viral-content-analysis.md`（标题公式、内容角度、情绪触发器） - **账号关键词库** → `references/account-keywords.md`（过滤规则，需用户自定义） ## 常见场景 **场景 A：快速找热点** 用户说"帮我找找最近有什么热点" → 直接运行 `fetch-hotlist.py all`，过滤后输出 Top 5-10 选题卡片。 **场景 B：指定领域** 用户说"找 AI 相关热点" → 运行脚本后，用"AI/人工智能/大模型"等关键词过滤，输出匹配选题。 **场景 C：存入选题库** 用户说"把这些选题存到飞书" → 询问是否已有多维表格，没有则创建，然后批量写入。 **场景 D：竞品分析** 用户说"看看同行最近发了什么爆款" → 询问竞品账号名称/链接，用 `web_search` 搜索其近期内容，套用爆款分析框架输出分析报告。 ## 注意事项 - 热点时效性强，速度比完美更重要，快速给出可执行建议 - 不是所有热点都适合，要结合账号定位过滤 - 最终选题决策由用户判断，AI 只提供建议 - 部分平台（微博/抖音）需要 Cookie，遇到 403 时提示用户配置

path: references/account-keywords.md
content: # 账号定位关键词库

根据账号定位预设的关键词过滤规则。使用前请根据实际账号定位修改本文件。

## 使用说明

本文件是模板，需要根据实际账号定位填写。AI 在过滤热点时会参考这里的规则。

---

## 示例：科技/AI 类账号

### 核心关键词（必须匹配其中之一）
```
AI, 人工智能, ChatGPT, Claude, Gemini, 大模型, LLM, 机器学习, 深度学习,
科技, 互联网, 程序员, 开发者, 产品经理, 创业, 独立开发
```

### 相关关键词（加分项，提升推荐权重）
```
效率工具, 自动化, 编程, 代码, 算法, 数据, 云计算, SaaS, 出海
```

### 排除关键词（包含则过滤掉）
```
明星, 八卦, 娱乐, 综艺, 游戏, 体育, 美食, 旅游, 时尚, 美妆
```

### 高风险话题黑名单（绝对不碰）
```
政治敏感词, 宗教争议, 种族歧视, 违法内容
```

---

## 示例：职场/成长类账号

### 核心关键词
```
职场, 升职, 加薪, 跳槽, 简历, 面试, 副业, 理财, 个人成长, 学习方法
```

### 相关关键词
```
时间管理, 效率, 读书, 技能, 自律, 目标, 习惯
```

### 排除关键词
```
游戏, 娱乐, 八卦, 明星
```

---

## 自定义配置

请在下方填写你的账号定位：

### 账号名称
（填写你的账号名称）

### 账号定位描述
（一句话描述账号定位，如：面向程序员的 AI 工具分享账号）

### 核心关键词
（填写必须匹配的关键词，逗号分隔）

### 相关关键词
（填写加分项关键词，逗号分隔）

### 排除关键词
（填写需要过滤的关键词，逗号分隔）


path: references/platform-hotlist-api.md
content: # 平台热榜数据抓取指南

各大平台热榜数据的抓取方法。

## 微博热搜

```bash
# 实时热搜榜（无需登录）
curl "https://weibo.com/ajax/side/hotSearch" \
  -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
```

返回字段：`realtime[].word`（词条）、`realtime[].num`（热度值）、`realtime[].label_name`（标签：爆/热/新）

## 抖音热榜

```bash
# 抖音热榜（需要 Cookie）
curl "https://www.douyin.com/aweme/v1/web/hot/search/list/?device_platform=webapp&aid=6383" \
  -H "Cookie: YOUR_COOKIE" \
  -H "Referer: https://www.douyin.com/"
```

返回字段：`data.word_list[].word`（词条）、`data.word_list[].hot_value`（热度）

## 知乎热榜

```bash
# 知乎热榜（无需登录）
curl "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50" \
  -H "User-Agent: Mozilla/5.0"
```

返回字段：`data[].target.title`（问题标题）、`data[].detail_text`（热度描述）

## 百度热搜

```bash
# 百度实时热点
curl "https://top.baidu.com/api/board?platform=wise&tab=realtime" \
  -H "User-Agent: Mozilla/5.0"
```

返回字段：`data.cards[0].content[].word`（词条）、`data.cards[0].content[].hotScore`（热度分）

## 小红书热门

小红书无公开 API，建议通过搜索页面抓取：
```bash
# 搜索热门笔记（需要 Cookie）
curl "https://www.xiaohongshu.com/api/sns/web/v1/search/notes?keyword=KEYWORD&page=1&page_size=20&sort=general" \
  -H "Cookie: YOUR_COOKIE"
```

## B站热门

```bash
# B站热门视频（无需登录）
curl "https://api.bilibili.com/x/web-interface/popular?ps=20&pn=1" \
  -H "User-Agent: Mozilla/5.0"
```

返回字段：`data.list[].title`（标题）、`data.list[].stat.view`（播放量）

## 注意事项

- 微博、知乎、百度热搜无需 Cookie，可直接抓取
- 抖音、小红书需要有效 Cookie，建议从浏览器开发者工具获取
- 建议抓取间隔 ≥ 5 分钟，避免被限流
- 部分平台会定期更新反爬策略，如遇 403/429 需更新 Cookie 或 UA


path: references/viral-content-analysis.md
content: # 爆款内容分析模型

基于大量爆款案例总结的内容分析框架，供 AI 分析热点时参考。

## 标题公式库（高点击率模板）

### 疑问式
- `为什么XXX的人越来越多？`
- `XXX真的有用吗？我测试了30天告诉你`
- `你还在用XXX？难怪效果差`

### 对比式
- `用了XXX之后，我的YYY提升了ZZZ%`
- `同样是XXX，为什么他能YYY而你不行？`
- `XXX vs YYY，用了3个月后我选择了...`

### 数字式
- `XXX个让你YYY的方法，第N个最有效`
- `我花了XXX小时，总结出这N条YYY规律`
- `N个月做到XXX，我只做对了这N件事`

### 揭秘式
- `XXX背后没人告诉你的真相`
- `做了N年XXX，我终于明白了...`
- `那些YYY的人，都在偷偷用XXX`

### 共鸣式
- `作为一个XXX，我想说...`
- `终于有人说出了XXX的真相`
- `看完这个，我哭了`

## 内容角度库（12种）

| 角度 | 说明 | 适用场景 |
|------|------|----------|
| 观点型 | 鲜明立场，引发讨论 | 热点事件、行业趋势 |
| 故事型 | 个人经历，情感共鸣 | 成长、转变、失败复盘 |
| 教程型 | 步骤清晰，实操性强 | 技能分享、工具使用 |
| 盘点型 | 合集整理，信息密度高 | 资源推荐、工具清单 |
| 测评型 | 亲测对比，有说服力 | 产品评测、方法对比 |
| 揭秘型 | 反常识，颠覆认知 | 行业内幕、冷知识 |
| 预测型 | 趋势判断，前瞻性 | 行业分析、未来展望 |
| 辟谣型 | 纠正误区，权威感 | 常见错误认知 |
| 案例型 | 真实案例，可信度高 | 成功/失败案例分析 |
| 对话型 | 问答形式，互动感强 | FAQ、用户问题解答 |
| 情绪型 | 强烈情绪，传播力强 | 社会议题、价值观 |
| 数据型 | 数据支撑，专业感强 | 行业报告、调研结果 |

## 情绪共鸣点（8种触发器）

| 情绪 | 触发方式 | 示例关键词 |
|------|----------|-----------|
| 焦虑 | 指出危机/差距 | 落后、被淘汰、错过、来不及 |
| 好奇 | 制造信息缺口 | 秘密、真相、没人知道、原来 |
| 愤怒 | 揭露不公/欺骗 | 骗局、套路、坑、不敢说 |
| 感动 | 温情故事/善意 | 坚持、逆袭、感谢、陪伴 |
| 认同 | 说出心声 | 终于、就是这样、太真实了 |
| 恐惧 | 风险提示 | 危险、警惕、千万别、后悔 |
| 希望 | 正向激励 | 改变、可能、做到、成功 |
| 惊喜 | 超出预期 | 没想到、竟然、原来还能 |

## 传播路径分析

典型爆款传播路径：
1. **首发平台**：通常是微博/知乎（文字类）或抖音/小红书（视觉类）
2. **二次传播**：截图/转发到微信群、朋友圈
3. **破圈路径**：被大V转发 → 登上热搜 → 全平台扩散
4. **长尾效应**：热点过后，相关内容仍有搜索流量

## 热点时效性判断

| 热点类型 | 时效窗口 | 建议响应时间 |
|----------|----------|-------------|
| 突发事件 | 24-48小时 | 2小时内 |
| 娱乐八卦 | 3-7天 | 当天 |
| 社会议题 | 1-2周 | 24小时内 |
| 行业趋势 | 1-3个月 | 3天内 |
| 节日节点 | 固定周期 | 提前1周 |


path: scripts/fetch-hotlist.py
content: #!/usr/bin/env python3
"""
多平台热榜数据抓取脚本
用法：
  python3 fetch-hotlist.py weibo       # 抓取微博热搜
  python3 fetch-hotlist.py douyin      # 抓取抖音热榜（需要 Cookie）
  python3 fetch-hotlist.py zhihu       # 抓取知乎热榜
  python3 fetch-hotlist.py baidu       # 抓取百度热搜
  python3 fetch-hotlist.py bilibili    # 抓取B站热门
  python3 fetch-hotlist.py all         # 抓取所有平台（并行）
"""

import sys
import json
import time
import urllib.request
import urllib.error
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "zh-CN,zh;q=0.9",
}

# 可选：在此填入 Cookie（抖音、小红书需要）
COOKIES = {
    "douyin": "",   # 填入抖音 Cookie
    "xiaohongshu": "",  # 填入小红书 Cookie
}


def fetch_url(url, extra_headers=None):
    req = urllib.request.Request(url, headers={**HEADERS, **(extra_headers or {})})
    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            return json.loads(resp.read().decode("utf-8"))
    except Exception as e:
        return {"error": str(e)}


def fetch_weibo():
    """微博实时热搜（无需 Cookie）"""
    data = fetch_url("https://weibo.com/ajax/side/hotSearch")
    if "error" in data:
        return {"platform": "微博热搜", "error": data["error"], "items": []}
    items = []
    for i, item in enumerate(data.get("data", {}).get("realtime", [])[:20], 1):
        items.append({
            "rank": i,
            "title": item.get("word", ""),
            "hot": item.get("num", 0),
            "label": item.get("label_name", ""),
        })
    return {"platform": "微博热搜", "items": items, "fetched_at": datetime.now().isoformat()}


def fetch_zhihu():
    """知乎热榜（无需 Cookie）"""
    data = fetch_url(
        "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=20",
        extra_headers={"Referer": "https://www.zhihu.com/"}
    )
    if "error" in data:
        return {"platform": "知乎热榜", "error": data["error"], "items": []}
    items = []
    for i, item in enumerate(data.get("data", [])[:20], 1):
        target = item.get("target", {})
        items.append({
            "rank": i,
            "title": target.get("title", ""),
            "hot": item.get("detail_text", ""),
            "url": f"https://www.zhihu.com/question/{target.get('id', '')}",
        })
    return {"platform": "知乎热榜", "items": items, "fetched_at": datetime.now().isoformat()}


def fetch_baidu():
    """百度实时热点（无需 Cookie）"""
    data = fetch_url("https://top.baidu.com/api/board?platform=wise&tab=realtime")
    if "error" in data:
        return {"platform": "百度热搜", "error": data["error"], "items": []}
    items = []
    cards = data.get("data", {}).get("cards", [])
    content = cards[0].get("content", []) if cards else []
    for i, item in enumerate(content[:20], 1):
        items.append({
            "rank": i,
            "title": item.get("word", ""),
            "hot": item.get("hotScore", 0),
        })
    return {"platform": "百度热搜", "items": items, "fetched_at": datetime.now().isoformat()}


def fetch_bilibili():
    """B站热门视频（无需 Cookie）"""
    data = fetch_url("https://api.bilibili.com/x/web-interface/popular?ps=20&pn=1")
    if "error" in data:
        return {"platform": "B站热门", "error": data["error"], "items": []}
    items = []
    for i, item in enumerate(data.get("data", {}).get("list", [])[:20], 1):
        stat = item.get("stat", {})
        items.append({
            "rank": i,
            "title": item.get("title", ""),
            "author": item.get("owner", {}).get("name", ""),
            "views": stat.get("view", 0),
            "likes": stat.get("like", 0),
            "url": f"https://www.bilibili.com/video/{item.get('bvid', '')}",
        })
    return {"platform": "B站热门", "items": items, "fetched_at": datetime.now().isoformat()}


def fetch_douyin():
    """抖音热榜（需要 Cookie）"""
    cookie = COOKIES.get("douyin", "")
    if not cookie:
        return {"platform": "抖音热榜", "error": "未配置 Cookie，请在脚本顶部 COOKIES['douyin'] 填入抖音 Cookie", "items": []}
    data = fetch_url(
        "https://www.douyin.com/aweme/v1/web/hot/search/list/?device_platform=webapp&aid=6383",
        extra_headers={"Cookie": cookie, "Referer": "https://www.douyin.com/"}
    )
    if "error" in data:
        return {"platform": "抖音热榜", "error": data["error"], "items": []}
    items = []
    for i, item in enumerate(data.get("data", {}).get("word_list", [])[:20], 1):
        items.append({
            "rank": i,
            "title": item.get("word", ""),
            "hot": item.get("hot_value", 0),
        })
    return {"platform": "抖音热榜", "items": items, "fetched_at": datetime.now().isoformat()}


PLATFORM_MAP = {
    "weibo": fetch_weibo,
    "zhihu": fetch_zhihu,
    "baidu": fetch_baidu,
    "bilibili": fetch_bilibili,
    "douyin": fetch_douyin,
}


def print_result(result):
    platform = result.get("platform", "未知平台")
    if "error" in result:
        print(f"\n❌ {platform}: {result['error']}")
        return
    items = result.get("items", [])
    print(f"\n📊 {platform}（{len(items)} 条）")
    print("-" * 50)
    for item in items:
        rank = item.get("rank", "?")
        title = item.get("title", "")
        hot = item.get("hot", "")
        hot_str = f"  🔥{hot}" if hot else ""
        print(f"  {rank:2d}. {title}{hot_str}")


def main():
    platform = sys.argv[1] if len(sys.argv) > 1 else "all"

    if platform == "all":
        print(f"🚀 并行抓取所有平台热榜... ({datetime.now().strftime('%H:%M:%S')})")
        results = []
        with ThreadPoolExecutor(max_workers=5) as executor:
            futures = {executor.submit(fn): name for name, fn in PLATFORM_MAP.items()}
            for future in as_completed(futures):
                results.append(future.result())
        for r in sorted(results, key=lambda x: x.get("platform", "")):
            print_result(r)
    elif platform in PLATFORM_MAP:
        print(f"🚀 抓取 {platform} 热榜...")
        result = PLATFORM_MAP[platform]()
        print_result(result)
        # 同时输出 JSON 供管道使用
        print("\n--- JSON ---")
        print(json.dumps(result, ensure_ascii=False, indent=2))
    else:
        print(f"❌ 未知平台: {platform}")
        print(f"支持的平台: {', '.join(PLATFORM_MAP.keys())} 或 all")
        sys.exit(1)


if __name__ == "__main__":
    main()


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)