Day 5 / 7

第5天:自动化工作流

让OpenClaw成为24小时在线的数字员工

📖 阅读时间:约20分钟🎯 难度:中级
学习进度5/7

📚 今天你将学到

  • 为什么从"每日简报"开始学自动化
  • 定时任务的原理和配置方法
  • 实战:打造你的专属工作简报
  • 多数据源整合和格式化技巧
  • 调试和优化定时任务
  • 更多自动化场景的思路

前四天,我们搭建了OpenClaw,给它写了身份文件,接入了Notion。但它还是"被动"的——你问它才答,你让它做才做。

今天,我们要让它"主动"起来。每天早上自动给你发工作简报,不用你催,不用你问。这才是真正的AI助手。

为什么从"每日简报"开始?

自动化工作流有很多种:定时任务、事件触发、条件监控、工作流编排...为什么我们选择从"每日简报"这个最简单的场景开始?

三个重要原因

1. 快速见效,建立信心

定时任务是最容易理解、最快能看到效果的自动化方式。今天学完,明天早上就能收到AI发的简报。这种即时反馈能极大增强学习动力。

2. 打好基础,循序渐进

定时任务是所有自动化的基础。掌握了它,后面学事件触发、工作流编排才不会懵。就像学编程要先学变量和循环,不能上来就学设计模式。

3. 实用性强,每天都用

每日简报不是玩具,是真正能提升效率的工具。每天早上自动汇总今日任务、本周进度,比你手动打开Notion查看要快得多。

💡 学习策略:基础课程的目标是"能用",不是"精通"。我们先把最常用的80%学会,剩下20%的高级技巧(事件驱动、状态管理、复杂编排)留到高级课程。这样你能快速上手,也为后续学习留下空间。

每日简报能做什么?

场景:内容创作者的早晨

每天早上9点,你还在刷牙,OpenClaw已经把今天的工作安排发到飞书了:

📋 今日工作简报(2026-03-07)

今日待办(3项)

  • • 完成Day5教程编写(截止18:00)
  • • 审核设计稿
  • • 社群答疑

本周选题进度

  • • 已完成:2篇
  • • 进行中:1篇(OpenClaw系列)
  • • 待开始:3篇

昨日完成

  • • Day4教程 ✅
  • • PPT模板优化 ✅

看到了吗?你还没开始工作,就已经知道今天要做什么、本周进度如何、昨天完成了什么。这就是自动化的价值。

定时任务的原理

在讲具体实现之前,我们先理解定时任务是怎么工作的。

两种实现方式

方式原理优点缺点
系统Cron操作系统的定时任务服务稳定、可靠、系统级配置稍复杂
OpenClaw HooksOpenClaw内置的钩子系统简单、集成度高依赖OpenClaw运行

我们选择系统Cron,因为:

  • • 更稳定,不依赖OpenClaw是否在线
  • • 更灵活,可以执行任何脚本
  • • 更通用,学会了可以用在其他场景

Cron表达式速成

Cron用5个字段表示时间:

分钟 小时 日期 月份 星期
 *   *   *   *   *
 |   |   |   |   |
 |   |   |   |   +---- 星期几 (0-7, 0和7都是周日)
 |   |   |   +-------- 月份 (1-12)
 |   |   +------------ 日期 (1-31)
 |   +---------------- 小时 (0-23)
 +-------------------- 分钟 (0-59)

常用示例

0 9 * * *每天早上9点
0 9 * * 1每周一早上9点
0 9,18 * * *每天9点和18点
*/30 * * * *每30分钟
0 0 1 * *每月1号零点

💡 记忆技巧:从小到大记:分、时、日、月、周。想象一个时钟,从最小的刻度(分钟)到最大的周期(星期)。

实战:打造每日工作简报

接下来我们用45分钟,从零实现一个完整的每日简报系统。

步骤1:编写简报脚本(25分钟)

在OpenClaw工作区创建 scripts/daily_report.py

