---
name: dapenti-scraper
description: 喷嚏网喷嚏图卦抓取与总结 - 浏览器自动化获取最新图卦内容并推送到微信（优先）和 Telegram。
category: mlops
tags: [browser, scraping, telegram, news, automation]
---

# 喷嚏网喷嚏图卦抓取技能

## 用途
自动访问喷嚏网 (dapenti.com)，查找最新【喷嚏图卦】文章，提取内容，搜索补充背景信息，按增强格式总结并推送。

## 工作流程

### 1. 访问喷嚏网首页
```python
browser_navigate("https://www.dapenti.com/blog/index.asp")
```

### 2. 查找最新喷嚏图卦链接
- 页面中包含文章列表，格式为 `【喷嚏图卦 YYYYMMDD】标题`
- 查找第一个出现的喷嚏图卦链接（最新）
- 提取文章 ID（URL 格式：`more.asp?name=xilei&id=文章 ID`）

### 3. 打开文章页面
```python
browser_click("@eXX")  # 点击喷嚏图卦链接
```

### 4. 提取完整内容（⚠️ 关键步骤）

**⚠️ 必须使用 browser_console 提取完整文本，不要依赖 browser_snapshot**

`browser_snapshot` 会在 ~100行处截断，导致后文丢失。本期图卦（约20条新闻）需要完整提取。

使用以下 JavaScript 通过 browser_console 提取：

```python
browser_console(expression='''
(function() {
  // 提取所有段落文本，过滤导航和噪声
  return Array.from(document.querySelectorAll("p"))
    .map(p => p.innerText.trim())
    .filter(t => t.length > 0 && !t.includes("深入探索") && !t.includes("免责申明"))
    .join("\\n");
})()
''')
```

**如果 browser_console 提取失败（如JavaScript报错），降级使用 browser_snapshot 并手动遍历：**
- 先 browser_snapshot 获取前100行
- 再 browser_snapshot(position=100) 获取后续内容
- 合并后手动过滤噪声文本

**验证提取完整性：** 提取的内容应包含文章中所有新闻条目（本期约20条），如果只看到前几条就结束，说明被截断了。

### 5. 搜索补充背景（使用 web_search_tool）

对每一条重要新闻，提取关键词并使用 `web_search_tool` 搜索其他信源补充背景。

```python
from tools.web_tools import web_search_tool
import json

r = web_search_tool("搜索关键词", limit=3)
if isinstance(r, str):
    r = json.loads(r)
# 读取结果
for item in r['data']['web']:
    print(item['title'], item['url'], item['description'])
```

**web_search_tool 后端优先级：** firecrawl > parallel > tavily > exa > searxng > brave-free > ddgs

**⚠️ 关键限制：当 web_search_tool 不可用时的处理**

如果收到错误信息如 "Web tools are not configured" 或 "No search backend available"，说明当前环境没有配置任何 web search 后端。

**此时不要尝试使用 delegate_task + web toolsets 来搜索** — 子 agent 同样会面临同样的工具限制，徒耗时间和 token。实验证明，sub-agent 调用 ddgs 搜索会返回空结果（即使 ddgs 在主 agent 中可用）。

**✅ 首选替代方案：使用 browser_navigate 访问 Google News 搜索**

当 `web_search_tool` 不可用时，使用 browser 工具直接导航到 Google News 是最可靠的搜索方式：

```
# 搜索英文新闻（返回国际媒体结果）
browser_navigate("https://news.google.com/search?q=Ebola+outbreak+DRC+2026&hl=en-US")

# 搜索中文新闻
browser_navigate("https://news.google.com/search?q=刚果伊波拉疫情&hl=zh-CN")
```

**为什么推荐 Google News 而不是直接访问 Google.com 或 Bing.com：**
- **Google.com 搜索**：直接访问 `google.com/search` 会被强制跳转到人机验证页面（"Our systems have detected unusual traffic"），无法获取搜索结果
- **Bing.com 搜索**：同样经常显示人机验证页面，无法获取结果
- **Google News（news.google.com）**：通过 browser 工具访问时结果返回稳定，无 CAPTCHA 拦截
- 返回结果聚合了 Reuters、Guardian、Al Jazeera、NPR 等权威媒体，信息质量高
- 可同时搜索多条新闻（并行 browser_navigate 调用）

**搜索策略：**
1. 对每条需要补充的新闻，构造英文关键词（机构名+事件+年份），用 Google News 搜索
2. 从返回的 snapshot 中提取标题、媒体来源、时间和核心描述
3. 每条新闻通常 1 个搜索足够获取背景（多条新闻可并行搜索）
4. 如果新闻是中文特有话题（如国内政策），改用中文关键词

**降级方案（当 browser 搜索也无法使用时）：**
1. 直接基于喷嚏网原文提取的内容生成摘要
2. 在补充信息部分注明："⚠️ 因网络限制无法搜索其他来源，部分背景信息基于原文补充"
3. 喷嚏网本身是可信的新闻聚合源，其引用的媒体报道已足够权威

