前六节你学会了写 Skill、操控浏览器、登录态管理、Angular 操控、云端部署、完整实战。但每次都要手动说一句"开始跑"——这不叫自动化,这叫半自动。这一节解决最后一个问题:让脚本自己按时跑。
1. 为什么需要定时任务
回顾一下 OUCN 自动化的日常:
每天早上 8:40
↓
打开电脑 → 启动调试 Edge → 运行脚本 → 等结果
问题是:周末不在电脑前、出差忘了跑、偶尔起晚了。一个月下来,漏跑 6-8 天。
WorkBuddy 的自动化任务系统解决了这个问题——你不需要在场。设定好时间,它自己跑。
2. WorkBuddy 自动化任务架构
┌──────────────────────────────────────┐
│ automation_update 工具 │
│ (创建/查看/更新/删除定时任务) │
└──────────┬───────────────────────────┘
↓
┌──────────────────────────────────────┐
│ SQLite: ~/.workbuddy/workbuddy.db │
│ ├ automations 表 (任务定义) │
│ ├ automation_runtime_state 表 (状态) │
│ └ automation_runs 表 (执行历史) │
└──────────┬───────────────────────────┘
↓
┌──────────────────────────────────────┐
│ 调度引擎 (内置) │
│ 到点了 → 加载 prompt → 启动 AI 执行 │
└──────────────────────────────────────┘
三张表各司其职:automations 存"做什么、什么时候做",runtime_state 存"上次什么时候跑的、下次什么时候跑",runs 存"每次执行的记录"。
3. 两种调度模式
3.1 周期任务(recurring)
最常用的模式。每天/每周/每小时重复执行。
"帮我创建一个每天 8:40 运行的自动化任务"
↓
scheduleType = "recurring"
rrule = "FREQ=DAILY;BYHOUR=8;BYMINUTE=40"
3.2 一次性任务(once)
指定时间执行一次,适合提醒和定时发布。
"明天下午 3 点提醒我开会"
↓
scheduleType = "once"
scheduledAt = "2026-07-07T15:00"
一次性任务执行后自动完成,不需要手动清理。
4. RRULE 速查表
RRULE 是 RFC 5545 标准的日程规则,WorkBuddy 支持五种频率:
| 频率 | RRULE | 含义 |
|---|---|---|
| 每小时 | FREQ=HOURLY | 每小时执行一次 |
| 每天 | FREQ=DAILY;BYHOUR=8;BYMINUTE=40 | 每天 8:40 |
| 每天 | FREQ=DAILY;INTERVAL=2 | 每隔一天 |
| 每周 | FREQ=WEEKLY;BYDAY=MO,WE,FR | 周一三五 |
| 每月 | FREQ=MONTHLY;BYMONTHDAY=1 | 每月 1 号 |
| 每年 | FREQ=YEARLY | 每年一次 |
关键字段速览:
| 字段 | 说明 | 示例 |
|---|---|---|
FREQ | 频率 | DAILY / WEEKLY / MONTHLY |
BYHOUR | 小时(24h) | 8 表示早上 8 点 |
BYMINUTE | 分钟 | 40 |
BYDAY | 星期 | MO, TU, WE, TH, FR, SA, SU |
INTERVAL | 间隔 | 2 = 每隔一个周期 |
BYMONTHDAY | 月内日期 | 1-31 |
5. 实战:创建 OUCN 每日自动化
这是实际在用的任务定义:
你说:"帮我创建一个每天 8:40 运行的自动化任务,
执行 OUCN 自动化脚本,工作目录指向 D:\ouchn_auto"
WorkBuddy 自动创建:
| 参数 | 值 |
|---|---|
| name | OUCN 每日自动化 |
| scheduleType | recurring |
| rrule | FREQ=DAILY;BYHOUR=8;BYMINUTE=40 |
| prompt | 运行 OUCN 自动化脚本。先确保调试浏览器已启动(端口 9222),然后执行 venv\Scripts\python.exe main.py。如遇 Cookie 失效,提示用户手动登录。完成后报告浏览页数和批改份数。 |
| cwds | D:\ouchn_auto |
| status | ACTIVE |
prompt 写作要点
自动化任务的 prompt 就是给 AI 的指令,要自包含——因为执行时你可能不在场。
# 好的 prompt
运行 OUCN 自动化脚本。
1. 检查端口 9222 是否有调试浏览器,没有则启动 start_edge_debug.bat
2. 执行 venv\Scripts\python.exe main.py
3. 如遇 Cookie 失效,输出"请在浏览器中手动登录"并等待
4. 完成后报告:浏览页数、批改份数、论坛回复数
# 坏的 prompt
跑一下那个脚本 ← AI 不知道是哪个脚本
6. 有效期控制
不是所有任务都要永久运行。用 validFrom 和 validUntil 设定窗口:
场景:暑假期间暂停,9 月 1 日恢复
validFrom = "2026-09-01"
validUntil = "2026-12-31" (学期结束)
| 场景 | validFrom | validUntil |
|---|---|---|
| 常年运行 | 不设 | 不设 |
| 学期内 | 2026-09-01 | 2026-12-31 |
| 仅工作日 | 不设 | 不设(用 BYDAY=MO,TU,WE,TH,FR) |
| 项目期 | 2026-07-01 | 2026-10-31 |
设了 validUntil 的任务到期后自动停止,不会继续触发。
7. 多任务编排
实际场景中你可能有多个自动化任务并行:
任务 A:每天 8:40 — OUCN 课程自动化
任务 B:每天 9:00 — AI 资讯日报推送
任务 C:每周一 10:00 — 周报汇总
工作目录隔离
每个任务指定各自的 cwds,互不干扰:
任务 A → cwds = "D:\ouchn_auto"
任务 B → cwds = "D:\ai_daily"
任务 C → cwds = "D:\weekly_report"
避免时间冲突
如果两个任务操作同一个浏览器(共用 9222 端口),错开 20 分钟以上:
任务 A:8:40 — OUCN(约 15 分钟)
任务 B:9:05 — 掘金发布(等 A 跑完)
踩坑:两个任务同时连 9222,第二个会抢走第一个的标签页,导致前者报 Target closed。
8. 任务管理操作
查看所有任务
"列出我所有的自动化任务"
→ automation_update(mode="list")
返回摘要列表:名称、调度类型、状态、下次执行时间。
查看单个任务详情
"看看 OUCN 自动化任务的配置"
→ automation_update(mode="view", id="automation-5")
暂停 / 恢复
"暂停 OUCN 自动化任务"
→ automation_update(mode="update", id="automation-5", status="PAUSED")
"恢复 OUCN 自动化任务"
→ automation_update(mode="update", id="automation-5", status="ACTIVE")
暂停不会丢失配置,恢复后从下一个调度点继续。
删除任务
"删除 OUCN 自动化任务"
→ automation_update(mode="delete", id="automation-5")
删除是软删除——记录隐藏但保留在数据库中,支持恢复。
⚠️ 永远不要用
rm或sqlite3直接操作数据库文件。必须通过automation_update工具。
9. 四个真实踩坑
坑 1 — 时区陷阱
RRULE 里 BYHOUR=8 是本地时间还是 UTC?
答案:本地时间。WorkBuddy 使用系统时区。但如果你在云服务器上部署,服务器可能是 UTC 时区——8 点变成了北京时间 16 点。
解决:服务器上设 BYHOUR=0(UTC 0 点 = 北京 8 点),或者修改服务器时区。
坑 2 — 任务不触发
创建后等了一天没执行。排查清单:
| 检查项 | 命令 |
|---|---|
| 状态是否 ACTIVE | automation_update(mode="view") 看 status |
| 是否在有效期内 | 看 validFrom / validUntil |
| WorkBuddy 是否运行 | 任务管理器看进程 |
| prompt 是否为空 | 空 prompt 会被跳过 |
最常见的:创建时忘了设
status="ACTIVE",默认可能是 PAUSED。
坑 3 — 并发冲突
两个任务同时跑,都连 9222 端口。第二个任务 connect_over_cdp 后,第一个任务的 page 对象失效。
解决:时间错开 20 分钟。或者用不同端口(9222 / 9223),各启动一个调试浏览器实例。
坑 4 — prompt 过于简略
# 这个 prompt 会导致执行失败
prompt = "跑脚本"
# AI 不知道跑哪个脚本、在哪个目录、怎么跑
# 结果:AI 随便找了个 .py 文件执行,报错
解决:prompt 里写清楚脚本路径、启动命令、失败处理、预期输出。假设你不在场,AI 能不能独立完成?
10. 执行历史与调试
每次任务执行后,记录写入 automation_runs 表。查看方式:
"OUCN 自动化任务最近的执行记录怎样?"
AI 会读取数据库并汇总:
最近 7 次执行:
07-06 08:40 ✅ 浏览 96 页,批改 62 份
07-05 08:40 ✅ 浏览 93 页,批改 58 份
07-04 08:40 ❌ Cookie 失效,等待登录超时
07-03 08:40 ✅ 浏览 96 页,批改 61 份
...
如果某次失败,看执行记录里的错误信息,针对性修复后更新 prompt。
11. 最佳实践清单
| 实践 | 说明 |
|---|---|
| prompt 自包含 | 写清路径、命令、失败处理,假设你不在场 |
| 错开时间 | 多任务间隔 20 分钟以上 |
| 设有效期 | 有截止日期的任务设 validUntil |
| 定期检查 | 每周看一次执行记录,发现静默失败 |
| prompt 里写失败兜底 | "如遇 XX 错误,输出提示并退出" |
| 工作目录隔离 | 每个任务指定独立 cwds |
| 先手动测再自动化 | 脚本稳定后再设定时任务 |
小结
| 学会的 | 要点 |
|---|---|
| 两种调度模式 | recurring(周期)+ once(一次性) |
| RRULE 规则 | FREQ + BYHOUR + BYDAY + INTERVAL |
| 有效期控制 | validFrom / validUntil |
| 多任务编排 | 错开时间、隔离目录、避免端口冲突 |
| 任务管理 | list / view / update / delete |
| 踩坑预防 | 时区、并发、prompt 详略、状态检查 |
下一篇预告
第 8 节:错误处理与运维监控——异常重试策略、日志体系设计、失败自动通知、健康检查与自愈。让脚本永不静默失败。全系列完结篇。
📺 系列文章:
- 第1节:WorkBuddy Skill 入门
- 第2节:CDP 浏览器操控原理
- 第3节:云端共享与多终端部署
- 第4节:WorkBuddy 自动化实战
- 第5节:登录态持久化
- 第6节:Angular 页面自动化进阶
- 第7节:定时任务与自动化调度(本文)
- 第8节:错误处理与运维监控(待发布)
本文首发于稀土掘金。欢迎关注后续连载。