用 OpenClaw 搭建 AI 定时任务系统

3 阅读6分钟

用 OpenClaw 搭建 AI 定时任务系统

系列文章: 《OpenClaw 从入门到精通》第 5 期
难度等级: ⭐⭐⭐
预计耗时: 30 分钟


🎯 本文目标

学会用 OpenClaw 创建和管理定时任务:

  • ✅ 一次性提醒
  • ✅ 周期性任务
  • ✅ 条件触发任务
  • ✅ 任务降级确保送达

📚 核心概念

什么是定时任务?

定时任务 = 在指定时间自动执行的操作

应用场景:

  • ⏰ 早上 9 点提醒写博客
  • 📅 每周一发送周报
  • 🎂 生日提醒
  • 📊 每天定时抓取数据

🔧 基础用法

1. 一次性提醒

# 简单提醒
openclaw "20 分钟后提醒我休息"

# 指定时间
openclaw "今天晚上 8 点提醒我写文章"

# 带内容
openclaw "明天上午 10 点提醒我开会,主题是项目评审"

2. 周期性任务

# 每天
openclaw "每天早上 9 点提醒我写博客"

# 每周
openclaw "每周一上午 10 点发送周报"

# 每月
openclaw "每月 1 号备份重要文件"

3. 条件触发

# 收到邮件时
openclaw "收到重要邮件时提醒我"

# 文件变化时
openclaw "当项目文件更新时通知团队"

# 价格变动时
openclaw "当股票价格超过 100 元时提醒"

💻 实战案例

案例 1:每日写作提醒

需求: 每天早上 9 点提醒写作

openclaw "
创建一个定时任务:
- 时间:每天早上 9:00
- 内容:提醒我写 CSDN 文章
- 渠道:飞书消息
- 降级:如果飞书失败,发邮件
"

配置代码:

from openclaw import CronTask

task = CronTask(
    name="daily_writing",
    schedule="0 9 * * *",  # 每天 9 点
    action="send_message",
    params={
        "channel": "feishu",
        "message": "⏰ 写作时间到!今天计划写什么?"
    },
    fallback=["email"]  # 降级方案
)

task.save()

案例 2:周报自动发送

需求: 每周一上午 10 点发送周报

openclaw "
创建周报任务:
- 时间:每周一 10:00
- 内容:收集本周工作,生成周报
- 发送:飞书群
- 截止:周一 12 点前
"

实现逻辑:

weekly_report = CronTask(
    name="weekly_report",
    schedule="0 10 * * 1",  # 周一 10 点
    action="generate_and_send",
    steps=[
        "collect_work_items",
        "generate_summary",
        "send_to_group"
    ],
    params={
        "group_id": "weekly_standup",
        "deadline": "12:00"
    }
)

案例 3:数据定时抓取

需求: 每小时抓取竞品数据

openclaw "
创建数据抓取任务:
- 频率:每小时整点
- 目标:竞品网站
- 存储:数据库
- 异常:失败时重试 3 次
"

配置:

data_crawler = CronTask(
    name="competitor_data",
    schedule="0 * * * *",  # 每小时
    action="crawl_and_save",
    params={
        "urls": ["competitor1.com", "competitor2.com"],
        "save_to": "database",
        "retry": 3
    },
    timeout=300  # 5 分钟超时
)

案例 4:生日提醒

需求: 家人朋友生日提前提醒

openclaw "
创建生日提醒:
- 数据:从通讯录读取
- 提前:提前 1 天提醒
- 方式:微信消息
- 内容:生日祝福 + 礼物建议
"

实现:

birthday_reminder = CronTask(
    name="birthday_alert",
    schedule="0 9 * * *",  # 每天 9 点检查
    action="check_and_remind",
    params={
        "source": "contacts",
        "advance_days": 1,
        "channel": "wechat"
    }
)

🎓 高级功能

1. 任务降级确保送达

问题: 主要渠道失败怎么办?

解决方案: 多级降级

task = CronTask(
    name="important_alert",
    schedule="0 14 * * *",
    action="send_alert",
    delivery_channels=[
        "feishu",      # 第 1 选择
        "wechat",      # 第 2 选择
        "sms",         # 第 3 选择
        "phone_call"   # 最后手段
    ],
    ensure_delivery=True  # 确保送达
)

降级逻辑:

飞书成功 → 结束
   ↓ 失败
微信 → 成功 → 结束
   ↓ 失败
短信 → 成功 → 结束
   ↓ 失败
电话呼叫

2. 任务依赖

场景: 任务 B 需要在任务 A 完成后执行

# 任务 A:收集数据
task_a = CronTask(
    name="collect_data",
    schedule="0 9 * * *",
    action="collect"
)

# 任务 B:生成报告(依赖 A)
task_b = CronTask(
    name="generate_report",
    schedule="0 10 * * *",
    action="report",
    depends_on=["collect_data"]  # 依赖
)

