# Bilibili Keywords Search

> B站关键词搜作品工具。根据用户输入的关键词调用 Redfox 接口搜索B站最新视频，支持按排序方式和发布时间筛选，返回新鲜数据（非缓存/历史数据）。当用户要求搜索B站最新内容、查看某关键词下的视频数据时使用。触发词：B站搜索、B站最新视频、B站热门、B站搜作品、bilibili搜索。

- Skill: `redfox-data/bilibili-keywords-search` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds add redfox-data/bilibili-keywords-search`
- Raw SKILL.md: https://api.skillmd.com/api/skills/redfox-data/bilibili-keywords-search/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: redfox-data (https://skillmd.com/u/redfox-data)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/redfox-data/bilibili-keywords-search

---


# B站关键词搜作品

## 📝 简介

输入关键词就能搜到 B 站刚发布的视频，能自己选排序、限定发布时间，给到你的都是平台刚更新的新鲜内容，不会拿旧缓存数据糊弄你。

## ✨ 核心价值

- 内容新鲜不滞后：每次搜索都会直接读取平台最新内容，只给刚发布的视频，不用老旧存档、缓存数据。
- 筛选方式灵活好用：能按综合热度、最新发布、点赞高低排序，还能筛选 7 天 / 30 天 / 90 天内视频，自由搭配条件查找。
- 搜不到自动扩词：关键词搜不出内容时，工具会自动生成 10 个相近词，帮你拓宽查找范围。
- 支持翻页查看 + 每日推送：海量结果可以分页浏览，订阅关键词后，系统每天自动推送新视频给你。

## 🔑 鉴权

### 获取 API Key

请前往 [红狐hub](https://redfox.hk/settings/api-keys?source=github) 获取 API KEY

### 配置 API Key

方案1: 以 Qoder 为例，将 REDFOX_API_KEY 添加到 `~/.openclaw/openclaw.json` 中：

```bash
{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }
```

方案2: 终端配置

```bash
export REDFOX_API_KEY="ak_xxxx..."
```

## 🔄 工作流程

### Step 1：理解用户意图，提取关键词和筛选参数

**⚠️ 核心规则：语义理解优先，优先提取细分方向词，而非泛化大类词**

**1. 提取关键词**

- 从用户描述中提取 2~6 字的细分关键词
- 若用户意图模糊（如"帮我搜B站"），主动询问：「请问你想搜索哪个方向或领域的内容？」
- 不得在用户未提供关键词时擅自猜测并调用脚本

**2. 识别筛选参数**（用户未指定时使用默认值）

- **排序方式**（`--sort`）：默认 `1`（综合排序）
  - 用户提到"最新"、"最近发布" → `2`
  - 用户提到"点赞"、"热门"、"爆款" → `3`
  - 未提及排序 → `1`（默认）
- **发布时间**（`--time`）：默认 `7`（最近7天）
  - 用户提到"近一个月"、"30天" → `30`
  - 用户提到"近三个月"、"90天" → `90`
  - 用户提到"不限时间"、"全部" → `0`
  - 未提及时间 → `7`（默认）
- **页码**（`--page`）：默认 `1`
  - 用户提到"下一页"、"第2页" → 对应页码
  - 用户提到"上一页" → 当前页 - 1
  - 未提及页码 → `1`（默认）

### Step 2：调用搜索脚本

**⚠️ 核心约束：每次查询严格只调用一次脚本，禁止重复调用。**

- 无论脚本返回成功还是失败，都不得重试或二次调用
- 不得为"验证数据""获取更多信息"等任何理由再次执行脚本
- 若脚本执行失败，直接向用户报告错误，不得重试

```bash
python3 "$SKILL_PATH/scripts/search_bili_realtime.py" "<关键词>" [--sort 排序] [--time 时间] [--page 页码]
```

**参数说明：**

| 参数     | 可选值                  | 含义                                    |
| -------- | ----------------------- | --------------------------------------- |
| keyword  | 任意字符串              | 搜索关键词，多个词用英文逗号连接        |
| `--sort` | `1` / `2` / `3`         | 综合排序 / 最新发布 / 最多点赞（默认1） |
| `--time` | `7` / `30` / `90` / `0` | 最近7天 / 30天 / 90天 / 不限（默认7）   |
| `--page` | 正整数                  | 页码，从1开始（默认1）                  |

脚本以 JSON 格式输出：

| 字段                 | 说明                             |
| -------------------- | -------------------------------- |
| `articles`           | 关键词匹配视频列表（按点赞降序） |
| `sort_type_label`    | 本次排序方式文字说明             |
| `publish_time_label` | 本次时间范围文字说明             |
| `page`               | 当前页码                         |
| `total_pages`        | 总页数                           |
| `has_next`           | 是否有下一页（true/false）       |

每条视频字段：

| 字段            | 说明                                                       |
| --------------- | ---------------------------------------------------------- |
| `title`         | 视频标题（已清洗HTML标签、空格、特殊字符，[]已替换为【】） |
| `author`        | UP主昵称                                                   |
| `like_count`    | 点赞数                                                     |
| `comment_count` | 评论数                                                     |
| `collect_count` | 收藏数                                                     |
| `play_count`    | 播放量                                                     |
| `danmaku_count` | 弹幕数                                                     |
| `work_url`      | 视频链接（直接可用）                                       |
| `publish_time`  | 发布时间（格式化）                                         |
| `cover_url`     | 封面图（https协议）                                        |
| `tags`          | 视频标签（逗号分隔）                                       |
| `category`      | 视频分区名称                                               |

### Step 3：判断结果并展示

#### 情况 A：articles 数量 > 0（有匹配结果）

**A1. 告知用户查询范围**

> 📊 关键词「**XXX**」查询到 **N 条**视频（排序：{sort_type_label} | 时间范围：{publish_time_label} | 第 {page} 页），以下是详细数据：

**A2. 渲染 Markdown 表格（全部展示）**

```markdown
| #   | 视频标题             | UP主   | 播放量 | 点赞数 | 评论数 | 收藏数 |
| --- | -------------------- | ------ | ------ | ------ | ------ | ------ |
| 1   | [标题文字](视频链接) | UP主名 | 105.2w | 30.5w  | 7.1w   | 3.5w   |
```

**数字格式化规则：**

- `< 10000`：原始数字（如 `320`）
- `≥ 10000`：`x.xw` 格式（如 `1.2w`）

**标题规则：** 脚本已自动清洗标题（去除HTML标签、空格、特殊字符，将`[]`替换为`【】`），直接使用 `title` 字段即可。Markdown 表格中使用 `[标题](work_url)` 格式展示；超过 30 字截断并加 `...`。⚠️ 标题中已不含 `[]`，不会与 Markdown 链接语法冲突。

**A3. 筛选能力提示（紧接在表格之后，每次必须输出）**

> 🔧 **支持筛选，回复以下指令可切换条件重新搜索：**
>
> - **排序方式**：综合排序 / 最新发布 / 最多点赞（当前：{sort_type_label}）
> - **发布时间**：最近7天 / 最近30天 / 最近90天 / 不限（当前：{publish_time_label}）
>
> 示例：「按最新发布、最近30天重新搜索」

**A4. 翻页提示（⚠️ 紧接在 A3 之后，不可省略，每次必须输出）**

- 若 `has_next` 为 true：

  > 📄 当前第 **{page}** 页。回复「下一页」继续查看。

- 若 `has_next` 为 false（当前页不足 9 条或为空，已是最后一页）：
  > 📄 当前第 **{page}** 页，已无更多数据。

**⚠️ A1~A4 缺一不可，必须在同一轮输出中连续完成。输出 A4 后紧跟 Step 4 订阅提示。若缺少 A4，视为执行错误，必须重新补充输出。**

#### 情况 B：articles 数量 = 0（无匹配结果）

**B1. 抱歉提示 + 拓词推荐**

> 😔 抱歉，未找到与「**XXX**」直接相关的内容，你可以尝试用更短或更宽泛的关键词重试（扩展词1,扩展词2,...扩展词10）

AI 必须生成**固定 10 个**扩展词，2~6 字，英文逗号分隔，不得少于 10 个。

**B2. 筛选能力提示（紧接在 B1 之后，每次必须输出，格式同 A3）**

**⚠️ B1~B2 必须在同一轮输出中连续完成，输出 B2 后紧跟 Step 4 订阅提示，不得中断。**

### Step 4：提示订阅

全部内容展示完毕后，**不等待、立刻结束输出**，仅在末尾附上订阅提示：

> 📩 是否订阅「**XXX**」的每日推送？订阅后每天 10:00 自动推送最新爆款视频。回复「确认订阅」即可创建定时任务。

### Step 5：创建定时任务（用户回复「确认订阅」时执行）

优先使用平台内置定时任务能力，若无则提供通用方案：

**平台内置定时任务（优先）：**

- 任务名称：`B站搜索订阅 - <关键词>`
- 执行频率：每天 10:00（cron：`0 10 * * *`）
- 执行内容：运行脚本并将结果按 Step 3~4 格式展示推送到当前对话

**通用配置方案：**

```bash
# Linux/macOS crontab
0 10 * * * python3 "$SKILL_PATH/scripts/search_bili_realtime.py" "<关键词>"
```

创建成功后告知用户："已成功订阅关键词「<关键词>」的B站视频推送，每天 10:00 将自动查询最新数据并通知你。"

