问题:定时提醒触发时,--session isolated 导致消息被当作新会话处理, AI 会输出初始化对话(询问用户是谁等),提醒内容显得生硬且冗长。 修改: - 删除 SKILL.md 中所有命令模板的 --session isolated 参数 - 删除 SKILL.md 中结构化载荷格式章节(已选择命令行方案) - 更新 gateway.ts 中的示例命令 效果:提醒触发时直接发送消息内容,不再启动 AI 会话。 支持 </img> 闭合标签
490 lines
12 KiB
Markdown
490 lines
12 KiB
Markdown
---
|
||
name: qqbot-cron
|
||
description: QQ Bot 智能提醒技能。支持一次性提醒、周期性任务、自动降级确保送达。可设置、查询、取消提醒。
|
||
metadata: {"clawdbot":{"emoji":"⏰"}}
|
||
---
|
||
|
||
# QQ Bot 智能提醒
|
||
|
||
让 AI 帮用户设置、管理定时提醒,支持私聊和群聊。
|
||
|
||
---
|
||
|
||
## 🤖 AI 决策指南
|
||
|
||
> **本节专为 AI 理解设计,帮助快速决策**
|
||
|
||
### 用户意图识别
|
||
|
||
| 用户说法 | 意图 | 执行动作 |
|
||
|----------|------|----------|
|
||
| "5分钟后提醒我喝水" | 创建提醒 | `openclaw cron add` |
|
||
| "每天8点提醒我打卡" | 创建周期提醒 | `openclaw cron add --cron` |
|
||
| "我有哪些提醒" | 查询提醒 | `openclaw cron list` |
|
||
| "取消喝水提醒" | 删除提醒 | `openclaw cron remove` |
|
||
| "修改提醒时间" | 删除+重建 | 先 remove 再 add |
|
||
| "提醒我" (无时间) | **需追问** | 询问具体时间 |
|
||
|
||
### 必须追问的情况
|
||
|
||
当用户说法**缺少以下信息**时,**必须追问**:
|
||
|
||
1. **没有时间**:"提醒我喝水" → 询问"请问什么时候提醒你?"
|
||
2. **时间模糊**:"晚点提醒我" → 询问"具体几点呢?"
|
||
3. **周期不明**:"定期提醒我" → 询问"多久一次?每天?每周?"
|
||
|
||
### 无需追问可直接执行
|
||
|
||
| 用户说法 | 理解为 |
|
||
|----------|--------|
|
||
| "5分钟后" | `--at 5m` |
|
||
| "半小时后" | `--at 30m` |
|
||
| "1小时后" | `--at 1h` |
|
||
| "明天早上8点" | `--at 2026-02-02T08:00:00+08:00` |
|
||
| "每天早上8点" | `--cron "0 8 * * *"` |
|
||
| "工作日9点" | `--cron "0 9 * * 1-5"` |
|
||
|
||
---
|
||
|
||
## 📋 命令速查
|
||
|
||
### 创建提醒(完整模板)
|
||
|
||
```bash
|
||
openclaw cron add \
|
||
--name "{任务名}" \
|
||
--at "{时间}" \
|
||
--message "🔔 {提醒内容}时间到!" \
|
||
--deliver \
|
||
--channel qqbot \
|
||
--to "{openid}" \
|
||
--delete-after-run
|
||
```
|
||
|
||
> ⚠️ **极其重要**:
|
||
> - `--message` 参数直接写最终要发送的提醒内容
|
||
> - 提醒内容格式:`🔔 {内容}时间到!`
|
||
> - **不要**使用 `--system-prompt` 或 `--system-event`(cron 不支持这些参数)
|
||
> - 保持消息简洁,如:`🔔 喝水时间到!`、`📅 开会时间到!`
|
||
|
||
> ⚠️ **注意**:`cron add` 命令不支持 `--reply-to` 参数。提醒消息将作为主动消息直接发送给用户。
|
||
|
||
### 查询提醒列表
|
||
|
||
```bash
|
||
openclaw cron list
|
||
```
|
||
|
||
### 删除提醒
|
||
|
||
```bash
|
||
openclaw cron remove {jobId}
|
||
```
|
||
|
||
### 立即发送消息(主动消息)
|
||
|
||
```bash
|
||
openclaw message send \
|
||
--channel qqbot \
|
||
--target "{openid}" \
|
||
--message "{消息内容}"
|
||
```
|
||
|
||
### 立即发送消息(被动回复)
|
||
|
||
```bash
|
||
openclaw message send \
|
||
--channel qqbot \
|
||
--target "{openid}" \
|
||
--reply-to "{message_id}" \
|
||
--message "{消息内容}"
|
||
```
|
||
|
||
> ⚠️ **注意**:`--reply-to` 仅在 `message send` 命令中支持,且 message_id 必须在 1 小时内有效。定时提醒不支持被动回复。
|
||
|
||
---
|
||
|
||
## 💬 用户交互模板
|
||
|
||
> **创建提醒后的反馈要简洁友好,不要啰嗦**
|
||
|
||
### 创建成功反馈(推荐简洁版)
|
||
|
||
**一次性提醒**:
|
||
```
|
||
⏰ 好的,{时间}后提醒你{提醒内容}~
|
||
```
|
||
|
||
**周期提醒**:
|
||
```
|
||
⏰ 收到,{周期描述}提醒你{提醒内容}~
|
||
```
|
||
|
||
### 查询提醒反馈
|
||
|
||
```
|
||
📋 你的提醒:
|
||
|
||
1. ⏰ {提醒名} - {时间}
|
||
2. 🔄 {提醒名} - {周期}
|
||
|
||
说"取消xx提醒"可删除~
|
||
```
|
||
|
||
### 无提醒时反馈
|
||
|
||
```
|
||
📋 目前没有提醒哦~
|
||
|
||
说"5分钟后提醒我xxx"试试?
|
||
```
|
||
|
||
### 删除成功反馈
|
||
|
||
```
|
||
✅ 已取消"{提醒名称}"
|
||
```
|
||
|
||
---
|
||
|
||
## ⏱️ 时间格式
|
||
|
||
### 相对时间(--at)
|
||
|
||
> ⚠️ **不要加 + 号!** 用 `5m` 而不是 `+5m`
|
||
|
||
| 用户说法 | 参数值 |
|
||
|----------|--------|
|
||
| 5分钟后 | `5m` |
|
||
| 半小时后 | `30m` |
|
||
| 1小时后 | `1h` |
|
||
| 2小时后 | `2h` |
|
||
| 明天这时候 | `24h` |
|
||
|
||
### 绝对时间(--at)
|
||
|
||
| 用户说法 | 参数值 |
|
||
|----------|--------|
|
||
| 今天下午3点 | `2026-02-01T15:00:00+08:00` |
|
||
| 明天早上8点 | `2026-02-02T08:00:00+08:00` |
|
||
| 2月14日中午 | `2026-02-14T12:00:00+08:00` |
|
||
|
||
### Cron 表达式(--cron)
|
||
|
||
| 用户说法 | Cron 表达式 | 必须加 `--tz "Asia/Shanghai"` |
|
||
|----------|-------------|------------------------------|
|
||
| 每天早上8点 | `0 8 * * *` | ✅ |
|
||
| 每天晚上10点 | `0 22 * * *` | ✅ |
|
||
| 每个工作日早上9点 | `0 9 * * 1-5` | ✅ |
|
||
| 每周一早上9点 | `0 9 * * 1` | ✅ |
|
||
| 每周末上午10点 | `0 10 * * 0,6` | ✅ |
|
||
| 每小时整点 | `0 * * * *` | ✅ |
|
||
|
||
---
|
||
|
||
## 📌 参数说明
|
||
|
||
### 必填参数
|
||
|
||
| 参数 | 说明 | 示例 |
|
||
|------|------|------|
|
||
| `--name` | 任务名,含用户标识 | `"喝水提醒"` |
|
||
| `--at` / `--cron` | 触发时间(二选一) | `5m` / `0 8 * * *` |
|
||
| `--message` | **提醒内容**(见下方模板) | `"🔔 喝水时间到!"` |
|
||
| `--deliver` | 启用投递 | 固定值 |
|
||
| `--channel qqbot` | QQ 渠道 | 固定值 |
|
||
| `--to` | 接收者 openid | 从系统消息获取 |
|
||
|
||
### 推荐参数
|
||
|
||
| 参数 | 说明 | 何时使用 |
|
||
|------|------|----------|
|
||
| `--delete-after-run` | 执行后删除 | **一次性任务必须** |
|
||
| `--tz "Asia/Shanghai"` | 时区 | **周期任务必须** |
|
||
|
||
### --message 提醒内容模板(最关键)
|
||
|
||
> ⚠️ **`--message` 的内容会直接发送给用户**,所以要写清楚提醒内容!
|
||
|
||
**模板格式**:
|
||
```
|
||
--message "🔔 {提醒内容}时间到!"
|
||
```
|
||
|
||
**示例**:
|
||
- 喝水:`--message "💧 喝水时间到!"`
|
||
- 开会:`--message "📅 开会时间到!"`
|
||
- 打卡:`--message "🌅 打卡时间到!"`
|
||
- 日报:`--message "📝 写日报时间到!"`
|
||
|
||
**为什么这样写?**
|
||
- 消息内容会直接发送,不经过 AI 处理
|
||
- 保持简洁,一目了然
|
||
|
||
---
|
||
|
||
## 🎯 使用场景示例
|
||
|
||
### 场景1:一次性提醒
|
||
|
||
**用户**: 5分钟后提醒我喝水
|
||
|
||
**AI 执行**:
|
||
```bash
|
||
openclaw cron add \
|
||
--name "喝水提醒" \
|
||
--at "5m" \
|
||
--message "💧 喝水时间到!" \
|
||
--deliver \
|
||
--channel qqbot \
|
||
--to "{openid}" \
|
||
--delete-after-run
|
||
```
|
||
|
||
**AI 回复**:
|
||
```
|
||
⏰ 好的,5分钟后提醒你喝水~
|
||
```
|
||
|
||
**5分钟后用户收到**:
|
||
```
|
||
💧 喝水时间到!
|
||
```
|
||
|
||
---
|
||
|
||
### 场景2:每日周期提醒
|
||
|
||
**用户**: 每天早上8点提醒我打卡
|
||
|
||
**AI 执行**:
|
||
```bash
|
||
openclaw cron add \
|
||
--name "打卡提醒" \
|
||
--cron "0 8 * * *" \
|
||
--tz "Asia/Shanghai" \
|
||
--message "🌅 打卡时间到!" \
|
||
--deliver \
|
||
--channel qqbot \
|
||
--to "{openid}"
|
||
```
|
||
|
||
**AI 回复**:
|
||
```
|
||
⏰ 收到,每天早上8点提醒你打卡~
|
||
```
|
||
|
||
> 💡 周期任务**不加** `--delete-after-run`
|
||
|
||
---
|
||
|
||
### 场景3:工作日提醒
|
||
|
||
**用户**: 工作日下午6点提醒我写日报
|
||
|
||
**AI 执行**:
|
||
```bash
|
||
openclaw cron add \
|
||
--name "日报提醒" \
|
||
--cron "0 18 * * 1-5" \
|
||
--tz "Asia/Shanghai" \
|
||
--message "📝 写日报时间到!" \
|
||
--deliver \
|
||
--channel qqbot \
|
||
--to "{openid}"
|
||
```
|
||
|
||
**AI 回复**:
|
||
```
|
||
⏰ 收到,工作日下午6点提醒你写日报~
|
||
```
|
||
|
||
---
|
||
|
||
### 场景4:会议提醒
|
||
|
||
**用户**: 3分钟后提醒我开会
|
||
|
||
**AI 执行**:
|
||
```bash
|
||
openclaw cron add \
|
||
--name "开会提醒" \
|
||
--at "3m" \
|
||
--message "📅 开会时间到!" \
|
||
--deliver \
|
||
--channel qqbot \
|
||
--to "{openid}" \
|
||
--delete-after-run
|
||
```
|
||
|
||
**AI 回复**:
|
||
```
|
||
⏰ 好的,3分钟后提醒你开会~
|
||
```
|
||
|
||
**3分钟后用户收到**:
|
||
```
|
||
📅 开会时间到!
|
||
```
|
||
|
||
---
|
||
|
||
### 场景5:群组提醒
|
||
|
||
**用户**(群聊): 每天早上9点提醒大家站会
|
||
|
||
**AI 执行**:
|
||
```bash
|
||
openclaw cron add \
|
||
--name "站会提醒" \
|
||
--cron "0 9 * * 1-5" \
|
||
--tz "Asia/Shanghai" \
|
||
--message "📢 站会时间到!" \
|
||
--deliver \
|
||
--channel qqbot \
|
||
--to "group:{group_openid}"
|
||
```
|
||
|
||
> 💡 群组使用 `group:{group_openid}` 格式
|
||
|
||
---
|
||
|
||
### 场景6:查询提醒
|
||
|
||
**用户**: 我有哪些提醒?
|
||
|
||
**AI 执行**:
|
||
```bash
|
||
openclaw cron list
|
||
```
|
||
|
||
**AI 回复**(根据返回结果):
|
||
```
|
||
📋 你的提醒:
|
||
|
||
1. ⏰ 喝水提醒 - 3分钟后
|
||
2. 🔄 打卡提醒 - 每天08:00
|
||
|
||
说"取消xx提醒"可删除~
|
||
```
|
||
|
||
---
|
||
|
||
### 场景7:取消提醒
|
||
|
||
**用户**: 取消打卡提醒
|
||
|
||
**AI 执行**:
|
||
1. 先执行 `openclaw cron list` 找到对应任务 ID
|
||
2. 执行 `openclaw cron remove {jobId}`
|
||
|
||
**AI 回复**:
|
||
```
|
||
✅ 已取消"打卡提醒"
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ 消息发送说明
|
||
|
||
### 定时提醒(cron add)
|
||
|
||
定时提醒**只能发送主动消息**,因为:
|
||
- 提醒执行时,原始 message_id 通常已超过 1 小时有效期
|
||
- `openclaw cron add` 命令不支持 `--reply-to` 参数
|
||
|
||
```
|
||
┌─────────────────────┐
|
||
│ 定时任务触发 │
|
||
└──────────┬──────────┘
|
||
↓
|
||
┌─────────────────────┐
|
||
│ AI 通过 system-event │
|
||
│ 获取用户上下文信息 │
|
||
└──────────┬──────────┘
|
||
↓
|
||
┌─────────────────────┐
|
||
│ 发送主动消息到用户 │
|
||
│ --channel qqbot │
|
||
│ --to {openid} │
|
||
└──────────┬──────────┘
|
||
↓
|
||
✅ 用户收到提醒
|
||
```
|
||
|
||
### 即时回复(message send)
|
||
|
||
即时消息发送支持被动回复(如果 message_id 有效):
|
||
|
||
```
|
||
┌─────────────────────┐
|
||
│ 发送即时消息 │
|
||
└──────────┬──────────┘
|
||
↓
|
||
┌──────────────────────────────┐
|
||
│ 有 --reply-to 且 message_id │
|
||
│ 在 1 小时内有效? │
|
||
└──────────────────────────────┘
|
||
↓ ↓
|
||
是 否
|
||
↓ ↓
|
||
┌───────────────┐ ┌─────────────────┐
|
||
│ 被动消息回复 │ │ 发送主动消息 │
|
||
│ (引用原消息) │ │ (直接发送) │
|
||
└───────────────┘ └─────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 重要限制
|
||
|
||
| 限制 | 说明 |
|
||
|------|------|
|
||
| **message_id 有效期** | 1 小时内有效,超时自动降级 |
|
||
| **回复次数限制** | 同一 message_id 最多回复 4 次 |
|
||
| **主动消息权限** | ⚠️ **QQ 机器人需要申请主动消息权限**,否则定时提醒会发送失败 |
|
||
| **主动消息限制** | 只能发给与机器人交互过的用户(24小时内) |
|
||
| **消息内容** | `--message` 不能为空 |
|
||
|
||
### ⚠️ 主动消息权限说明
|
||
|
||
定时提醒功能依赖**主动消息能力**,但 QQ 官方默认**不授予**此权限。
|
||
|
||
**常见错误**:
|
||
- 错误码 `40034102`:"主动消息失败, 无权限"
|
||
- 这表示机器人没有主动消息权限
|
||
|
||
**解决方案**:
|
||
1. 登录 [QQ 开放平台](https://q.qq.com/)
|
||
2. 进入机器人开发-沙箱管理,消息列表配置中添加自己。
|
||
|
||
> 💡 **临时替代方案**:在没有主动消息权限前,可以让用户使用"回复"方式获得即时提醒,而非定时提醒。
|
||
|
||
---
|
||
|
||
## 📝 消息模板
|
||
|
||
| 场景 | 触发时输出 | Emoji |
|
||
|------|------------|-------|
|
||
| 喝水 | 喝水时间到啦! | 💧 🚰 |
|
||
| 打卡 | 早上好,打卡时间到! | 🌅 ✅ |
|
||
| 会议 | 开会时间到! | 📅 👥 |
|
||
| 休息 | 该休息一下了~ | 😴 💤 |
|
||
| 日报 | 下班前别忘了写日报哦~ | 📝 ✍️ |
|
||
| 运动 | 运动时间到! | 🏃 💪 |
|
||
| 吃药 | 该吃药了~ | 💊 🏥 |
|
||
| 生日 | 今天是xx的生日! | 🎂 🎉 |
|
||
|
||
---
|
||
|
||
## 🔧 用户标识
|
||
|
||
| 类型 | 格式 | 来源 |
|
||
|------|------|------|
|
||
| 用户 openid | `B3EA9A1d-2D3c-5CBD-...` | 系统消息自动提供 |
|
||
| 群组 openid | `group:FeC1ADaf-...` | 系统消息自动提供 |
|
||
| message_id | `ROBOT1.0_xxx` | 系统消息自动提供 |
|
||
|
||
> 💡 这些信息在系统消息中格式如:
|
||
> - `当前用户 openid: B3EA9A1d-...`
|
||
> - `当前消息 message_id: ROBOT1.0_...` |