---
name: wechat-search
description: 公众号搜索工具，支持按关键词搜索爆款文章，展示推荐热门文章，助力内容创作者把握趋势与获取灵感；当用户需要搜索公众号文章、查找爆款内容、获取创作灵感时使用
dependency:
  python:
    - 无第三方依赖（纯标准库：urllib.request, json, os, sys, argparse, datetime）
---

# 公众号热门文章查询

## 任务目标

- 本 Skill 用于：查询公众号热门爆款文章，获取创作灵感
- 能力包含：关键词搜索、数据评分排序、智能结果展示
- 触发条件：用户需要查询公众号热门内容、分析爆款规律、寻找选题灵感

## 前置准备

- 依赖说明：Python 3.13+（纯标准库，无第三方依赖）
- 输出文件：JSON数据文件、HTML可视化文件

### 鉴权

#### 获取 API Key

请前往 [红狐hub](https://redfox.hk/settings/api-keys?source=clawhub) 获取API KEY

#### 配置 API Key

方案1: 以OpenClaw为例，将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中，部分内容如下：

```bash
{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }
```

方案2: 终端配置

```bash
export REDFOX_API_KEY="ak_xxxx..."
```

## 操作步骤

### 步骤 1：关键词理解与处理

**关键词提取**：

- 用户输入关键词后，先进行理解，识别是否为赛道关键词
- 赛道关键词：较大的分类词，如"职场"、"情感"、"亲子"、"美妆"等
- 非赛道关键词：具体细分词，如"职场沟通技巧"、"异地恋怎么维持"等

**赛道词处理流程**（仅当识别为赛道词时执行）：

1. **第一步：识别并询问用户（⚠️ 仅当用户明确要求时才执行）**
   ```
   我识别到「职场」是较大的分类，已查询近期热门趋势，推荐以下细分方向：
   工作、打工人、职场穿搭、职场干货、成长、冷门职业、向上管理、职场焦虑、升职、财务自由
   回复「拓展」将同时搜索这10个词，回复「不拓展」将继续搜索「职场」
   ```
2. **第二步：等待用户回复**
   - ❌ **禁止**：用户未回复时调用脚本
   - ❌ **禁止**：自动执行拓展搜索（必须等用户明确回复「拓展」）
   - ✅ **正确**：只等待用户明确回复后再执行
3. **第三步：根据用户明确回复执行**
   - 用户回复「拓展」 → 调用脚本搜索10个细分词
   - 用户回复「不拓展」或「继续」 → 调用脚本搜索原关键词
   - 用户未回复或回复其他内容 → 识别对应意图

### 步骤 2：时间范围与数据查询

**时间范围**：

- 数据库只包含昨天至30天前的数据
- **"最近"的默认定义**：最近7天（startDate = 今天 - 7天）
- **日期计算**（将用户表达转换为 startDate）：
  - 今天：直接用昨天日期，startDate = 昨天
  - 最近/近7天：startDate = 今天 - 7天
  - 近N天：startDate = 今天 - N天
  - 示例：用户说"近15天" → startDate = 今天 - 15天

**数据不足时的自动拓展时间**：

- ✅ 当articles数量不足时，自动按顺序拓展时间范围：近1天 → 近7天 → 近30天
- ✅ 每次拓展后重新调用脚本查询，直到获取到数据或拓展到30天为止
- ❌ **禁止自动扩展关键词搜索**：搜索结果不足10条时，禁止用拓展词/相关词/同义词再次调用接口搜索
- ❌ **禁止自动尝试相关搜索建议**
- ✅ 拓展时间后仍无数据，直接返回articles=0的结果

**超出范围或未更新数据的道歉说明**：

- 用户说"今天/今日"时：回答"非常抱歉，今天的数据暂未更新，已为您展示最近可用的数据"
- 用户要求的时间超出30天时：回答"非常抱歉，当前仅支持最近30天的数据，已为您展示最接近的数据"

**执行命令**：

- 有赛道关键词：`python scripts/fetch_gzh_trends.py --keyword <关键词> --start-date <日期>`
- 无赛道关键词（查询全站热门）：`python scripts/fetch_gzh_trends.py --keyword "" --start-date <日期>`
- 多个关键词用逗号分隔：`python scripts/fetch_gzh_trends.py --keyword "职场沟通,恋爱技巧,亲子教育" --start-date <日期>`

**⚠️ 防重复调用规则（强制）**：

- ❌ **禁止**先用 `head`/`tail`/`2>/dev/null | head -5` 等方式"试运行"或"预览"脚本输出
- ❌ **禁止**在同一次查询中对同一参数多次调用脚本
- ✅ **每次查询只执行一次脚本命令**，直接读取完整的 stdout 输出
- ✅ 唯一允许多次调用的场景：数据不足时按 SKILL.md 规定的自动拓展时间（近1天→近7天→近30天），每次使用不同的 `--start-date`

**输出文件**：

- JSON数据：输出到标准输出（stdout）
- HTML文件：`{keyword}_趋势数据.html`（可选）

---

### 步骤 3：数据展示策略（核心）

**⚠️ 强制输出规则**：

- ✅ 必须严格按照本步骤规定的格式输出
- ❌ 禁止在输出前添加任何分析或解读
- ❌ 禁止自作主张给建议或方案
- ❌ 禁止询问用户的真实目的或需求
- ✅ 直接读取脚本返回的JSON数据，按照对应策略输出即可

**数据字段说明**：

- **articles**：正常文章数据（主要展示内容）
- **latestHotArticles**：推荐热门文章（辅助内容，默认展示10条，表格不含评分字段）
- **hotTopics**：热门话题（接口返回，仅供参考，不在对话中展示）

**展示规则**（基于articles数量判断）：

#### A. articles数量 ≥ 10条

展示内容：

1. **时间范围说明**：必须告知用户查询的时间范围，如"📅 查询时间范围：5月8日 - 5月19日"
2. 正常文章数据（按totalScore降序排序）
3. 拓词推荐（relatedSearches）

**Markdown表格格式**：

⚠️ **表格字段顺序必须严格按以下顺序展示**：
| 文章标题 | 作者 | 阅读数 | 发布时间 | 相关性 | 热度 | 时效 | **总分** |

**注意**：总分字段需要加粗显示（使用`**分数**`格式）

示例：
📅 查询时间范围：5月8日 - 5月19日

| 文章标题                                                                  | 作者       | 阅读数 | 发布时间   | 相关性 | 热度 | 时效 | **总分** |
| ------------------------------------------------------------------------- | ---------- | ------ | ---------- | ------ | ---- | ---- | -------- |
| [职场新人必看：5个让你快速融入团队的技巧](https://mp.weixin.qq.com/s/xxx) | 职场成长社 | 10.0w  | 2026-05-15 | 9.8    | 3.0  | 2.0  | **14.8** |

---

**🔤 拓词推荐**：职场沟通、职场晋升、打工人

#### B. articles数量 < 10条但 > 0

展示内容：

1. **时间范围说明**：必须告知用户查询的时间范围，如"📅 查询时间范围：5月8日 - 5月19日"
2. **提示信息**："💡当前关键词当前时间段仅找到 X 条结果，您可以尝试拓展词或者拓展时间，我们还为您推荐了近期的热门文章"
3. 正常文章数据
4. 推荐热门文章（latestHotArticles，带"推荐热门文章"标题分区，默认展示10条）
5. 推荐热门话题
6. 拓词推荐（relatedSearches）

**Markdown格式示例**：

📅 查询时间范围：5月8日 - 5月19日

> 💡当前关键词当前时间段仅找到 3 条结果，

| 文章标题     | 作者  | 阅读数 | 发布时间   | 相关性 | 热度 | 时效 | **总分** |
| ------------ | ----- | ------ | ---------- | ------ | ---- | ---- | -------- |
| [文章1](url) | 作者1 | 10.0w  | 2026-05-15 | 9.8    | 3.0  | 2.0  | **14.8** |

**您可以尝试拓展词或者拓展时间，我们还为您推荐了近期的热门文章供参考**：

⚠️ 推荐热门文章表格不需要评分字段，格式为：
| 文章标题 | 作者 | 阅读数 | 发布时间 |
|---------|------|--------|----------|
| [热门文章1](url) | 作者A | 8.5w | 2026-05-14 |
| [热门文章2](url) | 作者B | 6.2w | 2026-05-13 |

**📈 推荐热门话题**：

您可以尝试搜索以下热门赛道：
人文、知识、养生、时尚、美食、生活、旅游、搞笑、情感、体育娱乐、美妆、文摘、民生资讯、财富理财、科技数码、创投商业、汽车、房产楼市、职场、教育考试、学术

#### C. articles数量 = 0

**⚠️ 必须严格按照以下格式输出，禁止自作主张给建议或分析**

展示内容：

```
🔍 抱歉，爆款文章收录原则为阅读数5000+以上的文章,该搜索词在查询时间范围（5月8日 - 5月19日）内太小众，未找到与"XXX"直接相关的内容，你可以尝试用更短/宽泛的关键词重试 。

💡 或者您可以尝试搜索以下热门赛道：
人文、知识、养生、时尚、美食、生活、旅游、搞笑、情感、体育娱乐、美妆、文摘、民生资讯、财富理财、科技数码、创投商业、汽车、房产楼市、职场、教育考试、学术

我们为您推荐近期最热门的文章，您也可以关注~
```

在以上内容之后，展示latestHotArticles数据（如果有），热门推荐表格不需要评分字段：

| 文章标题         | 作者  | 阅读数 | 发布时间   |
| ---------------- | ----- | ------ | ---------- |
| [热门文章1](url) | 作者A | 8.5w   | 2026-05-14 |
| [热门文章2](url) | 作者B | 6.2w   | 2026-05-13 |

**输出规则**：

- ✅ 必须直接输出上述格式内容
- ❌ 禁止添加额外的分析或建议
- ❌ 禁止解释为什么搜不到数据
- ❌ 禁止主动提供其他搜索方案
- ❌ 禁止询问用户的真实目的

---

### 步骤 4：展示逻辑）

**当articles数量 > 10条时**：

1. 初始默认只展示前10条数据
2. 必须提示用户：
   ```
   💡 当前共找到 X 条相关文章，已展示前10条。是否需要查看全部？
   ```
3. 等待用户回复：
   - 用户回复"是"/"查看全部"/"全部" → 展示全部数据
   - 用户回复"否"/"不用"/"不需要" → 不展示更多

**展示全部数据时的格式**：

```
📊 全部结果（共X条）：

| 文章标题 | 作者 | 阅读数 | 发布时间 | 相关性 | 热度 | 时效 | **总分** |
|---------|------|--------|----------|--------|------|------|------|
| ...（全部数据）...
```

---

### 步骤 5：订阅服务询问（必须执行）

**当articles数量 > 0时，结果输出完成后必须询问**：

```
📬 订阅服务
1️⃣ 是否需要订阅当前搜索条件文章，订阅后将定时推送给您？
2️⃣ 暂不需要
```

**处理用户回复**：

- 用户选择1️⃣ → 使用 `calendar_create` 工具创建日程，订阅当前搜索条件
- 用户选择2️⃣ → 结束当前对话

**订阅实现步骤**：

1. **告知数据更新时间并询问推送时间**：

   ```
   📅 数据更新时间：每日早上7点更新昨日数据

   请告诉我您希望推送的具体时间~
   ```

2. **用户选择后，调用 `calendar_create` 工具**：
   - **title**：`公众号趋势订阅：{关键词}`
   - **description**：记录当前搜索参数（关键词、时间范围）
   - **start_time**：根据用户选择的时间设置
   - **remind_type**：设置为定期提醒
   - 其他参数使用当前查询参数

3. **订阅成功后提示**：

   ```
   ✅ 订阅创建成功！

   📌 订阅信息：
   - 关键词：{关键词}
   - 时间范围：{当前时间范围}
   - 推送时间：{用户选择的时间}
   - 数据更新：每日早上7点更新昨日数据

   到达设定时间后，将自动为您推送最新的公众号爆款文章。
   ```

**⚠️ 强制规则**：

- ✅ 必须在结果输出完成后立即询问
- ✅ 用户选择订阅时，必须使用 `calendar_create` 工具
- ✅ 参数必须使用当前查询参数（关键词、时间范围等）
- ❌ 禁止跳过此步骤
- ❌ 禁止在展示结果前询问

---

### 步骤 6：前置说明（必须展示）

**在展示数据前，必须告知用户**：

- **数据说明**：爆款文章范围为阅读数5000+以上的文章，每日早上7点更新昨日数据。文章互动数据截止为入库时间，不是实时数据，入库后互动数据可能持续增长。
- **排序说明**（有关键词搜索时）：根据相关性（满分10分）、热度（满分3分）、时效（满分2分）三个维度加权计算，总分共15分
- **排序说明**（全站热门/无关键词时）：按阅读数排序

---

### 步骤 7：智能筛选热门内容（可选）

**⚠️ 此步骤为可选，仅在用户明确要求"筛选"、"推荐"时执行**

**筛选原则**：

- **统一排序**：脚本已自动将所有数据按totalScore排序
- **目标数量**：最多10条，如实展示实际数据量

---

## 使用示例

### 示例1：查询职场热门文章

**场景**：用户说"帮我查一下最近职场相关的爆款文章"

**执行流程**：

1. 识别"职场"为赛道关键词
2. 推荐细分方向，等待用户回复
3. 用户回复"不拓展" → 执行查询
4. 调用脚本：`python scripts/fetch_gzh_trends.py --keyword "职场" --start-date 2026-05-08`
5. 读取JSON数据，提取articles字段
6. 根据articles数量判断展示策略
7. 以Markdown表格形式展示给用户（默认前10条）
8. 如果articles > 10条，提示用户是否查看全部
9. 展示订阅服务询问

**预期产出**：

- JSON数据文件包含完整文章信息
- 对话中展示Markdown表格（默认前10条）
- 如用户选择查看全部，展示全部数据
- 展示订阅服务询问
- HTML卡片文件（可选）

**关键要点**：

- 赛道词需要先询问用户是否拓展
- 时间范围默认近7天
- 数据按总分排序展示
- 结果超过10条时询问是否查看全部
- 结果展示完成后必须询问订阅服务

### 示例2：查询具体细分词

**场景**：用户说"查一下职场沟通技巧的文章"

**执行流程**：

1. 识别"职场沟通技巧"为非赛道关键词
2. 直接查询，无需拓展询问
3. 调用脚本：`python scripts/fetch_gzh_trends.py --keyword "职场沟通技巧" --start-date 2026-05-08`
4. 根据返回数据判断展示策略

**预期产出**：

- 精准匹配的文章列表
- 可能触发"部分结果"策略（<10条）

**关键要点**：

- 非赛道词直接查询
- 结果少时展示推荐热门文章

### 示例3：多关键词查询

**场景**：用户说"帮我查职场、情感、亲子三个领域的爆款"

**执行流程**：

1. 识别多个关键词
2. 调用脚本：`python scripts/fetch_gzh_trends.py --keyword "职场,情感,亲子" --start-date 2026-05-08`
3. 合并三个关键词的查询结果
4. 按总分统一排序展示

**预期产出**：

- 跨分类的文章列表
- 包含各领域热门文章

**关键要点**：

- 多关键词用逗号分隔
- 结果合并去重
- 统一排序展示

---

## 资源索引

- 脚本：见 [scripts/fetch_gzh_trends.py](scripts/fetch_gzh_trends.py)
  - 用途：调用接口获取数据、排序处理、生成HTML
  - 参数：--keyword（必需）、--start-date（可选）、--max-items（可选）、--output-format（可选）
- 参考：见 [references/gzh_trend_data_format.md](references/gzh_trend_data_format.md)
  - 何时读取：需要了解接口数据格式、字段说明时

## 注意事项

- **数据源说明**：数据来源于公众号热门文章接口，包含阅读数、互动数、评分等，每日早上7点更新昨日数据
- **展示策略**：根据articles数量智能判断，确保用户体验
- **评分排序**：关键词搜索时按totalScore（相关性+热度+时效）降序排序，总分共15分；全站热门按阅读数排序
- **前置说明**：展示数据前必须告知用户数据说明和排序说明
- **HTML文件**：卡片样式，适合独立查看和分享
