这不是一个“定时抓新闻”的小脚本,而是一条完整的 OpenClaw 自动化链路:定时触发、子代理执行、抓取新闻、整理摘要、回帖到固定主题、更新状态文件。
如果你想做一个“每小时自动检查新闻,并把新进展持续追加到同一个帖子里”的任务,这个案例可以直接参考。
这个任务的名字是:update-iran-news-hourly
对应的论坛帖子地址是:
https://www.sunai.net/t/topic/1185
它的目标很明确:每小时检查一次伊朗相关冲突新闻;如果过去 1 小时内有足够重要的新进展,就整理成一条结构化摘要,回复到同一个论坛主题里;如果没有显著更新,就静默跳过。
一 这套方案的核心是什么
一句话概括:
OpenClaw 负责定时调度和执行编排,subagent 负责实际跑任务,新闻内容通过网页抓取获取,最后把结果持续回复到固定的论坛主题里。
完整链路是这样:
暂时无法在飞书文档外展示此内容
这个任务不是“每小时发一条消息”那么简单,它有两个关键点:
-
只在有显著新增进展时才发帖
-
不是新开帖子,而是持续更新同一个主题
这两个点决定了它更像“持续战况追踪”,而不是“定时报平安”。
二 过程简述
-
在 OpenClaw 里写好任务文档
tasks/update-iran-news.md -
用 cron 每小时触发一次
-
触发时使用
sessions_spawn启动 subagent 执行任务 -
任务里用
web_fetch抓 Google News 的相关新闻 -
对新闻做筛选,判断过去 1 小时内是否有重大新增
-
如果有,就整理成固定格式的 Markdown 摘要
-
通过 Discourse API 回复到固定主题
https://www.sunai.net/t/topic/1185 -
无论发不发帖,都更新本地状态文件,避免重复发同样的内容
三 逻辑拆分
这个任务适合拆成四部分。
1. 任务文档
任务文档负责定义:
-
去哪里抓新闻
-
抓什么关键词
-
什么算“重大更新”
-
发帖格式长什么样
-
什么情况应该跳过
-
成功和失败怎么判定
它相当于执行说明书。
2. 调度方式
调度方式负责定义:
-
多久执行一次
-
用什么 prompt 触发
-
是否使用 subagent
-
成功后是否静默
这个任务的配置是:
-
任务名:
update-iran-news-hourly -
cron:
0 * * * * -
时区:
Asia/Shanghai -
thinking:
low -
触发方式:OpenClaw cron + subagent
3. 发布目标
这个任务不是把内容发到聊天软件,而是持续回复到固定论坛主题:
-
论坛:
https://www.sunai.net -
主题:
https://www.sunai.net/t/topic/1185
这意味着它的重点不只是“生成内容”,而是“持续维护一个主题帖的更新节奏”。
4. 状态管理
这个任务必须有状态文件,不然很容易重复发帖。
当前状态文件是:
~/.openclaw/workspace/cron-logs/iran-news-state.json
它至少要记录这些信息:
-
上次检查时间
-
上次更新时间
-
上次发帖 ID
-
已见过的新闻 URL
-
最近的伤亡统计
-
当前战争状态
四 任务文档示例
任务文档位置:
~/.openclaw/workspace/tasks/update-iran-news.md
下面是这一类任务的核心写法。
## 伊朗新闻更新任务
**任务:**
1. 使用 `web_fetch` 工具抓取 Google News(英文搜索)的最新冲突新闻。搜索关键词:Iran Israel US conflict。
2. 整理过去1小时内最新、最重要的冲突进展。
3. 使用 `humanizer-zh` Skill 处理新闻摘要,确保内容简洁、理性、直接,并避免 AI 风格。
4. 严格按照模板格式生成报告。
5. 如果搜索不到足够显著的新闻,则不回复帖子,但更新本地状态文件。
6. 使用 Discourse API 回复 SunAI 论坛帖子 1185。
7. 更新状态文件:`~/.openclaw/workspace/cron-logs/iran-news-state.json`
8. 若任务成功但过去 1 小时无显著新增重大进展,应输出 `ANNOUNCE_SKIP`。
完成后静默:如果任务成功且无异常,最终必须只回复 `ANNOUNCE_SKIP`;若失败再返回错误信息。
这类任务有两个很重要的要求:
-
只在有新内容时发布
-
没有新内容也要更新状态
否则要么刷屏,要么重复发旧闻。
五 cron 任务描述怎么写
这里同样适用一个经验:cron 描述不要太重,详细规则写进任务文档。
当前这条任务实际使用的 prompt 是:
使用 sessions_spawn 启动一个 subagent 执行任务:update-iran-news。严格按 ~/.openclaw/workspace/tasks/update-iran-news.md 执行;成功仅输出 ANNOUNCE_SKIP;失败输出错误原因。
这类写法的好处是:
-
cron 只负责触发
-
具体规则都在任务文档里
-
后面要调模板、调来源、调判断条件时,不用频繁改 cron
六 怎么新建这个 cron 任务
方式 A:直接用 OpenClaw 的 cron 命令创建
openclaw cron add \
--schedule "0 * * * *" \
--prompt "使用 sessions_spawn 启动一个 subagent 执行任务:update-iran-news。严格按 ~/.openclaw/workspace/tasks/update-iran-news.md 执行;成功仅输出 ANNOUNCE_SKIP;失败输出错误原因。" \
--thinking low
这条配置的意思是:
-
每小时整点执行一次
-
通过 subagent 执行任务文档
-
成功就静默
-
失败才报错
方式 B:直接让 agent 帮你创建
如果不想手敲命令,可以直接这样说:
请帮我创建一个 OpenClaw cron 任务:
- 名称:update-iran-news-hourly
- 执行时间:每小时整点一次(Asia/Shanghai)
- 执行内容:使用 sessions_spawn 启动一个 subagent 执行任务:update-iran-news。严格按 ~/.openclaw/workspace/tasks/update-iran-news.md 执行;成功仅输出 ANNOUNCE_SKIP;失败输出错误原因。
- thinking: low
如果已有同名任务,就更新它,不要重复创建。
创建完成后,把任务 ID 和最终配置回给我。
七 为什么这个任务要用 subagent
这个任务适合用 subagent,而不是直接在主链路里跑,原因很实际:
-
它是定时任务,不需要占住主会话
-
它会抓网页、整理内容、做判断,链路比普通提醒长
-
它还要回帖和写状态文件,失败时也需要留出排查空间
所以更稳的方式是:
cron 负责叫醒,subagent 负责干活。
这样任务边界更清楚,主链路也更干净。
八 需要用到的能力
| 能力 / 工具 | 用途 | 说明 |
|---|---|---|
web_fetch |
抓取 Google News 新闻页 | 用来拿最新冲突新闻内容。 |
humanizer-zh |
优化摘要文风 | 让最终内容更简洁、理性、直接。 |
Discourse API / discourse |
回复论坛主题 | 把更新持续发到同一个主题帖里。 |
| OpenClaw cron | 定时触发 | 每小时整点运行一次。 |
sessions_spawn / subagent |
隔离执行任务 | 让任务在独立执行链路中完成。 |
| 状态文件 | 防重复发布 | 记录上次检查、上次发帖和已见新闻。 |
九 这个任务最值得保留的几个设计点
-
不是有定时就发,而是先判断值不值得发
-
不是每次新开帖子,而是持续更新同一个主题
-
不是只看是否成功发帖,还要维护状态文件
-
不是主会话硬跑,而是交给 subagent 独立执行
这几个点结合起来,任务就会很像一个“持续运行的专题更新器”,而不是一个粗糙的自动发帖脚本。
十 最短复刻版
如果只想照着搭一个同类任务,可以直接按下面这个思路走:
-
写一份任务文档,定义数据源、模板和跳过条件
-
用 OpenClaw cron 设成每小时运行一次
-
用 subagent 执行任务,避免主链路变重
-
用网页抓取拿新闻,再筛选过去 1 小时内的重大进展
-
把内容持续回复到同一个帖子,而不是每次新发
-
同时维护状态文件,避免重复更新
这样,一个可持续运行的新闻追踪任务就搭起来了。
帖子地址
最后把这次案例对应的帖子地址单独列出来,方便直接查看:
- SunAI 主题帖:
https://www.sunai.net/t/topic/1185
如果你之后要复刻别的新闻追踪任务,只需要替换关键词、目标主题和模板,就可以沿用同一套思路。