3. 条件触发

场景: 满足条件时才执行

smart_task = CronTask(
    name="smart_alert",
    schedule="0 * * * *",  # 每小时检查
    action="send_if_needed",
    conditions=[
        "has_unread_email",
        "calendar_event_soon",
        "stock_price_changed"
    ],
    logic="ANY"  # 任一条件满足即执行
)

4. 任务分组

场景: 管理大量任务

# 创建任务组
writing_group = TaskGroup("writing_tasks")
writing_group.add(daily_writing)
writing_group.add(weekly_article)
writing_group.add(monthly_summary)

# 批量操作
writing_group.enable()   # 启用所有
writing_group.disable()  # 暂停所有
writing_group.status()   # 查看状态

📊 任务管理

1. 查看任务列表

# 所有任务
openclaw "显示所有定时任务"

# 运行中的任务
openclaw "显示正在运行的任务"

# 今天任务
openclaw "显示今天的任务"

输出示例:

┌────┬──────────────┬─────────────┬────────┬────────┐
│ ID │ 任务名称     │ 执行时间    │ 状态   │ 下次   │
├────┼──────────────┼─────────────┼────────┼────────┤
│ 1  │ 每日写作     │ 每天 09:00  │ ✅     │ 明天   │
│ 2  │ 周报发送     │ 周一 10:00  │ ✅     │ 下周一 │
│ 3  │ 数据备份     │ 每天 23:00  │ ⚠️     │ 今天   │
└────┴──────────────┴─────────────┴────────┴────────┘

2. 修改任务

# 暂停任务
openclaw "暂停每日写作提醒"

# 恢复任务
openclaw "恢复每日写作提醒"

# 修改时间
openclaw "把写作提醒改成早上 8 点"

# 删除任务
openclaw "删除这个临时任务"

API 操作:

# 暂停
task.pause()

# 恢复
task.resume()

# 修改
task.update(schedule="0 8 * * *")

# 删除
task.delete()

3. 查看执行历史

# 最近执行
openclaw "显示最近 10 次执行记录"

# 失败记录
openclaw "显示失败的任务"

# 统计数据
openclaw "显示任务执行统计"

历史记录:

任务:每日写作提醒
┌──────┬─────────────┬────────┬──────────┐
│ 日期 │ 执行时间    │ 状态   │ 耗时     │
├──────┼─────────────┼────────┼──────────┤
│ 3/20 │ 09:00:01    │ ✅     │ 0.5s     │
│ 3/19 │ 09:00:02    │ ✅     │ 0.4s     │
│ 3/18 │ 09:00:01    │ ❌     │ 超时     │
└──────┴─────────────┴────────┴──────────┘

🔍 调试技巧

1. 测试任务

# 立即执行
openclaw "立即运行每日写作任务"

# 模拟执行
openclaw "模拟运行周报任务(不实际发送)"

测试代码:

# 立即执行
task.run_now()

# 干运行(不实际执行)
task.dry_run()

# 测试条件
task.test_conditions()

2. 日志查看

# 实时日志
openclaw "显示任务执行日志"

# 错误日志
openclaw "显示错误日志"

# 详细日志
openclaw "开启详细日志模式"

日志级别:

# 设置日志级别
task.set_log_level("DEBUG")  # 详细
task.set_log_level("INFO")   # 标准
task.set_log_level("ERROR")  # 仅错误

⚠️ 注意事项

1. 时区问题

# 明确指定时区
task = CronTask(
    name="daily_task",
    schedule="0 9 * * *",
    timezone="Asia/Shanghai"  # 重要!
)

2. 资源限制

# 设置超时
task.timeout = 300  # 5 分钟

# 设置重试
task.max_retries = 3

# 设置并发
task.max_concurrent = 5

3. 错误处理

task.on_error("send_alert")  # 出错时通知
task.on_failure("rollback")  # 失败时回滚
task.on_timeout("kill")      # 超时时终止

📈 最佳实践

1. 任务命名规范

# 好的命名
"daily_writing_reminder"
"weekly_report_generator"
"hourly_data_backup"

# 避免的命名
"task1"
"test"
"temp"

2. 时间选择

  • ✅ 避开高峰期(如 9:00-9:30)
  • ✅ 考虑用户作息
  • ✅ 预留缓冲时间

3. 监控告警

# 设置监控
task.monitor(
    success_rate=0.95,  # 成功率低于 95% 告警
    avg_duration=60,    # 平均耗时超过 60 秒告警
    failure_count=3     # 连续失败 3 次告警
)

📚 本系列预告

期数主题状态
第 5 期AI 定时任务系统✅ 已完成
第 6 期OpenClaw + Feishu下一篇
第 7 期源码解析待发布

觉得有用?点赞 👍 收藏 ⭐ 关注 ➕ 三连支持一下!