---
name: automated-news-cronjob
display_name: 定时新闻抓取推送 (Automated News Cronjob)
description: 创建定时任务，自动抓取指定网站内容、总结并推送到消息渠道
author: Hermes Agent
version: 1.0.0
env: []
---

# automated-news-cronjob 定时新闻抓取推送技能

本技能用于创建定时任务，自动抓取网站内容（如新闻、博客等），总结后推送到指定消息渠道（微信/Telegram 等）。

## 适用场景

- 每日新闻简报自动推送
- 博客/网站更新监控
- 定时内容抓取 + 总结 + 推送
- 周期性信息收集任务

## 配置步骤

### 1. 分析目标网站结构

```bash
# 使用浏览器工具访问目标网站
browser_navigate url="https://example.com"

# 查找目标内容的链接模式
# 例如：查找包含特定关键词的链接
# 【喷嚏图卦 XXXXX】格式
```

### 2. 创建 Cronjob

```python
cronjob action="create"
  name="任务名称"
  schedule="50 16 * * *"  # Cron 表达式
  deliver="weixin:user_id"  # 或 telegram:chat_id
  prompt="完整的自包含任务描述"
```

### 3. 编写自包含 Prompt

**关键要素：**
- 完整的目标 URL
- 查找逻辑（如何定位最新内容）
- 总结格式要求
- 推送渠道
- 容错机制（重试次数、备选方案）

**Prompt 模板：**
```
请完成以下任务：

1. 访问 [目标 URL]
2. 查找 [内容特征，如"喷嚏图卦 + 日期编号"]
3. 选择 [选择逻辑，如"日期最新的链接"]
4. 打开该页面并提取内容
5. 总结为 [格式要求]
6. 通过 [推送渠道] 发送给用户

**查找逻辑：**
- 在页面中搜索包含"[关键词]"的链接
- 提取 [特征信息，如日期编号 YYYYMMDD]
- 选择 [选择标准，如最新日期]

**总结格式要求：**
- 标题格式
- 内容分类（国内/国际/财经/科技等）
- 每条新闻简明扼要
- 使用 emoji 点缀
- 总字数控制在 [X] 字以内

**容错机制：**
- 页面访问失败 → 重试最多 3 次
- 当天内容未发布 → 推送最新已发布内容
- 总结失败 → 发送错误通知
```

### 4. 设置推送渠道

| 渠道 | 格式 | 示例 |
|------|------|------|
| 微信 | `weixin:user_id` | `weixin:o9cq801Q4BDVa20m46H0KTKRUOjo@im.wechat` |
| Telegram | `telegram:chat_id` | `telegram:6785724728` |
| 企业微信 | `wecom` | `wecom` |

### 4.1 Telegram 推送配置（OpenClaw）

如果使用 OpenClaw 作为推送渠道，需要确保：

1. **Telegram Bot Token 已配置**：
   ```bash
   # 配置文件位置
   cat ~/.openclaw/openclaw.json | grep botToken
   # 输出："botToken": "8776549268:xxx"
   ```

2. **Session 文件已存在**（首次推送后会自动创建）：
   ```bash
   ls ~/.openclaw/agents/main/sessions/telegram-<chatId>.jsonl
   ```

3. **AllowFrom 配置**（允许该 chatId 接收消息）：
   ```bash
   cat ~/.openclaw/credentials/telegram-default-allowFrom.json
   # 应包含：{ "allowFrom": ["6785724728"] }
   ```

4. **手动推送测试命令**（非 cronjob 模式）：
   ```bash
   openclaw agent \
     --session-id "telegram-6785724728" \
     --channel telegram \
     --message "测试消息内容" \
     --deliver \
     --reply-to "6785724728"
   ```

   **关键参数说明**：
   - `--session-id "telegram-<chatId>"`：使用已存在的会话
   - `--channel telegram`：指定 Telegram 渠道
   - `--deliver`：启用消息投递
   - `--reply-to "<chatId>"`：**必需**，Telegram 需要明确的目标 chatId

### 5. 测试运行

```bash
# 手动触发一次测试
cronjob action="run" job_id="任务 ID"
```

**注意：** Cronjob 是**异步执行**的：
- 任务在独立会话中运行（不影响当前对话）
- 预计完成时间：1-3 分钟（取决于网页加载和总结复杂度）
- 完成后直接推送到指定渠道，不会在当前会话显示结果
- 可通过 `cronjob action="list"` 查看 `last_run_at` 和 `last_status` 确认执行状态

## Cron 表达式示例

| 表达式 | 含义 |
|--------|------|
| `50 16 * * *` | 每天 16:50 |
| `0 9 * * *` | 每天 9:00 |
| `0 21 * * *` | 每天 21:00 |
| `0 */2 * * *` | 每 2 小时 |
| `0 9 * * 1-5` | 工作日 9:00 |

## 完整示例：喷嚏图卦每日推送

### Cronjob 模式（推荐）

```python
cronjob action="create"
  name="喷嚏图卦每日推送"
  schedule="50 16 * * *"
  deliver="telegram:6785724728"
  prompt="""
请完成以下任务：

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

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

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

**容错机制：**
- 页面访问失败 → 重试最多 3 次
- 当天图卦未发布 → 推送最新已发布的图卦内容
"""
```

### 手动执行模式（OpenClaw）

如果需要在当前会话中立即执行并推送（非 cronjob）：

