定时任务与自动化调度:让 Skill 每天自己跑起来

8 阅读8分钟

前六节你学会了写 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 自动创建:
参数
nameOUCN 每日自动化
scheduleTyperecurring
rruleFREQ=DAILY;BYHOUR=8;BYMINUTE=40
prompt运行 OUCN 自动化脚本。先确保调试浏览器已启动(端口 9222),然后执行 venv\Scripts\python.exe main.py。如遇 Cookie 失效,提示用户手动登录。完成后报告浏览页数和批改份数。
cwdsD:\ouchn_auto
statusACTIVE

prompt 写作要点

自动化任务的 prompt 就是给 AI 的指令,要自包含——因为执行时你可能不在场。

# 好的 prompt
运行 OUCN 自动化脚本。
1. 检查端口 9222 是否有调试浏览器,没有则启动 start_edge_debug.bat
2. 执行 venv\Scripts\python.exe main.py
3. 如遇 Cookie 失效,输出"请在浏览器中手动登录"并等待
4. 完成后报告:浏览页数、批改份数、论坛回复数

# 坏的 prompt
跑一下那个脚本   ← AI 不知道是哪个脚本

6. 有效期控制

不是所有任务都要永久运行。用 validFromvalidUntil 设定窗口:

场景:暑假期间暂停,9 月 1 日恢复

validFrom = "2026-09-01"
validUntil = "2026-12-31"   (学期结束)
场景validFromvalidUntil
常年运行不设不设
学期内2026-09-012026-12-31
仅工作日不设不设(用 BYDAY=MO,TU,WE,TH,FR)
项目期2026-07-012026-10-31

设了 validUntil 的任务到期后自动停止,不会继续触发。


7. 多任务编排

实际场景中你可能有多个自动化任务并行:

任务 A:每天 8:40OUCN 课程自动化
任务 B:每天 9:00AI 资讯日报推送
任务 C:每周一 10:00 — 周报汇总

工作目录隔离

每个任务指定各自的 cwds,互不干扰:

任务 A → cwds = "D:\ouchn_auto"
任务 B → cwds = "D:\ai_daily"
任务 C → cwds = "D:\weekly_report"

避免时间冲突

如果两个任务操作同一个浏览器(共用 9222 端口),错开 20 分钟以上

任务 A8:40OUCN(约 15 分钟)
任务 B9: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")

删除是软删除——记录隐藏但保留在数据库中,支持恢复。

⚠️ 永远不要用 rmsqlite3 直接操作数据库文件。必须通过 automation_update 工具。


9. 四个真实踩坑

坑 1 — 时区陷阱

RRULE 里 BYHOUR=8本地时间还是 UTC?

答案:本地时间。WorkBuddy 使用系统时区。但如果你在云服务器上部署,服务器可能是 UTC 时区——8 点变成了北京时间 16 点。

解决:服务器上设 BYHOUR=0(UTC 0 点 = 北京 8 点),或者修改服务器时区。

坑 2 — 任务不触发

创建后等了一天没执行。排查清单:

检查项命令
状态是否 ACTIVEautomation_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 页,批改 6207-05 08:40 ✅ 浏览 93 页,批改 5807-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 节:错误处理与运维监控——异常重试策略、日志体系设计、失败自动通知、健康检查与自愈。让脚本永不静默失败。全系列完结篇。


📺 系列文章:

本文首发于稀土掘金。欢迎关注后续连载。