Install
openclaw skills install @thcjp/cron-mate-freeopenclaw skills install @thcjp/cron-mate-free写cron不用查文档。自然语言描述,自动生成表达式,一键验证语法。
将"每天早上8点"翻译成 0 8 * * *,将 0 8 * * 1-5 翻译成"工作日每天8点"。本技能提供cron表达式的辅助编写与验证能力,让定时规则编写变得直观高效。
┌─────────────────────────────────────────────────┐
│ cron表达式助手 (免费版) │
├─────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 自然语言输入 │ │ cron表达式 │ │
│ │ "每天8点" │ ──▶ │ "0 8 * * *" │ │
│ └──────────────┘ └──────────────┘ │
│ ▲ │ │
│ │ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 中文翻译 │ │ 语法验证 │ │
│ │ "每天8:00执行"│◀── │ ✓ 格式正确 │ │
│ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────┐ │
│ │ 常用模板速查库 (20+) │ │
│ │ 每日 / 每周 / 每月 / 间隔 / 工作日 │ │
│ └──────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
import re
def nl_to_cron(text):
"""自然语言转cron表达式(基础版)"""
text = text.strip().lower()
patterns = {
r'每天(\d+)点': lambda m: f"0 {m.group(1)} * * *",
r'每天(\d+):(\d+)': lambda m: f"{m.group(2)} {m.group(1)} * * *",
r'每(\d+)分钟': lambda m: f"*/{m.group(1)} * * * *",
r'每(\d+)小时': lambda m: f"0 */{m.group(1)} * * *",
r'工作日(\d+)点': lambda m: f"0 {m.group(1)} * * 1-5",
r'工作日(\d+):(\d+)': lambda m: f"{m.group(2)} {m.group(1)} * * 1-5",
r'每周一(\d+)点': lambda m: f"0 {m.group(1)} * * 1",
r'每周二(\d+)点': lambda m: f"0 {m.group(1)} * * 2",
r'每周三(\d+)点': lambda m: f"0 {m.group(1)} * * 3",
r'每周四(\d+)点': lambda m: f"0 {m.group(1)} * * 4",
r'每周五(\d+)点': lambda m: f"0 {m.group(1)} * * 5",
r'每周六(\d+)点': lambda m: f"0 {m.group(1)} * * 6",
r'每周日(\d+)点': lambda m: f"0 {m.group(1)} * * 0",
r'每月(\d+)号(\d+)点': lambda m: f"0 {m.group(2)} {m.group(1)} * *",
r'每小时整点': lambda m: f"0 * * * *",
r'每分钟': lambda m: f"* * * * *",
}
for pattern, func in patterns.items():
match = re.match(pattern, text)
if match:
cron = func(match)
print(f"输入:{text}")
print(f"cron:{cron}")
print(f"含义:{cron_to_chinese(cron)}")
return cron
print(f"未识别:{text},请尝试更标准的表述")
return None
def cron_to_chinese(cron):
"""cron表达式转中文描述"""
parts = cron.split()
if len(parts) != 5:
return "格式错误"
minute, hour, day, month, weekday = parts
desc_parts = []
if minute == "*" and hour == "*":
desc_parts.append("每分钟")
elif minute == "0" and hour == "*":
desc_parts.append("每小时整点")
elif "*" in minute and "/" in minute:
desc_parts.append(f"每{minute.split('/')[1]}分钟")
elif "*" in hour and "/" in hour:
desc_parts.append(f"每{hour.split('/')[1]}小时")
else:
if hour != "*":
h = int(hour)
time_str = f"{h:02d}:{int(minute):02d}" if minute != "*" else f"{h:02d}:00"
desc_parts.append(f"每天{time_str}")
if weekday == "1-5":
desc_parts.append("(仅工作日)")
elif weekday == "0" or weekday == "7":
desc_parts.append("(仅周日)")
elif weekday == "6":
desc_parts.append("(仅周六)")
elif weekday not in ["*", "?"]:
names = ["周日","周一","周二","周三","周四","周五","周六","周日"]
try:
desc_parts.append(f"(仅{names[int(weekday)]})")
except (ValueError, IndexError):
pass
if day not in ["*", "?"]:
desc_parts.append(f"每月{day}号")
return "".join(desc_parts)
nl_to_cron("每天8点") # 0 8 * * *
nl_to_cron("每15分钟") # */15 * * * *
nl_to_cron("工作日9:30") # 30 9 * * 1-5
nl_to_cron("每周一10点") # 0 10 * * 1
配置完整的验证与翻译工具:
详细代码示例已移至
references/detail.md
配置交互式编写助手:
class InteractiveCronMate(CronMate):
"""交互式cron编写助手"""
def interactive_create(self):
"""交互式创建cron表达式"""
print("=== 交互式cron表达式创建 ===\n")
print("选择执行频率:")
print("1. 每X分钟")
print("2. 每X小时")
print("3. 每天指定时间")
print("4. 工作日指定时间")
print("5. 每周指定天")
print("6. 每月指定日")
choice = input("\n请选择(1-6): ").strip()
if choice == "1":
n = input("每几分钟?(1-59): ").strip()
cron = f"*/{n} * * * *"
elif choice == "2":
n = input("每几小时?(1-23): ").strip()
cron = f"0 */{n} * * *"
elif choice == "3":
time = input("每天几点?(格式 HH:MM): ").strip()
h, m = time.split(":")
cron = f"{m} {h} * * *"
elif choice == "4":
time = input("工作日几点?(格式 HH:MM): ").strip()
h, m = time.split(":")
cron = f"{m} {h} * * 1-5"
elif choice == "5":
days = input("星期几?(0=日,1=一,...,6=六): ").strip()
time = input("几点?(格式 HH:MM): ").strip()
h, m = time.split(":")
cron = f"{m} {h} * * {days}"
elif choice == "6":
day = input("每月几号?(1-31): ").strip()
time = input("几点?(格式 HH:MM): ").strip()
h, m = time.split(":")
cron = f"{m} {h} {day} * *"
else:
print("无效选择")
return None
valid, msg = self.validate(cron)
if valid:
print(f"\n✓ 表达式:{cron}")
print(f" 含义:{self.translate(cron)}")
return cron
else:
print(f"\n✗ 验证失败:{msg}")
return None
def quick_search(self, keyword):
"""按关键词搜索模板"""
templates = self.templates()
results = {k: v for k, v in templates.items() if keyword in k}
if results:
print(f"搜索 '{keyword}' 结果:")
for name, expr in results.items():
print(f" {name:<20} → {expr} ({self.translate(expr)})")
else:
print(f"未找到匹配 '{keyword}' 的模板")
return results
| 输入 | 输出 |
|---|---|
| 每天8点 | 0 8 * * * |
| 每天9:30 | 30 9 * * * |
| 每15分钟 | */15 * * * * |
| 每2小时 | 0 */2 * * * |
| 工作日8点 | 0 8 * * 1-5 |
| 每周一10点 | 0 10 * * 1 |
| 每月1号0点 | 0 0 1 * * |
| 每小时整点 | 0 * * * * |
| 每分钟 | * * * * * |
输入: 用户提供自然语言转换所需的指令和必要参数。 处理: 按照skill规范执行自然语言转换操作,遵循单一意图原则。 输出: 返回自然语言转换的执行结果,包含操作状态和输出数据。
| 验证项 | 说明 |
|---|---|
| 字段数 | 必须为5个字段 |
| 数值范围 | 分钟(0-59)/小时(0-23)/日(1-31)/月(1-12)/周(0-7) |
| 特殊字符 | 支持 * ? / , - |
| 步长格式 | */N 或 A-B/N |
| 列表格式 | 1,3,5 逗号分隔 |
| 范围格式 | 1-5 连字符 |
输入: 用户提供语法验证所需的指令和必要参数。 处理: 按照skill规范执行语法验证操作,遵循单一意图原则。 输出: 返回语法验证的执行结果,包含操作状态和输出数据。
将cron表达式翻译为人类可读的中文描述:
0 8 * * * → "在08:00执行"*/15 * * * * → "每15分钟执行"0 8 * * 1-5 → "在08:00执行(仅工作日)"0 0 1 * * → "在00:00执行,每月1号"输入: 用户提供中文翻译所需的指令和必要参数。 处理: 按照skill规范执行中文翻译操作,遵循单一意图原则。 输出: 返回中文翻译的执行结果,包含操作状态和输出数据。
提供20+常用调度模板,按类别分类:每日、每周、每月、间隔、工作日。
输入: 用户提供模板速查库所需的指令和必要参数。 处理: 按照skill规范执行模板速查库操作,遵循单一意图原则。 输出: 返回模板速查库的执行结果,包含操作状态和输出数据。
input_params参数,支持创建/查询/导出操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:表达式辅助编写与、验证工具免费版、支持自然语言转表、常用模板速查、基础语法验证、表达式助手免费版、是面向开发者和运、维人员的、表达式辅助编写工、将晦涩的、语法转化为友好的、交互体验、自然语言转表达式、人类可读翻译、编写不再痛苦、Use、when、需要文本翻译、多语言转换、本地化处理时使用、不适用于专业医学、法律翻译认证、适用于独立开发者、企业团队和自动化、工作流场景等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持。角色:后端开发者
场景描述:需要为新服务配置定时健康检查,不确定cron表达式怎么写。
mate = CronMate()
cron = mate.nl_to_cron("每5分钟") # */5 * * * *
valid, msg = mate.validate(cron)
print(f"验证结果:{msg}")
print(f"含义:{mate.translate(cron)}")
角色:技术负责人
场景描述:团队cron表达式风格不统一,需要建立标准模板库。
mate = CronMate()
templates = mate.templates()
print("=== 团队标准cron模板 ===")
for name, expr in templates.items():
valid, _ = mate.validate(expr)
status = "✓" if valid else "✗"
print(f"{status} {name:<20} {expr}")
角色:运维工程师
场景描述:接手他人的定时任务,需要快速理解cron表达式含义。
mate = CronMate()
expressions = [
"0 2 * * 6", # 周六凌晨2点
"*/30 * * * *", # 每30分钟
"0 0 1 1,7 *", # 1月和7月的1号零点
]
for expr in expressions:
valid, msg = mate.validate(expr)
if valid:
print(f"{expr:<20} → {mate.translate(expr)}")
else:
print(f"{expr:<20} → 无效:{msg}")
从左到右依次为:分钟(0-59)、小时(0-23)、日(1-31)、月(1-12)、周(0-7,0和7都表示周日)。用空格分隔。例如 0 8 * * 1-5 表示"工作日每天8点0分"。
* / , - 分别什么意思?* 表示"所有值"(每分钟/每小时等);/ 表示步长,如 */15 表示每15分钟;, 表示列表,如 1,3,5 表示1、3、5;- 表示范围,如 1-5 表示1到5。
免费版支持常见中文表述:每天X点、每天X:XX、每X分钟、每X小时、工作日X点、每周X/X点、每月X号、每小时整点、每分钟。如果表述未被识别,建议使用更标准的格式,或使用交互式创建模式。
检查对应字段的数值是否在有效范围内:分钟0-59、小时0-23、日1-31、月1-12、周0-7。常见错误:小时写25(最大23)、日写0(最小1)、月写13(最大12)。
免费版不支持以下高级特性(需升级专业版):L(最后一天)、W(最近工作日)、#(第N个星期X)、7字段扩展格式(含秒和年)、时区转换、表达式冲突检测、优化建议。
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python标准库 | 内置 | 必需 | Python自带(re模块) |
| LLM API | API | 必需 | 由Agent平台内置LLM提供 |
本技能基于原始开源cron辅助工具作品改进,保留原始版权声明:
本改进作品在原始作品基础上进行了深度差异化改造,包括但不限于:
原始MIT license允许使用、复制、修改和分发,需保留版权声明。本改进作品在保留原始版权声明的基础上添加自有署名,完全符合MIT license要求。
本免费体验版限制以下高级功能:
解锁全部功能请使用专业版:cron-mate-pro
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
输入:用户提供操作指令和必要参数
输出:返回执行结果,包含操作状态和输出数据
用户: 执行核心功能
Skill: 正在执行核心功能...
Skill: 执行完成,结果如下: 操作成功