```bash
# 1. 访问网站并获取内容
browser_navigate url="https://www.dapenti.com/blog/index.asp"

# 2. 找到最新图卦链接（查找包含"喷嚏图卦"的链接）
# 从快照中提取文章 ID，如 192396

# 3. 访问文章页面
browser_navigate url="https://www.dapenti.com/blog/more.asp?name=xilei&id=192396"

# 4. 提取完整内容
browser_console expression="document.body.innerText"

# 5. 整理总结后推送
openclaw agent \
  --session-id "telegram-6785724728" \
  --channel telegram \
  --message "📰 喷嚏图卦 20260413

🕐 发布时间：2026 年 4 月 13 日 15:02

【国内热点】
🇭🇰 香港电子烟新规...
（完整总结内容）
" \
  --deliver \
  --reply-to "6785724728"
```

## 注意事项

### 1. 网站结构变化
- 定期检查目标网站结构是否变化
- 如查找逻辑失效，需更新 prompt

### 2. 反爬虫机制
- 部分网站有反爬措施
- 可能需要设置 User-Agent 或使用浏览器工具

### 3. 推送渠道配置
- 微信：需要正确的 user_id 格式
- Telegram：需要 chat_id
- 确保渠道已配置且可用

### 4. 内容时效性
- 设置合理的执行时间
- 考虑内容发布的时间规律（如每天下午发布）

### 5. 错误处理
- 设置重试机制
- 考虑备选方案（如当天内容未发布）

## 常见任务类型

| 任务类型 | 目标网站 | 查找特征 | 推送频率 |
|---------|---------|---------|---------|
| 新闻简报 | 新浪/网易/东方财富 | 最新新闻列表 | 每天 2 次 |
| 博客更新 | 个人博客 | 最新文章 | 每天 1 次 |
| 公告监控 | 政府/企业网站 | 最新公告 | 每天 1 次 |
| 价格监控 | 电商网站 | 商品价格 | 每小时 |

## 故障排查

### 问题：找不到目标链接
- 检查网站结构是否变化
- 使用 browser_snapshot 查看页面元素
- 调整查找关键词

### 问题：推送失败
- 检查推送渠道配置
- 验证 user_id/chat_id 是否正确
- 查看 cronjob 执行日志

### 问题：总结质量差
- 优化 prompt 中的格式要求
- 调整字数限制
- 明确分类标准

### 问题：浏览器点击链接后页面为空
- 某些网站点击链接后可能加载失败
- **解决方案：** 直接构造完整 URL 访问，而不是点击链接
  ```bash
  # 不要这样做：
  browser_click ref="@e20"  # 可能失败
  
  # 应该这样做：
  browser_navigate url="https://www.example.com/more.asp?id=12345"
  ```

### 问题：内容发布时间不固定
- 部分网站内容发布时间不固定（如喷嚏图卦可能下午或晚上发布）
- **解决方案：** 
  - 设置执行时间略晚于通常发布时间（如 16:50 而非 9:00）
  - 在 prompt 中说明"如果当天内容未发布，推送最新已发布内容"
  - 考虑设置多个时间点检查

### 问题：Telegram 推送失败 - "Delivering to Telegram requires target <chatId>"
- **原因**：缺少 `--reply-to` 参数或 session 未正确关联
- **解决方案**：
  ```bash
  # 必须同时指定 session-id 和 reply-to
  openclaw agent \
    --session-id "telegram-6785724728" \
    --channel telegram \
    --message "内容" \
    --deliver \
    --reply-to "6785724728"  # 必需！
  ```

### 问题：Telegram 推送失败 - "Channel is required when multiple channels are configured"
- **原因**：系统配置了多个渠道（telegram, weixin, wecom），必须明确指定
- **解决方案**：添加 `--channel telegram` 参数

### 问题：Telegram 推送失败 - "Pass --to <E.164>, --session-id, or --agent to choose a session"
- **原因**：没有指定会话，系统不知道使用哪个会话上下文
- **解决方案**：添加 `--session-id "telegram-<chatId>"` 参数

### 问题：浏览器点击链接后页面内容为空或加载失败
- **原因**：某些网站的链接点击后可能触发 JavaScript 跳转或加载失败
- **解决方案**：直接构造完整 URL 访问，而不是点击链接
  ```bash
  # 不要这样做：
  browser_click ref="@e20"  # 可能失败
  
  # 应该这样做：
  browser_navigate url="https://www.dapenti.com/blog/more.asp?name=xilei&id=192396"
  ```

### 问题：Telegram 推送失败 - 直接 API 调用返回 "chat not found" 或 token 被隐藏
- **原因**：系统对敏感信息（如 Telegram bot token）进行安全保护，`.env` 中显示为 `827408...2SM0` 或 `***`，导致直接调用 Telegram API 失败
- **症状**：
  ```bash
  # 直接 curl 调用失败
  curl -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" ...
  # 返回：{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}
  ```
- **解决方案**：使用 `openclaw agent` 命令，通过已存在的会话文件推送（不依赖明文 token）
  ```bash
  # 正确方式 - 使用 openclaw agent
  openclaw agent \
    --session-id "telegram-6785724728" \
    --channel telegram \
    --message "消息内容" \
    --deliver \
    --reply-to "6785724728"
  ```
- **原理**：
  - `openclaw agent` 使用 `~/.openclaw/agents/main/sessions/telegram-<chatId>.jsonl` 会话文件
  - 会话文件包含已建立的连接状态，无需明文 token
  - 系统内部处理 token 解析，绕过安全保护限制
- **前提条件**：
  - 会话文件已存在（首次推送后自动创建）
  - `~/.openclaw/credentials/telegram-default-allowFrom.json` 包含目标 chatId

### 问题：页面快照内容被截断
- **原因**：页面内容过长，snapshot 默认只返回部分
- **解决方案**：
  ```bash
  # 使用 full=true 获取完整内容
  browser_snapshot full=true
  
  # 或使用 console 提取完整文本
  browser_console expression="document.body.innerText"
  ```
