需求场景

你是否遇到过这些情况:

  • 早上打开电脑,先花 15 分钟翻各种群、邮件、新闻,了解昨天发生了什么
  • 想让 AI 每天自动整理一份简报,但不知道该怎么实现
  • 试过一些自动化工具,但配置复杂、维护成本高

本文介绍一种零门槛的方案:用 OpenClaw 内置的 cron 系统,让 AI 定时自动醒来,抓取多源信息,生成结构化简报,然后推送到位。全程不需要你发任何指令。

整体架构

整个 pipeline 的数据流如下:

┌─────────────────────────────────────────────────────┐
│                   定时触发层                          │
│         cron 定时器,每天固定时间唤醒                   │
└──────────────────────┬──────────────────────────────┘
                       ↓
┌─────────────────────────────────────────────────────┐
│                   执行层                             │
│   OpenClaw isolated agent(独立 session,不污染主会话) │
└──────────────────────┬──────────────────────────────┘
                       ↓
┌─────────────────────────────────────────────────────┐
│                   采集层(并行)                       │
│  天气查询  │  Discord 消息  │  QQ 消息  │  新闻搜索   │
└──────────────────────┬──────────────────────────────┘
                       ↓
┌─────────────────────────────────────────────────────┐
│                   生成层                             │
│            LLM 汇总 + 格式化输出                       │
└──────────────────────┬──────────────────────────────┘
                       ↓
┌─────────────────────────────────────────────────────┐
│                   推送层                             │
│          Discord / QQ / 微信 / 邮件                    │
└─────────────────────────────────────────────────────┘

为什么用 isolated session?

因为普通 session 会累积对话历史。如果简报任务跑在主会话里,每次简报的内容都会进入主会话上下文,导致 token 越积越多,后续对话越来越慢甚至超限。isolated session 每次独立运行,用完即弃,主会话不受影响。


第一步:理解 cron 任务的组成

OpenClaw 的 cron 任务由以下几个核心部分构成:

{
  "name": "任务名称",
  "schedule": { "kind": "cron", "expr": "0 9 * * *", "tz": "Asia/Shanghai" },
  "payload": { "kind": "agentTurn", "message": "AI 的指令内容" },
  "sessionTarget": "isolated",
  "delivery": { "mode": "announce", "channel": "discord" }
}

schedule 描述"什么时候跑",payload 描述"跑什么",delivery 描述"跑完后结果发到哪里"。


第二步:设计简报生成 prompt

prompt 是整个 pipeline 的核心。prompt 的质量直接决定简报的可读性和有用程度。

一个结构良好的简报 prompt 应该包含以下部分:

明确任务角色

让 AI 扮演一个专业的简报机器人,而不是泛泛的助手:

你是一个每日简报生成机器人。你的职责是:
1. 收集多方信息来源
2. 提取最重要的内容
3. 用统一格式输出,不废话,不重复

列出所有信息来源

明确告诉 AI 需要查哪些来源:

请依次执行以下步骤:
1. 调用 weather skill 查询北京当前天气和未来 24 小时预报
2. 读取 Discord 频道 1465212107313123491 最近 20 条消息,记录重要事件
3. 读取 QQ 频道最近 20 条消息
4. 使用 tavily_search 搜索今日 AI 行业热点(最多 3 条)
5. 检查 cron 任务状态(调用 cron list),确认有无报错

指定输出格式

格式统一便于阅读,也便于后续解析:

整合以上信息,按以下格式输出(不留空白项,无内容写"无"):

📅 今日概览
月 日 星期X | 天气:XX / XX°C

🌤️ 天气预报
白天 / 夜间,XX°C,XX 天气

📌 今日待办
• 待办项 1
• 待办项 2(如无则写"暂无")

📡 重要动态
• 事件描述(来源:Dicord/QQ/新闻)

⚠️ 需要关注
• 异常情况或需要人工处理的事项
• 任务执行状态(有报错时)

加入异常处理

prompt 末尾加一句容错指导:

如果某项信息获取失败,直接跳过该项继续执行后续步骤,不要报错,不要询问。

第三步:完整配置示例

基础版本(每天 9 点 Discord 推送)

