---
name: daily-news-scraper
display_name: 每日新闻抓取推送 (Daily News Scraper)
description: 基于浏览器自动化的每日新闻抓取、总结并推送到消息渠道的完整流程
author: Hermes Agent
version: 1.0.0
tags:
  - browser
  - cronjob
  - news
  - automation
  - wechat
  - telegram
---

# daily-news-scraper 每日新闻抓取推送 skill

本 Skill 用于配置定时任务，自动抓取指定新闻网站内容、总结并推送到微信/Telegram 等消息渠道。

## 适用场景

- 每日新闻简报自动推送
- 特定网站内容监控
- RSS 源替代方案（当网站无 RSS 时）
- 定时内容汇总报告

## 完整工作流程

### 1. 创建定时任务

```python
cronjob(
    action='create',
    name='新闻每日推送',
    schedule='50 16 * * *',  # 每天 16:50 执行
    deliver='weixin:<user_id>@im.wechat',  # 或 telegram:<chat_id>
    prompt='''请完成以下任务：

1. 访问目标网站 URL
2. 查找最新内容链接（根据特定关键词/格式）
3. 打开文章页面
4. 提取主要内容并总结
5. 通过消息渠道推送给用户

**总结格式要求：**
- 标题 + 日期
- 分类汇总（国内、国际、财经、科技等）
- 每条新闻简明扼要
- 使用 emoji 点缀
- 总字数控制在 800 字以内

**注意：**
- 使用浏览器工具访问网页
- 页面访问失败重试最多 3 次
- 如果当天内容未发布，推送最新已发布内容
'''
)
```

### 2. 浏览器自动化抓取

```python
# 访问网站首页
browser_navigate(url='https://www.example.com')

# 查找目标链接（通过关键词匹配）
# 在页面快照中搜索包含特定关键词的链接
# 例如：【喷嚏图卦 XXXXX】格式

# 打开文章页面
browser_click(ref='@e15')  # 点击找到的链接

# 获取完整内容
browser_snapshot(full=True)

# 或使用 console 提取结构化数据
browser_console(expression='''
Array.from(document.querySelectorAll('article, .content, p'))
  .map(el => el.innerText.trim())
  .filter(text => text.length > 50)
''')
```

### 3. 内容总结要点

**提取原则：**
- 识别文章标题和发布时间
- 按主题分类（国内/国际/财经/科技/社会等）
- 每条新闻保留核心信息（谁 + 做了什么 + 结果）
- 去除广告、推荐等无关内容

**总结格式模板：**
```
📰 [新闻栏目] [日期编号]
【副标题/主题】
发布时间：YYYY 年 M 月 D 日 HH:MM

🌍 国内国际要闻
1. 新闻标题 - 核心内容简述
2. 新闻标题 - 核心内容简述

💰 财经金融
...

💻 科技互联网
...

📌 重点关注/温馨提示
...

来源：网站名称
```

### 4. 消息推送

**推荐方式（Cron Job 自动投递）：**
```python
cronjob(
    action='create',
    name='新闻每日推送',
    schedule='50 16 * * *',
    deliver='weixin:o9cq801Q4BDVa20m46H0KTKRUOjo@im.wechat',  # 系统自动处理
    prompt='...'
)
```

**微信推送（手动）：**
```python
deliver='weixin:o9cq801Q4BDVa20m46H0KTKRUOjo@im.wechat'
```

**Telegram 推送（手动）：**
```python
deliver='telegram:6785724728'
# 注意：用户必须先与 Bot 开始对话，否则推送会失败
```

**⚠️ 重要：** Cron Job 任务应使用 `deliver` 参数由系统自动投递，**不要**在 prompt 中手动调用 HTTP API 发送消息。系统会根据 deliver 配置自动选择正确的渠道和凭证。

### 5. 定时任务管理

```python
# 查看任务列表
cronjob(action='list')

# 手动测试运行
cronjob(action='run', job_id='任务 ID')

# 暂停/恢复任务
cronjob(action='pause', job_id='任务 ID')
cronjob(action='resume', job_id='任务 ID')

# 更新任务配置
cronjob(action='update', job_id='任务 ID', prompt='新 prompt', schedule='新时间表')

# 删除任务
cronjob(action='remove', job_id='任务 ID')
```

## 实战案例：喷嚏图卦每日推送

**目标网站：** https://www.dapenti.com/blog/index.asp

**Cron 表达式：** `50 16 * * *`（每天 16:50，图卦通常在下午发布）

**推送渠道：** 微信/Telegram

### 完整实现代码

