SEAP Shopping Skill
这是一个用于处理购物需求的 skill,支持用户在场购买和不在场预约购买两种场景。
触发条件
当用户对话中包含"买"字时,自动触发此 skill。
配置文件
配置文件位于 seap.config.json,包含以下配置项:
{
"authCode": "your_auth_code_here",
"addresses": [
{
"name": "收货人姓名",
"phone": "135xxxxxxxx",
"country": "CN",
"province": "广东省",
"city": "深圳市",
"district": "龙岗区",
"detail": "详细地址"
}
],
"autoPush": {
"enabled": true,
"channel": "webchat"
}
}
- authCode: 用于调用云侧接口传输的凭证
- addresses: 收货地址列表,支持多个地址,每个地址包含姓名、电话、省市区及详细地址
- autoPush: 自动推送配置,启用购买结果自动通知
依赖工具
依赖 scripts/seap-cli.js 执行相关命令。技能可在普通环境中运行,无需acpx运行时。
命令行工具
seap-cli.js 主要命令
search - 搜索商品
aipay - 执行购买(基于确认信息)
工作流程
执行命令进入skill目录
cd ~/.openclaw/workspace/skills/seap-shopping
场景一:用户在场购买
- 用户发送对话,例如"我想买一瓶红酒"
- 提取用户意图关键词原文为"queryGoodsIntention",当前商品数量为"quantity"
- 执行命令:
node scripts/seap-cli search --sessionId=${openclaw当前sessionId} --intent=${queryGoodsIntention} --format md
- ⚠️ 重要:将查询后的 markdown 通过对话信息返回所有商品数据并按顺序标号,供用户进行选择
- 必须显示搜索返回的全部商品,不得限制数量或只显示部分
- 确保用户能看到所有可选商品
- 用户对话确认指定序号商品后,读取
${openclaw当前sessionId}.json 文件对应序号的商品,获取商品 "skuId",从mercInfo的id字段中获取"mercInfoId"
- 地址确认对话:
- 系统自动从
seap.config.json 读取当前收货地址数据结构
- 通过 OpenClaw 消息功能向用户显示当前地址:"当前收货地址:[地址],是否确认?(回复确认/修改:新地址)"
- 用户确认地址或提供新地址
- 如果用户修改地址,解析对应地址格式:'收货人姓名 收货人电话 国家 省份 市 区 详细地址',解析后按对应数据结构更新
seap.config.json 文件
- 购买确认:
- 生成确认文件
${sessionId}_confirmed.json,包含商品和确认后的地址信息
- 执行购买命令:
node scripts/seap-cli aipay --sessionId=${openclaw当前sessionId} --skuId=${skuId} --quantity=${quantity} --mercInfoId=${mercInfoId}
- 文件清理:
- 购买成功后:自动清理
${sessionId}_confirmed.json 确认文件
- 保留
${sessionId}.json 作为最终购买结果
- 将购买后的结果信息返回给用户进行提示,根据 success 区分"购买成功"或"购买失败"
场景二:用户不在场购买
-
用户发起预约购买:"三十分钟后帮我买一瓶红酒" 或 "1分钟后帮我买一瓶红酒"
提取用户意图关键词原文为"queryGoodsIntention",当前商品数量为"quantity"
-
搜索商品:
执行命令
node scripts/seap-cli search --sessionId=${sessionId} --intent=${queryGoodsIntention} --format md
-
⚠️ 重要用户选择商品:将查询后的 markdown 通过对话信息返回所有商品数据并按顺序标号,供用户进行选择
- 必须显示搜索返回的全部商品,不得限制数量或只显示部分
- 确保用户能看到所有可选商品
- 系统显示带序号的商品列表
-
用户回复序号(如"1")选择商品,系统读取 ${sessionId}.json 文件获取对应商品信息,获取商品 "skuId",从mercInfo的id字段中获取"mercInfoId"
-
地址确认对话:
- 系统自动从
seap.config.json 读取当前收货地址数据结构
- 通过 OpenClaw 消息功能向用户显示当前地址:"当前收货地址:[地址],是否确认?(回复确认/修改:新地址)"
- 用户确认地址或提供新地址
- 如果用户修改地址,解析对应地址格式:'收货人姓名 收货人电话 国家 省份 市 区 详细地址',解析后按对应数据结构更新
seap.config.json 文件
-
购买确认:
- 生成确认文件
${sessionId}_confirmed.json,包含商品和确认后的地址信息
-
🔧 购买时间确认
步骤1:确认购买时间
系统解析用户原始时间表达式(如"1分钟后")
计算确切的执行时间戳
步骤2:发送确认消息
"⏰ 购买时间确认
您选择的商品:[商品名称]
预计购买时间:[时间表达式] (约[具体时间])
请确认是否继续预约购买:
步骤3:等待用户确认
用户回复确认、修改时间或取消
步骤4:处理用户选择
- 确认:创建定时任务,系统将在指定时间自动购买
- 修改:重新开始预约流程
- 取消:清理临时文件,结束流程
-
🔧 创建定时购买任务
系统解析用户原始时间表达式(如"1分钟后")计算确切的执行时间戳,自动创建 OpenClaw cron 任务
任务配置:
{
"name": "预约购买 - [商品名称]",
"schedule": {
"kind": "at",
"at": "[ISO格式的执行时间]"
},
"payload": {
"kind": "agentTurn",
"message": "你正在执行一个定时购买任务。
任务信息:
- 商品SKU: ${skuId}
- 原始会话: ${原sessionKey}
请按以下步骤完成购买并推送结果:
-
执行购买命令:
node scripts/seap-cli aipay --sessionId=${原sessionKey} --skuId=${skuId} --quantity=${quantity} --mercInfoId=${mercInfoId}
-
读取购买结果:
从 ${原sessionKey}.json 文件读取购买结果
-
推送结果到原会话:
使用 sessions_send 将购买结果发送到原始会话
-
清理临时文件(如果有)",
"timeoutSeconds": 120
},
"sessionTarget": "current",
"deleteAfterRun": true,
"delivery": {
"mode": "announce"
}
}
⚠️ 重要说明:
1. delivery.mode 必须设置为 "announce" 或 "webhook" 以便推送结果
2. payload 中的 message 必须包含完整的结果推送逻辑
3. 必须使用 sessions_send 工具将结果推送到原会话
9.提示用户任务已创建
"✅ 预约购买任务已创建!
📦 商品信息
- 名称:[商品名称]
- 价格:¥[价格]
- SKU:[SKU]
📍 收货地址
[收货地址]
⏰ 执行时间
[时间表达式] (约[具体时间])
系统将在指定时间自动执行购买,并将结果通知您。"
10. **定时任务自动执行**
- 到达指定时间后,OpenClaw自动在当前会话中执行任务
- Agent在当前会话中执行购买命令(使用 aipay)
- Agent读取购买结果(从 ${sessionKey}.json)
11. **🔧 购买结果自动推送(Agent在当前会话中执行)**
由于使用 sessionTarget="current",购买结果会自动显示在当前会话
无需手动使用 sessions_send 推送结果
Agent只需执行购买命令,结果会自动呈现给用户
# 步骤1:定时任务触发购买
系统自动执行执行命令
```bash
node scripts/seap-cli aipay --sessionId=${原sessionKey} --skuId=${skuId} --quantity=${quantity} --mercInfoId=${mercInfoId}
步骤2:生成完整购买结果
{
"sessionId": "${sessionId}",
"skuId": "[商品SKU]",
"productName": "[商品名称]",
"productPrice": [价格],
"orderId": "[生成的订单号]",
"success": [布尔值],
"address": "[收货地址]",
"executedAt": "[执行时间]",
"executionType": "scheduled"
}
步骤3:保存购买结果
更新 ${sessionId}.json 文件,包含完整的购买信息
步骤4:自动生成结果消息
生成用户友好的通知消息:
"✅ 预约购买任务已完成!
📦 商品信息
- 名称:[商品名称]
- 价格:¥[价格]
- SKU:[SKU]
📋 订单信息
📍 收货地址
[收货地址]
⏰ 完成时间
[完成时间]
💡 这是您的预约购买结果。"
步骤5:推送结果至原会话
使用 sessions_send 将结果发送到用户的原始会话
确保用户能够立即收到购买完成通知
步骤7:清理临时文件
购买完成后清理临时文件:
- 删除 ${sessionId}_task.json
- 删除 ${sessionId}_confirmed.json
- 保留 ${sessionId}.json 作为购买记录
📊 状态管理
- ${sessionId}.json - 保存搜索结果和最终购买结果
- ${sessionId}_confirmed.json - 临时保存购买确认信息(执行后清理)
- ${sessionId}_cron.json - 保存定时任务配置(执行后清理)
- ${sessionId}_task.json - 保存预约购买任务配置(执行后清理)
✅ 预期效果
- 无缝体验:用户确认购买后,系统自动处理后续所有流程
- 准时执行:定时任务确保在指定时间自动执行购买
- 实时通知:购买完成后立即推送详细结果
- 可靠管理:完整的任务生命周期和错误处理机制