用 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 期 | 源码解析 | 待发布 |
觉得有用?点赞 👍 收藏 ⭐ 关注 ➕ 三连支持一下!