#!/usr/bin/env python3
"""
每日工作简报生成器
每天早上自动汇总今日任务、本周进度、昨日完成情况
"""
import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'tools'))

from notion import query_database
from feishu import send
from datetime import datetime, timedelta
import json

def get_today_tasks():
    """获取今日待办任务"""
    result = query_database(
        "任务看板",
        filter_type="date",
        filter_value="今天"
    )
    return result.get("results", [])

def get_week_topics():
    """获取本周选题进度"""
    result = query_database(
        "选题库",
        filter_type="date",
        filter_value="本周"
    )
    topics = result.get("results", [])
    
    # 统计各状态数量
    completed = len([t for t in topics if "已完成" in t.get("tags", [])])
    in_progress = len([t for t in topics if "进行中" in t.get("tags", [])])
    todo = len([t for t in topics if "待开始" in t.get("tags", [])])
    
    return {
        "completed": completed,
        "in_progress": in_progress,
        "todo": todo,
        "total": len(topics)
    }

def get_yesterday_done():
    """获取昨日完成的任务"""
    result = query_database(
        "任务看板",
        filter_type="date",
        filter_value="昨天"
    )
    return [t for t in result.get("results", []) if "已完成" in t.get("tags", [])]

def format_report(tasks, topics, done):
    """格式化简报内容"""
    today = datetime.now().strftime("%Y-%m-%d")
    
    report = f"""📋 今日工作简报({today})

【今日待办】共 {len(tasks)} 项
"""
    
    for i, task in enumerate(tasks[:5], 1):  # 最多显示5项
        report += f"{i}. {task['title']}
"
    
    if len(tasks) > 5:
        report += f"...还有 {len(tasks) - 5} 项
"
    
    report += f"""
【本周选题进度】
• 已完成:{topics['completed']} 篇
• 进行中:{topics['in_progress']} 篇
• 待开始:{topics['todo']} 篇
"""
    
    if done:
        report += "
【昨日完成】
"
        for task in done[:3]:  # 最多显示3项
            report += f"• {task['title']} ✅
"
    
    return report

def main():
    """主函数"""
    print("开始生成每日简报...")
    
    # 获取数据
    tasks = get_today_tasks()
    topics = get_week_topics()
    done = get_yesterday_done()
    
    # 格式化简报
    report = format_report(tasks, topics, done)
    
    # 发送到飞书
    target_id = os.getenv("MY_FEISHU_ID")  # 你的飞书open_id
    result = send(target_id, report)
    
    if result.get("code") == 0:
        print("简报发送成功!")
    else:
        print(f"发送失败:{result}")

if __name__ == "__main__":
    main()

💡 代码解读

  • 模块化设计:每个功能独立成函数,方便测试和维护
  • 数据聚合:从多个Notion数据库获取数据,统一处理
  • 格式化输出:将数据转换成易读的文本格式
  • 错误处理:检查发送结果,记录日志

步骤2:配置环境变量(3分钟)

编辑 ~/.zshrc,添加你的飞书ID:

export MY_FEISHU_ID="ou_xxxxxxxxxxxxx"

如何获取你的飞书open_id?在飞书中给OpenClaw发消息,查看日志即可看到。

步骤3:手动测试(5分钟)

先手动运行一次,确保脚本正常工作:

cd ~/openclaw-workspace
python3 scripts/daily_report.py

如果一切正常,你会在飞书收到简报消息。

步骤4:配置定时任务(10分钟)

编辑crontab配置:

# 打开crontab编辑器
crontab -e

# 添加以下内容(每天早上9点执行)
0 9 * * * cd ~/openclaw-workspace && /usr/local/bin/python3 scripts/daily_report.py >> logs/daily_report.log 2>&1

⚠️ 注意事项

  • 使用绝对路径:cron环境变量和终端不同,必须用绝对路径
  • 重定向日志:>> logs/daily_report.log 2>&1 保存输出,方便调试
  • 环境变量:确保cron能访问到NOTION_TOKEN等环境变量

步骤5:验证和调试(2分钟)

查看crontab是否生效:

