Install
openclaw skills install @eddie4xioshi-netizen/minutes-task当用户需要"每 N 分钟"(如每10分钟、每5分钟)定时执行任务时使用。WorkBuddy 内置调度器仅支持 DAILY/HOURLY/WEEKLY/MONTHLY/YEARLY 且忽略 BYMINUTE,必须改用 Windows 任务计划程序 + 独立脚本实现分钟级调度。
openclaw skills install @eddie4xioshi-netizen/minutes-task用户提出"每 N 分钟执行一次"的定时需求(如:每 10 分钟推送微博热搜、每 5 分钟检查邮箱、每 30 分钟备份文件)。此时不要创建 WorkBuddy 内置自动化(见下方核心事实),改用本方案。
DAILY / HOURLY / WEEKLY / MONTHLY / YEARLYFREQ=MINUTELY 创建时直接报错 Unsupported RRULE frequencyFREQ=HOURLY;BYMINUTE=0,10,20,30,40,50 可创建但 BYMINUTE 被忽略,next_run_at 全部被解析为"创建时间+1小时" → 每小时只触发 1 次向用户确认两件事(若已明确可跳过):
在工作目录创建 <task_name>.py(任务名用小写英文+下划线,如 weibo_hot_push.py),脚本结构如下:
# -*- coding: utf-8 -*-
import json, os, subprocess, sys, urllib.request
from datetime import datetime
TASK_NAME = "<task_name>" # 任务名,用于日志识别
LOG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), TASK_NAME + ".log")
def log(msg):
line = f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {msg}"
print(line)
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(line + "\n")
def do_work():
"""写入用户的业务逻辑。返回 True=成功, False=失败。"""
# 在此实现具体任务(抓数据/发消息/处理文件)
# 失败时抛异常或返回 False
return True
def main():
log("=== 任务开始 ===")
try:
ok = do_work()
except Exception as e:
log(f"失败: {e}")
ok = False
log("=== 任务结束 " + ("成功" if ok else "失败") + " ===")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())
要点:
C:/Users/<user>/.workbuddy/binaries/python/versions/3.13.12/python.exe),避免 PATH 差异.log,用于事后验证运行次数do_work(),失败要有日志与返回码前台运行一次脚本,确认 === 任务结束 成功 === 且无报错:
<python绝对路径> <脚本绝对路径>
用 PowerShell 执行(<间隔分钟> 填 N,<任务名> 用 myapp-10min 格式):
$python = '<python绝对路径>'
$script = '<脚本绝对路径>'
$workDir = '<脚本所在目录>'
$action = New-ScheduledTaskAction -Execute $python -Argument ('"{0}"' -f $script) -WorkingDirectory $workDir
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes <间隔分钟>) -RepetitionDuration (New-TimeSpan -Days 365)
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Minutes 5) -MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName "<任务名>-<间隔分钟>min" -Action $action -Trigger $trigger -Settings $settings -Description '<任务描述>' -Force
首次运行在 1 分钟后,之后每 N 分钟一次。
Get-ScheduledTask -TaskName "<任务名>-<间隔分钟>min" → State 应为 ReadyGet-ScheduledTaskInfo -TaskName "<任务名>-<间隔分钟>min" → 记录 LastRunTime / NextRunTime.log 出现新的"任务开始/结束"记录Unregister-ScheduledTask -TaskName X -Confirm:$false,再走 Step 4)Disable-ScheduledTask -TaskName X(保留定义,可恢复)Enable-ScheduledTask -TaskName XUnregister-ScheduledTask -TaskName X -Confirm:$false<业务>-<间隔>min(如 weibo-10min、backup-30min),重复命名会覆盖-RepetitionDuration ([TimeSpan]::MaxValue) 报错 任务 XML 包含格式不正确或超出范围的值 → 用有限时长 (New-TimeSpan -Days 365)*> $log 重定向到文件再读取验证schtasks 等系统工具被安全策略禁用 → 用 Register-ScheduledTask(本方案不依赖 schtasks).cmd shim 路径转换崩溃(c:\c\...)→ 直接调用 node.exe 或 exe 完整路径用 lark-cli(飞书连接器安装后可用):
node.exe <lark-cli安装目录>/node_modules/@larksuite/cli/scripts/run.js im +messages-send --user-id <ou_xxx> --text "<消息>" --as bot
im:message.send_as_user 权限 → 用 --as bot