**搜索返回空结果的处理：**
某些查询（如就业数据、特定市场现象）可能搜索不到结果（ddgs 返回空数组，无错误消息）。这是正常的，不要误认为是搜索工具故障。在摘要中标注"因网络限制无法搜索"即可。

**示例降级处理：**
```
🏭 [新闻标题]
   • 核心事件：证监会副主席表示外资持续流入中国股市
   • 补充信息：⚠️ 因网络限制无法搜索其他来源。该消息体现了在A股调整背景下监管层对外资流入的积极表态。（原文补充）
   • 原始来源：喷嚏网
```

**ddgs 免费搜索后端安装（如需启用搜索）：**
```bash
uv pip install ddgs --python /root/.hermes/hermes-agent/venv/bin/python
```
安装后 `web_search_tool` 会自动使用 ddgs 作为后端。

## 内容总结格式（增强版 - 每条新闻补充背景）

```
📰 喷嚏图卦 [日期编号]
⏰ 发布时间：YYYY-MM-DD

【国内热点】
🏭 [新闻标题A]
   • 核心事件：...[一句话概括核心事实]
   • 补充信息：...[通过web搜索找到的其他来源背景，1-2句话]
   • 原始来源：喷嚏网

🏭 [新闻标题B]
   • 核心事件：...
   • 补充信息：...
   • 原始来源：喷嚏网

【国际局势】
⚔️ [新闻标题C]
   • 核心事件：...
   • 补充信息：...
   • 原始来源：喷嚏网

[以此类推，分类整理所有新闻]

每天一图卦，让我们更清楚地了解这个世界~
```

**分类标准：**
- 国内热点：国内社会、经济、民生、娱乐新闻
- 国际局势：国际政治、军事、外交新闻
- 科技前沿：AI、科技、互联网、数码产品
- 财经金融：股市、基金、投资、经济数据
- 趣闻逸事：轻松、有趣的网络热点

**搜索要点：**
- 每条新闻至少搜索1个其他信源
- 提取关键补充信息（来源名称、具体数据、后续进展）
- 区分"已被证实的消息"和"网络传言/AI合成假新闻"（如HBO成龙饰演黄仁勋为AI假新闻）
- 优先选择权威媒体（联合早报、RFI、纽约时报等）作为补充来源

## 消息推送

**重要：在 Hermes 系统内运行时（尤其是 cron 任务），不要直接使用 curl 调用 Telegram API。**
Token 在 .env 文件中可能被掩码存储（显示为***），导致 API 调用失败。
**正确方式：** 使用 `send_message` 工具，或配置 cronjob 的 `deliver` 参数。

### Cron 任务的两种交付模式

**模式A - deliver 参数（推荐）：**
```yaml
action: create
schedule: "30 17 * * *"  # 每天 17:30 执行
name: "喷嚏图卦每日推送"
deliver: "weixin:o9cq801Q4BDVa20m46H0KTKRUOjo@im.wechat"  # 系统自动推送到微信
prompt: |
  1. 访问 https://www.dapenti.com/blog/index.asp
  2. 查找最新喷嚏图卦链接
  3. 打开文章页面提取内容
  4. 对每条新闻搜索补充背景信息
  5. 按增强格式总结并输出（系统自动推送到配置的 target）
```

**模式B - 最终响应输出（当 deliver 未配置时）：**
当 cron 任务没有配置 deliver 参数时，系统会将最终响应自动投递给配置的通知渠道。如果未配置任何渠道，则仅生成响应文本。

**⚠️ send_message 工具的限制：**
`send_message` 工具可能在某些环境下不可用或需要特定凭证。如果推送失败，检查：
1. `WEIXIN_TOKEN` 和 `WEIXIN_ACCOUNT_ID` 环境变量是否配置
2. 目标微信 channel ID 是否正确
3. 系统日志中是否有推送失败的错误信息

## 页面结构
- 首页 URL: `https://www.dapenti.com/blog/index.asp`
- 文章 URL: `https://www.dapenti.com/blog/more.asp?name=xilei&id=XXX`
- 喷嚏图卦专题页：`https://www.dapenti.com/blog/blog.asp?subjectid=70&name=xilei`
- 标题格式：`【喷嚏图卦 YYYYMMDD】`
- 发布时间显示：`xilei 发布于 YYYY-M-D HH:MM:SS`

## 常见问题

### 1. Telegram Bot 401/404 错误（使用 curl 直接调用）
- Token 在 .env 文件中可能被掩码存储（如 `827408...2SM0`）
- **解决方案：** 不要直接调用 Telegram API，使用 `send_message` 工具
- 在 cron 任务中配置 `deliver` 参数，最终响应自动推送

### 2. Telegram 400 "chat not found" 错误
- 目标用户尚未与 Bot 开始对话
- 解决方案：请用户在 Telegram 搜索 Bot 用户名并点击"Start"
- Bot 无法主动向未启动对话的用户发送消息