```python
# 步骤 1：访问首页
browser_navigate(url='https://www.dapenti.com/blog/index.asp')

# 步骤 2：查找最新图卦链接
# 在页面快照中搜索包含"喷嚏图卦"的链接，格式如【喷嚏图卦 20260416】
# 选择列表中第一个出现的图卦链接（最新的）

# 步骤 3：打开文章页面
browser_click(ref='@e15')  # 点击找到的链接 ref

# 步骤 4：提取完整内容
browser_console(expression='document.body.innerText')
# 或
browser_snapshot(full=True)

# 步骤 5：总结并推送（cronjob 自动处理 deliver）
```

**查找逻辑：**
1. 访问首页
2. 搜索包含"喷嚏图卦"关键词的链接
3. 提取日期编号（格式 YYYYMMDD）
4. 选择日期最新的链接（通常是列表中第一个）
5. 打开文章页面（more.asp?name=xilei&id=文章 ID）

**总结格式模板：**
```
📰 喷嚏图卦 [日期编号]
发布时间：YYYY-MM-DD HH:MM

📊 国内热点
🏛️ 经济数据
• 新闻标题 - 核心内容
• 新闻标题 - 核心内容

⚖️ 社会新闻
• 新闻标题 - 核心内容

🌍 国际局势
🇺🇸 美国动态
• 新闻标题 - 核心内容

🇮🇷 中东局势
• 新闻标题 - 核心内容

💡 核心观点
本期聚焦...（1-2 句总结）

来源：喷嚏网 www.dapenti.com
```

**字数控制：** 500-800 字

**Cron 任务配置示例：**
```python
cronjob(
    action='create',
    name='喷嚏图卦每日推送',
    schedule='50 16 * * *',
    deliver='telegram:6785724728',  # 或 weixin:<channel_id>
    prompt='''请完成以下任务：

1. 访问 https://www.dapenti.com/blog/index.asp
2. 查找最新的【喷嚏图卦 XXXXX】文章链接
3. 打开该文章页面
4. 提取文章主要内容并总结
5. 将总结内容推送给用户

**查找逻辑：**
- 在页面中搜索包含"喷嚏图卦"关键词的链接
- 提取日期编号（格式 YYYYMMDD）
- 选择日期最新的那个链接

**总结格式要求：**
- 标题：📰 喷嚏图卦 [日期编号]
- 发布时间
- 主要内容分类汇总（国内热点、国际局势、社会新闻、财经科技等）
- 核心观点/重点事件
- 每条新闻简明扼要，使用 emoji 点缀
- 总字数控制在 800 字以内

**注意：**
- 使用浏览器工具访问网页
- 如果页面访问失败，重试最多 3 次
- 如果当天图卦未发布，推送最新已发布的图卦内容
'''
)
```

## 常见问题与解决方案

### 问题 1：网站反爬虫 / Bot 检测墙

**症状：** 浏览器访问被拦截（返回 "Our systems have detected unusual traffic" 等页面）

**解决方案（按优先级）：**

**方案 A（首选）：RSS 回退法**
当浏览器被墙时，Google News RSS 是获取新闻的高效替代：

```bash
# 英文新闻
curl -s "https://news.google.com/rss/search?q=Putin+visit+China+2026&hl=en-US&gl=US&ceid=US:en"

# 中文新闻
curl -s "https://news.google.com/rss/search?q=关键词&hl=zh-CN&gl=CN&ceid=CN:zh-Hans"

# 俄文新闻
curl -s "https://news.google.com/rss/search?q=Путин+Китай+2026&hl=ru&gl=RU&ceid=RU:ru"
```

RSS 输出为 XML，可结合 `grep`、`sed`、`awk` 提取标题/链接/描述。

**典型 RSS 字段提取：**
```bash
# 提取所有文章标题
curl -s "https://news.google.com/rss/search?q=关键词" | grep -oP '(?<=<title>)[^<]+'

# 提取链接（需要解码 URL）
curl -s "https://news.google.com/rss/search?q=关键词" | grep -oP 'https://news.google.com/rss/articles/[^&"]+'
```

**方案 B：Stealth 模式 + 延迟**
- 使用 browser_navigate 的 stealth 模式
- 添加随机延迟：`sleep(random(1, 3))`
- 设置 User-Agent 头
- 降低抓取频率

**方案 C：换个搜索引擎**
- Google 被墙 → 换 Bing（但 Bing 也有验证墙）
- 尝试 DuckDuckGo：`https://duckduckgo.com/?q=关键词&format=rss`

**经验总结：** 当 Google News RSS 可用时，它比浏览器更稳定、更快、也更不可能被墙——优先检查 RSS 源！

### 问题 2：凭证获取（.env 文件值被截断）

**症状：** 读取 `.env` 文件时 API key/token 显示为 `827408...2SM0` 截断格式

**原因：** 这是 Hermes 系统的安全保护机制，敏感凭证在读取时自动脱敏显示。

**解决方案：**