# 查看当前的定时任务
crontab -l

# 查看cron日志(Mac)
tail -f /var/log/system.log | grep cron

# 查看脚本输出日志
tail -f ~/openclaw-workspace/logs/daily_report.log

优化和扩展

技巧1:智能时间选择

不同人的工作习惯不同,可以根据自己的作息调整时间:

早起型(7:00)

0 7 * * *

适合早上6点起床的人,7点收到简报正好开始工作

标准型(9:00)

0 9 * * *

适合大多数人,9点上班前收到简报

夜猫子型(22:00)

0 22 * * *

晚上10点收到明日简报,提前规划

技巧2:周末跳过

周末不想收到工作简报?修改cron表达式:

# 只在工作日(周一到周五)执行
0 9 * * 1-5 cd ~/openclaw-workspace && python3 scripts/daily_report.py

技巧3:多时段简报

可以设置多个时间点,比如早上发今日计划,晚上发完成总结:

# 早上9点:今日计划
0 9 * * * cd ~/openclaw-workspace && python3 scripts/morning_report.py

# 晚上18点:今日总结
0 18 * * * cd ~/openclaw-workspace && python3 scripts/evening_summary.py

技巧4:添加数据可视化

可以用简单的字符画增强可读性:

def format_progress_bar(completed, total):
    """生成进度条"""
    if total == 0:
        return "━━━━━━━━━━ 0%"
    
    percentage = int((completed / total) * 100)
    filled = int(percentage / 10)
    bar = "█" * filled + "░" * (10 - filled)
    
    return f"{bar} {percentage}%"

# 使用示例
progress = format_progress_bar(3, 10)
# 输出:███░░░░░░░ 30%

更多自动化场景

掌握了定时任务,你可以实现更多自动化场景:

每周数据汇总

每周五下午自动生成本周工作报告

0 17 * * 5

定时备份

每天凌晨2点备份Notion数据

0 2 * * *

截止日期提醒

每天检查即将到期的任务

0 10,15 * * *

月度复盘

每月最后一天生成月度报告

0 20 28-31 * *

🚀 进阶方向(高级课程预告)

今天我们学的是"定时触发",这只是自动化的第一步。在高级课程中,你会学到:

  • 事件驱动:Notion状态变化时自动触发(不用定时检查)
  • 条件编排:根据不同条件执行不同的工作流
  • 状态管理:记住处理过的数据,避免重复执行
  • 错误重试:失败时自动重试,保证任务完成
  • 并行执行:同时执行多个任务,提升效率

本章一句话Q&A

定时任务没有执行怎么办?

排查步骤:

  1. 1. 检查crontab是否正确配置(crontab -l
  2. 2. 查看日志文件,看是否有错误信息
  3. 3. 确认脚本路径是绝对路径
  4. 4. 检查环境变量是否在cron环境中可用
Mac睡眠后定时任务会执行吗?

不会。Mac睡眠时cron不会执行。解决方案:

  • • 使用caffeinate命令保持Mac不睡眠
  • • 或者在系统偏好设置中关闭自动睡眠
  • • 或者使用云服务器运行定时任务
可以用Python的schedule库代替cron吗?

可以,但不推荐。schedule需要一个常驻进程,而cron是系统级服务,更稳定。如果你的脚本需要复杂的调度逻辑,可以考虑schedule。

如何测试cron表达式是否正确?

使用在线工具:https://crontab.guru,输入表达式就能看到执行时间。

💡 本章要点回顾

  • • 从简单场景开始,快速见效建立信心
  • • 定时任务是所有自动化的基础
  • • Cron表达式:分、时、日、月、周
  • • 使用绝对路径和日志重定向
  • • 先手动测试,再配置定时任务

📅 下一章预告

Day 6:记忆系统

让OpenClaw记住你的习惯、偏好、常用数据。AI会越用越懂你,真正成为你的专属助手。

遇到问题?

加入云途AGI社群,获取配套学习资源、群内答疑,与同学们一起交流进步

了解社群详情