### 3. 内容提取不完整
- 使用 `browser_console` 执行 JavaScript 提取
- 不要依赖 `browser_snapshot`（可能截断）

### 4. 当天图卦未发布
- 页面会显示最新已发布的图卦
- 检查标题日期确认是否为当天内容

### 5. 网站 CAPTCHA 拦截（dapenti.com）
- dapenti.com 可能阻止自动化浏览器访问，显示验证码
- **解决方案：** 使用 Google News RSS 作为补充信源：
  ```bash
  curl -s "https://news.google.com/rss/search?q=关键词&hl=zh-CN&gl=CN&ceid=CN:zh-Hans"
  ```
- RSS 输出为 XML，需要用 grep/head 提取标题和摘要
- 这种方式可绕过 CAPTCHA，获取全球媒体的英文报道作为背景补充

### 6. Web tools 未配置 / 所有搜索均被阻止
这两种情况的处理逻辑不同：

**情况A - "Web tools are not configured" 错误：**
- 所有 web search 后端均未安装/配置
- **解决：** 配置 ddgs 包（免费，无需 API key）：
  ```bash
  uv pip install ddgs --python /root/.hermes/hermes-agent/venv/bin/python
  ```
  ddgs 安装后，`web_search_tool` 会自动使用 ddgs 作为后端

**情况B - 搜索返回空结果或被阻止（无明确错误消息）：**
- DuckDuckGo: 可能出现 "Select all squares containing a duck" CAPTCHA 人机验证
- Yahoo: "We had temporary problems searching" 错误
- Google: 直接返回 403 或人机验证页面
- 原因：服务器 IP 被识别为机器人

**处理方案（按优先级）：**
1. 尝试其他搜索引擎（duckduckgo → bing → yahoo → google）
2. 若所有搜索均失败，在摘要中注明"⚠️ Web搜索因网络限制无法完成，部分新闻背景信息基于常识补充"
3. 不要因为缺少补充信息而拒绝生成摘要 — 喷嚏图卦本身就是重要的新闻来源，其内容已足够有价值

### 7. 微信推送未配置/失败

**症状：** `send_message_tool` 返回错误 `"Platform 'weixin' is not configured"` 即使 `WEIXIN_HOME_CHANNEL` 已在 config.yaml 中配置。

**原因：** `WEIXIN_HOME_CHANNEL` 仅设置默认推送目标，但完整的微信平台配置需要额外的凭证：
- `WEIXIN_TOKEN`：微信访问令牌
- `WEIXIN_ACCOUNT_ID`：微信账号标识

仅配置 `WEIXIN_HOME_CHANNEL` 时，推送会失败并报错"Platform 'weixin' is not configured"。

**验证方式：**
```python
import os
from tools.send_message_tool import send_message_tool

# 检查环境变量
print(f"WEIXIN_TOKEN: {bool(os.getenv('WEIXIN_TOKEN'))}")
print(f"WEIXIN_ACCOUNT_ID: {bool(os.getenv('WEIXIN_ACCOUNT_ID'))}")
print(f"WEIXIN_HOME_CHANNEL: {os.getenv('WEIXIN_HOME_CHANNEL')}")

# 测试推送（会失败）
result = send_message_tool({
    'action': 'send',
    'message': 'test',
    'target': 'weixin:o9cq801Q4BDVa20m46H0KTKRUOjo@im.wechat'
})
print(result)
```

**解决方案（按场景）：**
1. **Cron 任务场景（已配置 deliver）：** 如果 cron 任务配置了 `deliver: "weixin:xxx"` 参数，系统会通过内部 gateway 处理推送，可能不需要直接的 weixin 凭证。检查 cron 任务的 deliver 配置。
2. **直接调用 send_message_tool 场景：** 需要配置完整的微信凭证（WEIXIN_TOKEN, WEIXIN_ACCOUNT_ID）。运行 `hermes tools` 选择 WeChat 配置项。
3. **降级方案：** 如果微信推送失败，摘要仍会生成并保存到文件。可以配置 Telegram 或其他渠道作为替代。

**注意：** 在 cron 任务中，如果 `deliver` 参数已正确配置，系统会自动通过内部 gateway 推送，最终响应可以保持简洁（系统会处理推送）。

## 定时任务配置示例

```yaml
# cronjob create
action: create
schedule: "0 17 * * *"  # 每天 17:00 执行
name: "喷嚏图卦每日推送"
prompt: |
  1. 访问 https://www.dapenti.com/blog/index.asp
  2. 查找最新喷嚏图卦链接
  3. 打开文章页面提取内容
  4. 对每条新闻搜索补充背景信息
  5. 按增强格式总结并输出
```

## 相关技能
- `daily-news-scraper`: 通用每日新闻抓取流程
- `buzzing-news-scraper`: Buzzing.cc 新闻抓取
- `freshrss-new-article-monitor`: FreshRSS 新文章监控