{
  "name": "daily-briefing",
  "schedule": {
    "kind": "cron",
    "expr": "0 9 * * *",
    "tz": "Asia/Shanghai"
  },
  "payload": {
    "kind": "agentTurn",
    "message": "【简报生成任务】\n\n你是一个每日简报生成机器人。请依次执行:\n\n1. 调用 weather skill 查询当前天气\n2. 读取 Discord 频道 1465212107313123491 最近 20 条消息\n3. 使用 tavily_search 搜索今日热点新闻(最多 3 条)\n4. 检查 cron 任务列表状态\n\n整合以上信息,按以下格式输出(不留空白,无内容写""):\n\n📅 今日概览\n🌤️ 天气预报\n📡 重要动态\n⚠️ 需要关注\n\n如果某项信息获取失败,直接跳过继续执行,不要报错。",
    "timeoutSeconds": 300
  },
  "sessionTarget": "isolated",
  "delivery": {
    "mode": "announce",
    "channel": "discord"
  },
  "enabled": true
}

进阶版本(多渠道 + 失败告警)

{
  "name": "daily-briefing-pro",
  "schedule": {
    "kind": "cron",
    "expr": "0 9 * * 1-5",
    "tz": "Asia/Shanghai"
  },
  "payload": {
    "kind": "agentTurn",
    "message": "【工作日简报】\n\n请按以下步骤执行:\n1. weather skill\n2. Discord 频道消息\n3. tavily_search 今日热点(AI/科技)\n4. cron 任务状态检查\n\n格式输出:\n📅 今日概览\n🌤️ 天气\n📌 待办\n📡 动态\n⚠️ 告警(如有)",
    "timeoutSeconds": 300,
    "lightContext": true
  },
  "sessionTarget": "isolated",
  "delivery": {
    "mode": "announce",
    "channel": "discord",
    "to": "qqbot:c2c:C3F5C95D61D94E3F3764F08E3A23838B"
  },
  "failureAlert": {
    "after": 2,
    "mode": "announce",
    "channel": "discord",
    "cooldownMs": 3600000
  },
  "enabled": true
}

这个版本的变化:

  • 工作日触发expr: "0 9 * * 1-5" 表示周一到周五 9 点执行
  • lightContext:轻量上下文,不带完整历史,减少 token 消耗
  • 私聊同步:推送到 QQ 私聊,同时在 Discord 频道公告
  • 失败告警:连续失败 2 次才触发告警,冷却 1 小时

第四步:手动触发测试

配置好之后,不要直接等第二天。先手动触发一次看效果:

cron run <jobId>

查看执行结果:

cron runs <jobId>

如果输出不符合预期,调整 prompt 中的描述或格式要求,重新 run 调试,直到满意为止。


进阶扩展

周末 vs 工作日不同模板

用两个 cron 任务,分别配置不同的 prompt:

// 工作日早报 - 09:00
{ "schedule": { "expr": "0 9 * * 1-5" }, "payload": { "message": "工作日版本 prompt..." } }

// 周末文摘 - 10:00
{ "schedule": { "expr": "0 10 * * 0,6" }, "payload": { "message": "周末版本 prompt..." } }

异常事件立即告警

除了每日定时简报,还可以配置一个"异常监控"任务,当检测到服务器错误、cron 任务失败等关键事件时,立即触发告警,而不等下一次定时简报:

{
  "name": "server-alert",
  "schedule": { "kind": "every", "everyMs": 300000 },
  "payload": {
    "kind": "agentTurn",
    "message": "检查以下事项:1) cron 任务列表有无 error 状态 2) Minecraft 服务器是否在线 3) 磁盘空间是否低于 20%。如有异常立即输出。"
  },
  "sessionTarget": "isolated",
  "delivery": { "mode": "announce", "channel": "discord" }
}

每 5 分钟检查一次,有问题立刻推送。

多语言支持

如果简报需要发给不同语言的成员,可以让 AI 生成双语版本:

输出分两部分:第一部分中文,第二部分 English version。

原理补充:cron 表达式详解

表达式含义
0 9 * * *每天 9:00
0 9 * * 1-5工作日 9:00
0 9 * * 0,6周末 9:00
0 */2 * * *每 2 小时
0 9,18 * * *每天 9:00 和 18:00
30 8 * * 1每周一 8:30

格式是:分 时 日 月 周


维护建议

  1. 每月检查一次 prompt:信息来源和格式需求可能变化,季度性地审视简报内容是否还符合需要
  2. 关注 Token 消耗:每次 agentTurn 消耗 Token,建议设置 timeoutSeconds 防止卡死
  3. 失败告警要设冷却时间:避免同一个问题反复告警
  4. 测试时用 run 命令:不要改完配置就等第二天,调试阶段多手动触发几次

总结

定时简报 pipeline 的本质,是把"定时 + 采集 + 生成 + 推送"四个能力串联起来。OpenClaw 的 cron 系统提供了定时触发和结果推送,AI 自身提供了采集和生成能力,整个 pipeline 不需要任何外部服务,一行命令就能配置完成。