**方案 A（推荐）：** 使用 cronjob 的 `deliver` 参数，由系统自动处理凭证：
```python
cronjob(
    action='create',
    name='新闻每日推送',
    schedule='50 16 * * *',
    deliver='telegram:6785724728',  # 系统自动使用配置的 TELEGRAM_BOT_TOKEN
    prompt='抓取新闻并总结...'
)
```

**方案 B：** 如果必须在代码中使用 token，通过环境变量读取（系统在 cron 执行时会自动注入）：
```python
import os
telegram_token = os.getenv('TELEGRAM_BOT_TOKEN')  # 系统自动注入完整 token
wechat_token = os.getenv('WEIXIN_TOKEN')  # 格式：account:token
```

**注意：** 
- 微信 token 格式通常是 `account:token`，需要正确解析
- 不要在 prompt 中手动调用 HTTP API 发送消息，优先使用 `deliver` 参数

### 问题 3：Telegram Bot 推送失败

**症状 1：** 返回 `{"ok":false,"error_code":401,"description":"Unauthorized"}`

**原因：** Bot token 不正确或已失效。

**解决方案：** 
- 检查 `TELEGRAM_BOT_TOKEN` 环境变量配置
- 在 BotFather 重新生成 token 并更新配置
- 使用 cronjob 的 `deliver` 参数让系统自动处理

**症状 2：** 返回 `{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}`

**原因：** Telegram Bot 无法主动向未先与 Bot 交互的用户发送消息。用户必须先：
1. 在 Telegram 中搜索并打开 Bot
2. 点击 "Start" 或发送任意消息
3. 之后 Bot 才能主动推送

**验证方法：**
```python
import os
import requests
token = os.getenv('TELEGRAM_BOT_TOKEN')
url = f"https://api.telegram.org/bot{token}/getUpdates"
# 如果 result 为空数组，说明无活跃会话
```

**解决方案：**
- 优先使用微信推送（配置了 WEIXIN_HOME_CHANNEL）
- 或让用户先与 Telegram Bot 开始对话
- 或在 cronjob 中使用 `deliver='telegram:chat_id'` 由系统处理

### 问题 4：微信 API 调用失败（404）

**症状：** 微信 API 返回 404 错误

**原因：** 微信 API 端点可能变化，或需要使用系统内置的消息通道

**解决方案：**
- 优先使用 cronjob 的 `deliver` 参数，而非手动调用微信 API
- 微信推送配置：`deliver='weixin:o9cq801Q4BDVa20m46H0KTKRUOjo@im.wechat'`
- 系统会自动处理 token 刷新和 API 调用

### 问题 2：内容结构变化

**症状：** 提取器找不到目标元素

**解决方案：**
- 使用更通用的选择器（如全文搜索关键词）
- 添加多个备选提取策略
- 在 prompt 中说明"如果格式变化，智能识别主要内容"

### 问题 3：推送延迟

**症状：** cronjob 执行后未立即收到消息

**解决方案：**
- cronjob 是异步执行，需等待 1-3 分钟
- 检查任务状态：`cronjob(action='list')`
- 查看日志：`/root/.hermes/logs/agent.log`
- 确认推送渠道配置正确

### 问题 4：当天内容未发布

**症状：** 找不到当天的新闻

**解决方案：**
- 在 prompt 中说明"如果当天内容未发布，推送最新已发布内容"
- 添加日期判断逻辑
- 设置合理的执行时间（在内容发布后）

## 扩展应用

### 多源新闻汇总

```python
# 创建多个 cronjob，不同时间执行
# 源 1: 9:00 执行，抓取早间新闻
# 源 2: 21:00 执行，抓取晚间新闻
# 源 3: 16:50 执行，抓取特定垂直领域新闻
```

### 关键词监控推送

```python
# 监控特定关键词，出现时立即推送
# 例如：监控"政策发布"、"行业动态"等
# 结合 cronjob 的短间隔执行（如每小时）
```

### RSS 源补充

```python
# 当网站无 RSS 时，用此方法替代
# 定期抓取 + 总结 + 推送
# 效果类似 RSS，但更智能（有总结）
```

## 最佳实践

1. **执行时间选择：** 在内容发布后 30-60 分钟执行，确保内容已更新
2. **字数控制：** 总结控制在 500-800 字，避免消息过长
3. **emoji 使用：** 适度点缀，增强可读性但不过度
4. **错误处理：** prompt 中明确重试次数和降级策略
5. **测试流程：** 创建后先用 `cronjob(action='run')` 手动测试
6. **日志监控：** 定期检查任务执行状态和错误信息

## 相关技能

- `browser-automation`: 浏览器基础操作
- `automated-news-cronjob`: 定时任务配置
- `content-summarization`: 内容总结技巧
