git:20260604.cdf46a5 to git:20260604.cf3fe8e

90 added, 193 removed. Audit A to A.

---
name: douyin-search
- description: 抖音爆款作品查询工具。根据用户输入的关键词搜索抖音热门爆款作品,结果以表格展示。当用户想要查找抖音热门内容、搜索抖音爆款视频、查询抖音作品数据、了解某类内容在抖音的表现时使用。触发词包括:抖音爆款、抖音热门、抖音热榜、抖音作品查询、抖音搜索、爆款视频、热门视频。
+ description: 抖音爆款作品查询工具。根据关键词搜索抖音热门爆款作品,支持按日期范围筛选,结果以结构化表格展示。当用户查找抖音热门内容、搜索抖音爆款视频、查询抖音作品数据时使用。触发词:抖音爆款、抖音热门、抖音热榜、抖音作品查询、抖音搜索、爆款视频、热门视频。
---
# 抖音作品查询
- ## 鉴权
-
- ### 获取 API Key
-
- 请前往 [红狐hub](https://redfox.hk/settings/api-keys?source=github) 获取API KEY
-
- ### 配置 API Key
+ ## 📝 简介
- 方案1: 以OpenClaw为例,将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中,部分内容如下:
+ 根据关键词搜索抖音热门爆款作品,支持按日期范围筛选,返回点赞、评论、分享、收藏、发布时间等互动数据,结果以结构化表格展示。
- ```bash
- { "env": { "REDFOX_API_KEY": "ak_xxxx..." } }
- ```
+ ## ✨ 功能特性
- 方案2: 终端配置
+ | 功能模块 | 能力描述 | 核心价值 |
+ |---------|---------|---------|
+ | 爆款搜索 | 关键词搜索抖音爆款作品 | 精准发现高热度内容 |
+ | 日期筛选 | 支持按日期范围筛选 | 定位特定时间段的热门内容 |
+ | 智能拓展 | 泛化词自动拓展为 10 个细分词 | 避免泛化词搜索结果偏差 |
+ | 热门推荐 | 无结果时推荐热门作品和话题 | 兜底保障不空手而归 |
+ | 可点击链接 | 作品标题以超链接格式输出 | 一键跳转查看原作品 |
+ | 订阅推送 | 支持关键词每日推送 | 定时获取最新爆款动态 |
- ```bash
- export REDFOX_API_KEY="ak_xxxx..."
- ```
+ ## 🔑 鉴权
- ## 工作流程
+ - 获取 API Key:前往 [红狐hub](https://redfox.hk/settings/api-keys?source=github)
+ - 配置方式1:写入 `~/.openclaw/openclaw.json` → `{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }`
+ - 配置方式2:终端执行 `export REDFOX_API_KEY="ak_xxxx..."`
- ### Step 1: 用户意图理解(查询脚本前)
+ ## ⚙️ 工作流程
- **⚠️ 核心规则:应该语义理解,优先提取用户描述中的细分方向词,而非泛化的大类词**
+ ### Step 1: 🔍 用户意图理解
- **1. 判断用户是否提到赛道关键词**:
- - **无赛道关键词**(如"最近的热门作品有哪些"、"最近有什么热门内容"、"看看热门数据")→ 直接调用脚本,关键词传空字符串 `""`,查询全站热门
- - **有赛道关键词** → 继续提取和判断
+ **⚠️ 核心规则:优先提取细分方向词,而非泛化的大类词**
- **2. 提取精确搜索关键词**(仅当用户提到赛道时执行):
- - **分析用户描述**:从用户自我介绍或需求描述中提取明确的细分领域词
- - 示例分析:
- - 用户输入:"我是一个文艺类自媒体万粉抖音博主,平时会发小众电影审美积累、书评、乐评、港台文化等相关内容,帮我找电影领域热门话题"
- - 分析结果:用户提到的细分方向 = 小众电影、书评、乐评、港台文化
- - 将前文场景和"电影"相关,得到细分词 = 小众电影、港台电影、电影乐评
- - 搜索关键词:小众电影、港台电影、电影乐评
- - ❌ 错误做法:只提取泛化词「电影」去搜索
+ | 用户输入 | 处理方式 |
+ |---------|--------|
+ | 无赛道关键词("最近热门作品") | 关键词传空字符串 `""`,查询全站热门 |
+ | 有细分词("职场穿搭"、"减脂餐") | 直接搜索,无需拓展 |
+ | 有泛化词("穿搭"、"美食") | 执行拓展策略(Step 2) |
- **3. 关键词类型判断**(仅当提取到关键词时执行):
- - **细分词/垂直赛道**(含具体场景/属性修饰的词,如"职场穿搭"、"减脂餐"、"小个子穿搭")→ 直接搜索,无需拓展询问
- - **泛化词/分类**(纯大类词,如"穿搭"、"美食"、"美妆",无任何修饰)→ 执行拓展策略(Step 2)
- - **判断原则**:有修饰词(场景/人群/风格/意图)= 细分词,直接搜索;无修饰词 = 泛化词,需要拓展
+ 细分词判断原则:有场景/人群/风格/意图修饰 → 细分词;纯大类无修饰 → 泛化词。
- ### Step 2: 泛化词拓展策略
+ **提取精确关键词**:从用户描述中提取细分领域词,而非泛化词。例:用户说"帮我找电影领域热门话题"且自称"小众电影、港台文化" → 搜索"小众电影、港台电影、电影乐评",❌ 而非只搜"电影"。
- **泛化词处理流程(⚠️ 必须等待用户明确回复后再调用脚本!)**:
+ ### Step 2: 🔄 泛化词拓展策略
- **第一步:生成细分词**(禁止调用脚本搜索数据)
- - 拓展词生成原则:
- - **词的大小适中**:词语不要加组合,避免过细(如"中产穿搭"太细,查不到数据)
- - **必须覆盖不同场景**:趋势词、人群词、场景词、意图词各 2-3 个
- - 输出示例:
- ```
- 我识别到「中产」是较大的分类,已查询近期热门趋势,推荐以下细分方向:
- 老钱,轻奢,品质生活,松弛感,高级感穿搭,体面,法式穿搭,律师,医生,品质家居
- 回复「拓展」将同时搜索这 10 个词,回复「不拓展」将继续搜索「中产」
- ```
+ **⚠️ 必须等待用户明确回复后再调用脚本!**
- **第二步:等待用户回复**
- - ❌ **禁止**:用户未回复时调用脚本
- - ✅ **正确**:只等待用户明确回复「拓展」或「不拓展」后再执行
+ | 步骤 | 操作 |
+ |------|------|
+ | 1. 生成细分词 | 生成10个适中大小的细分词(趋势词、人群词、场景词、意图词各2-3个),禁止调用脚本 |
+ | 2. 等待用户回复 | 用户未回复时禁止调用脚本 |
+ | 3. 执行 | 回复「拓展」→ 10词以英文逗号连接,仅调用一次脚本;回复「不拓展」→ 搜索原关键词 |
- **第三步:根据用户明确回复执行**
- - 用户回复「拓展」 → 将 10 个细分词以英文逗号 `,` 连接为一个字符串(不加空格),**仅调用一次脚本**传入(如 `"老钱,轻奢,品质生活"`),禁止逐个词多次调用
- - 用户回复「不拓展」或「继续」 → 调用脚本搜索原关键词
- - 用户未回复或回复其他内容 → 识别对应意图
+ 输出示例:
+ ```text
+ 我识别到「中产」是较大的分类,推荐以下细分方向:
+ 老钱,轻奢,品质生活,松弛感,高级感穿搭,体面,法式穿搭,律师,医生,品质家居
+ 回复「拓展」将同时搜索这10个词,回复「不拓展」将继续搜索「中产」
+ ```
- ### Step 3: 调用搜索接口
+ ### Step 3: 📡 调用 API 接口
**3.1 时间解析规则**
- 在调用脚本前,需判断用户 query 中是否包含时间信息,并解析为 `startDate` 和 `endDate` 参数:
-
- - **默认值**:`startDate` 和 `endDate` 均为空字符串 `""`,表示不限定时间范围
- - **需要解析时间的场景**:用户 query 中包含明确的时间表达,例如:
- - 绝对日期:`2025年6月1日`、`2025-06-01`、`6月1号` → 解析为 `2025-06-01`
- - 相对日期:`昨天`、`前天`、`最近3天`、`最近一周`、`最近7天` → 根据当前日期计算
- - 日期范围:`6月1日到6月3日`、`上周` → 分别解析为 startDate 和 endDate
- - 模糊时间:`最近的`、`最新的` → **不解析为日期**,保持默认空字符串,由接口返回最新数据
+ | 用户输入 | 解析方式 | 示例 |
+ |---------|---------|------|
+ | 绝对日期 | 解析为 `YYYY-MM-DD` | `6月1号` → `2026-06-01` |
+ | 相对日期 | 基于当前日期计算 | `最近7天` → start=7天前, end=今天 |
+ | 日期范围 | 分别解析为 startDate/endDate | `5月30日到6月2日` |
+ | 模糊时间 | **不解析**,保持默认空字符串 | `最近的`、`最新的` |
- - **解析规则**:
- - 仅解析绝对日期或明确相对日期,不解析模糊时间词
- - 日期格式统一为 `YYYY-MM-DD`
- - 若用户只提到单个日期(如`6月1日`),则 `startDate` = `endDate` = 该日期
- - 若用户提到时间范围(如`最近7天`),则 `startDate` = 范围起始日,`endDate` = 范围结束日(今天)
- - 年份省略时默认取当前年份
+ - `startDate`/`endDate` 默认空字符串,表示不限定时间
+ - 单日期 → startDate = endDate;年份省略取当前年份
**3.2 执行脚本**
- 根据时间解析结果,构建脚本调用命令:
-
- **无时间参数时**:
```bash
+ # 无时间参数
python3 ~/.qoderwork/skills/douyin-search/scripts/search_douyin.py "<关键词>"
- ```
- **有时间参数时**:
- ```bash
+ # 有时间参数
python3 ~/.qoderwork/skills/douyin-search/scripts/search_douyin.py "<关键词>" --start-date <startDate> --end-date <endDate>
```
- 仅传入非空的时间参数,空字符串的参数无需传入(脚本默认值为空字符串)。
-
- 脚本返回 JSON 对象,包含以下字段:
-
- | 字段 | 说明 |
- | ------------------ | ---------------- |
- | articles | 搜索匹配的作品列表(按点赞数降序) |
- | latestHotArticles | 近期热门推荐作品列表 |
- | hotTopics | 热门话题列表 |
-
- 每条作品(articles / latestHotArticles)包含字段:
+ 仅传入非空的时间参数。脚本返回 JSON:
- | 字段 | 说明 |
- | -------------- | -------- |
- | title | 作品标题 |
- | author | 作者名称 |
- | like_count | 点赞数 |
- | comment_count | 评论数 |
- | share_count | 分享数 |
- | collect_count | 收藏数 |
- | work_url | 作品链接 |
- | publish_time | 发布时间 |
- | follower_count | 粉丝数 |
+ | 字段 | 说明 |
+ |------|------|
+ | articles | 搜索匹配的作品列表(按点赞数降序) |
+ | latestHotArticles | 近期热门推荐作品列表 |
+ | hotTopics | 热门话题列表 |
- ### Step 4: 判断搜索结果并展示
+ 每条作品字段:`title`、`author`、`like_count`、`comment_count`、`share_count`、`collect_count`、`work_url`、`publish_time`、`follower_count`
- 根据 `articles` 数量选择不同的展示策略:
+ ### Step 4: 📊 结果展示
- #### 情况 A:articles 数量 > 0(有匹配结果)
+ **⚠️ 总数校验**:展示的 N 必须取自 `articles` 数组长度,禁止人工计数。
- **A1. 告知用户数据查询范围**
+ #### 情况 A:articles > 0
- 首先输出一句提示,告知用户本次查询的范围:
+ **A1.** 输出查询范围:
> 📊 关键词「**XXX**」共匹配到 **N 条**抖音爆款作品,以下是详细数据:
- **⚠️ 总数校验规则**:N 必须直接取自脚本返回 JSON 中 `articles` 数组的长度(`len(articles)`),禁止人工计数或估算,确保总数准确无误。
-
- **A2. 展示作品表格(默认前 20 条)**
-
- 将 `articles` 渲染为 Markdown 表格,默认展示前 **20 条**(按点赞数降序),格式如下:
+ **A2.** 展示前 20 条表格:
```markdown
- | # | 作品标题 | 作者 | 点赞数 | 评论数 | 分享数 | 收藏数 | 发布时间 |
- | --- | -------------------- | ------ | ------ | ------ | ------ | ------ | -------- |
- | 1 | [标题文字](作品链接) | 作者名 | 305.2w | 7.1w | 51.0w | 14.7w | 06-02 19:55 |
- | 2 | [标题文字](作品链接) | 作者名 | 158.3w | 3.2w | 22.1w | 8.5w | 05-30 15:30 |
+ | # | 作品标题 | 作者 | 点赞数 | 评论数 | 分享数 | 收藏数 | 发布时间 |
+ |---|---------|------|--------|--------|--------|--------|----------|
+ | 1 | [标题](work_url) | 作者名 | 305.2w | 7.1w | 51.0w | 14.7w | 06-02 19:55 |
```
- **数字格式化规则:**
-
- - 小于 10000:直接展示原始数字(如 `320`)
- - 大于等于 10000:使用 `x.xw` 格式(如 `1.2w` 代表 12000)
-
- **发布时间格式化规则:**
-
- - 将 `publish_time`(格式 `YYYY-MM-DD HH:MM:SS`)转换为 `MM-DD HH:MM` 格式展示(如 `2026-06-02 19:55:03` → `06-02 19:55`)
- - 不管用户是否指定了时间范围查询,均展示发布时间列
-
- **标题链接规则:**
-
- - 作品标题使用 Markdown 链接格式 `[标题](work_url)`,点击可跳转到抖音作品页
- - 如果标题过长(超过 30 字),截断并加 `...`
-
- **A3. 查看全部数据(当结果超过 20 条时)**
-
- 如果 `articles` 总条数 > 20,在表格下方输出提示后**不等待,立刻继续**输出 A4:
-
- > 以上展示了前 20 条数据,还剩 **N 条**未展示。需要查看全部数据吗?回复「查看全部」即可。
-
- **当用户在后续对话中回复「查看全部」时**:将第 21 条起的所有剩余数据,以相同表格格式续接展示,编号从 #21 开始连续递增,直到全部展示完毕。
-
- **articles ≤ 20 时**:跳过本步骤,直接进入 A4。
-
- **A4. 展示热门推荐数据(latestHotArticles)**
-
- **仅在 `articles` 总条数 ≤ 10 时执行本步骤。**
-
- 如果 `articles` 总条数 ≤ 10 且 `latestHotArticles` 不为空,展示热门推荐作品表格(最多 10 条),标题为:
-
- > 🔥 **近期热门推荐作品**
-
- 使用与 A2 相同的表格格式和数字格式化规则。**若为空或 articles > 10 则跳过本模块,不输出任何内容。**
-
- **A5. 展示热门话题(hotTopics)**
-
- **仅在 `articles` 总条数 ≤ 10 时执行本步骤。**
-
- 如果 `articles` 总条数 ≤ 10 且 `hotTopics` 不为空,以列表形式展示热门话题:
-
- > 🏷️ **热门话题**
- >
- > - #话题1
- > - #话题2
- > - ...
-
- **若为空或 articles > 10 则跳过本模块,不输出任何内容。**
-
- **⚠️ A1~A5 必须在同一轮输出中连续完成,输出 A5 后紧跟 Step 5 订阅提示,不得中断。**
-
- #### 情况 B:articles 数量 = 0(无匹配结果)
-
- **B1. 抱歉提示 + 拓词推荐**
+ 格式化规则:
+ - 数字 < 10000 直接展示;≥ 10000 用 `x.xw` 格式
+ - `publish_time` 转为 `MM-DD HH:MM`;无论是否指定时间范围均展示
+ - 标题超 30 字截断加 `...`,使用 `[标题](work_url)` 链接格式
- > 😔 抱歉,未找到与「**XXX**」直接相关的内容,你可以尝试用更短或更宽泛的关键词重试(扩展词1,扩展词2,扩展词3,扩展词4,扩展词5,扩展词6,扩展词7,扩展词8,扩展词9,扩展词10)
+ **A3.** articles > 20 时提示:
- AI 必须根据用户搜索的关键词生成 **固定 10 个**扩展搜索词,以英文逗号 `,` 分隔展示在一行括号内。
+ > 以上展示了前 20 条数据,还剩 **N 条**未展示。回复「查看全部」展开剩余数据。
- 生成规则:
- - 基于原始关键词进行语义扩展(如同义词、上下位词、相关场景词)
- - 每个扩展词保持在 2-6 个汉字
- - 优先推荐更细分或更宽泛的相关方向
- - **必须生成恰好 10 个,不得少于 10 个**
+ **A4-A5.** 仅 articles ≤ 10 时执行:
+ - `latestHotArticles` 非空 → 展示「🔥 近期热门推荐作品」表格(最多10条)
+ - `hotTopics` 非空 → 展示「🏷️ 热门话题」列表
+ - 为空则跳过,不输出
- **B2. 热门推荐数据(latestHotArticles)**
+ **⚠️ A1~A5 同一轮输出连续完成,A5 后紧跟 Step 5。**
- 如果 `latestHotArticles` 不为空,展示热门推荐作品:
+ #### 情况 B:articles = 0
- > 💡 我们为您推荐了近期的其他热门作品供参考,或许对您有帮助:
+ **B1.** 抱歉提示 + 10个扩展词(以英文逗号分隔):
- 随后以表格格式展示 `latestHotArticles`(最多 10 条),格式同情况 A 的表格。**若为空则跳过本模块,不输出任何内容。**
+ > 😔 抱歉,未找到与「**XXX**」相关的内容,可尝试(扩展词1,扩展词2,...,扩展词10)
- **B3. 展示热门话题(hotTopics)**
+ 扩展词规则:基于原关键词语义扩展,每词2-6字,固定10个。
- 如果 `hotTopics` 不为空,以列表形式展示,格式同 A5。**若为空则跳过本模块,不输出任何内容。**
+ **B2-B3.** 展示 `latestHotArticles`(💡 推荐提示)和 `hotTopics`,为空则跳过。
- **⚠️ B1~B3 必须在同一轮输出中连续完成,输出 B3 后紧跟 Step 5 订阅提示,不得中断。**
+ **⚠️ B1~B3 同一轮输出连续完成,B3 后紧跟 Step 5。**
- ### Step 5: 提示订阅
+ ### Step 5: 📩 提示订阅
- 全部内容展示完毕后,**不等待、立刻结束输出**,仅在末尾附上订阅提示:
+ 展示完毕后末尾附上:
> 📩 是否订阅「**XXX**」的每日推送?订阅后每天 10:00 自动推送最新爆款作品。回复「确认订阅」即可创建定时任务。
- ### Step 6: 创建定时任务(用户在后续对话中回复「确认订阅」时执行)
+ ### Step 6: ⏰ 创建定时任务(用户回复「确认订阅」时执行)
- 优先使用当前平台内置的定时任务/自动化能力创建订阅,若无则提供通用配置方案:
+ 优先使用平台内置定时任务,若无则提供通用方案:
- **1. 平台内置定时任务**(优先)
- 如果当前平台提供定时任务或 cron 自动化功能:直接调用该功能创建订阅,配置如下:
- 任务名称:`抖音爆款作品订阅 - <关键词>`
- - 执行频率:每天 10:00(北京时间,cron 表达式 `0 10 * * *`)
- - 执行内容:运行 `python3 <脚本路径>/search_douyin.py "<关键词>"`(如有时间参数则附加 `--start-date` 和 `--end-date`),将结果按 SKILL.md 中 Step 4-5 的格式展示并推送到当前对话
-
- **2. 通用配置方案**(平台无内置定时任务时)
- 向用户提供以下信息,由用户自行配置:
- - 执行命令:`python3 <脚本路径>/search_douyin.py "<关键词>"`(如有时间参数则附加 `--start-date` 和 `--end-date`)
- - **Linux/macOS crontab**:`0 10 * * * python3 /path/to/search_douyin.py "<关键词>"`(如有时间参数则附加 `--start-date` 和 `--end-date`)
- - **其他平台**:参照对应平台的定时任务文档配置上述命令
+ - 执行频率:每天 10:00(cron `0 10 * * *`)
+ - 执行命令:`python3 <脚本路径>/search_douyin.py "<关键词>"`(有时间参数则附加 `--start-date`/`--end-date`)
+ - 通用 crontab:`0 10 * * * python3 /path/to/search_douyin.py "<关键词>"`
- 创建成功后告知用户:"已成功订阅关键词「<关键词>」的爆款作品推送,每天 10:00 将自动查询最新数据并通知你。"
+ 创建成功后告知:"已成功订阅关键词「<关键词>」的爆款作品推送,每天 10:00 将自动查询最新数据并通知你。"