Skip to main content

uupt-delivery-skill

UU跑腿同城配送服务。支持订单询价、发单下单、查询订单、取消订单、骑手实时追踪。当用户表达任何与"送"、"取"、"寄"、"跑腿"、"发单"、"配送"相关的配送需求时使用此skill。

Jump to install

Source facts

Repository
LeoYeAI/openclaw-master-skills
Last source activity
June 29, 2026 at 02:02
Detected SKILL.md language
Chinese
Stars
2,151
Forks
325

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
13 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
uupt-delivery-skill
description
UU跑腿同城配送服务。支持订单询价、发单下单、查询订单、取消订单、骑手实时追踪。当用户表达任何与"送"、"取"、"寄"、"跑腿"、"发单"、"配送"相关的配送需求时使用此skill。
version
1.3.0
metadata
{"openclaw":{"requires":{"env":"[Truncated]","bins":"[Truncated]"},"homepage":"https://open.uupt.com","install":["[Truncated]","[Truncated]"]}}
# UU跑腿同城配送服务 Skill UU跑腿同城配送服务为用户提供便捷的同城即时配送能力,包括订单询价、发单、订单管理和跑男实时追踪等功能。 ## 功能特性 - 📱 手机号一键注册(首次使用自动引导) - 💰 订单询价(计算配送费用) - 📦 创建配送订单 - 💳 微信扫码支付(余额不足时自动生成支付二维码) - 📋 查询订单详情 - ❌ 取消订单 - 🏃 跑男实时位置追踪 - 💾 配置本地持久化存储 ## 运行环境选择 本 skill 同时提供 **Node.js** 和 **Python** 两种版本,可根据你的环境选择: | 环境 | 依赖安装 | 脚本位置 | |------|---------|---------| | Node.js | `npm install` | `scripts/*.js` 和 `index.js` | | Python | `pip install -r requirements.txt` | `uupt_delivery.py` | Agent 会自动检测可用环境并选择合适的版本执行。 ## 首次使用 **无需手动配置任何凭证。** 首次使用时,执行任何功能脚本会自动检测是否需要注册: - 如果输出中包含 `[REGISTRATION_REQUIRED]`,说明需要先完成手机号验证 - Agent 应自动进入**场景零(首次注册)**引导用户完成注册 - 注册完成后,openId 自动保存到本地配置文件,后续使用无需重复注册 高级用户也可手动设置环境变量 `UUPT_OPEN_ID` 跳过注册流程。 ## 触发条件 用户表达了以下意图之一: - 询问配送价格(如"从A地址送到B地址多少钱"、"帮我算下配送费") - 下单配送(如"帮我发个跑腿单"、"我要寄东西"、"同城配送") - 查询订单(如"查看订单状态"、"订单到哪了") - 取消订单(如"取消这个订单"、"不想发了") - 追踪跑男(如"骑手在哪"、"跑男到哪了"、"配送进度") - 包含"跑腿"、"配送"、"寄送"、"订单"、"骑手"、"跑男"等关键词 ## 场景判断 收到用户请求后,先判断属于哪个场景: - **场景零**:首次注册 — 任何功能执行时检测到 `[REGISTRATION_REQUIRED]`,自动引导手机号验证 - **场景一**:订单询价 - 用户想知道配送费用,需要提供起始地址和目的地址 - **场景二**:创建订单 - 用户确认发单,需要询价返回的 priceToken 和收件人电话 - **场景三**:查询订单详情 - 用户想查看订单状态,需要订单编号 - **场景四**:取消订单 - 用户要取消订单,需要订单编号 - **场景五**:跑男追踪 - 用户想查看跑男实时位置,需要订单编号 --- ## 场景零:首次注册 / 获取授权 当执行任何功能脚本时,如果输出中包含 `[REGISTRATION_REQUIRED]`,说明用户尚未完成注册授权,需要通过手机号短信验证获取 openId。 ### 触发条件 - 执行任何脚本时输出包含 `[REGISTRATION_REQUIRED]` - 这是一个**自动触发**场景,不需要用户主动发起 ### 执行步骤 **Step 1: 询问手机号** 向用户询问:「首次使用需要验证手机号,请输入您的手机号码」 **Step 2: 发送短信验证码** **Node.js 版本:** ```bash node scripts/register.js --mobile="用户手机号" ``` **Python 版本:** ```bash python uupt_delivery.py register --mobile="用户手机号" ``` 处理结果: - 输出 `[SMS_SENT]` → 验证码发送成功,提示用户查看手机短信,进入 Step 3 - 输出 `[IMAGE_CAPTCHA_REQUIRED]` → 需要图片验证码,处理方式: - 输出中包含 `IMAGE_DATA=data:image/png;base64,...` 的 base64 图片数据 - 将 base64 图片展示给用户(可使用 show_widget 工具展示 `<img src="IMAGE_DATA中的内容">`) - 请用户识别图片中的数字 - 用户回复后,重新调用(带 `--imageCode` 参数): ```bash node scripts/register.js --mobile="手机号" --imageCode="用户输入的数字" ``` **Step 3: 输入短信验证码** 提示用户:「验证码已发送,请输入您收到的短信验证码」 **Step 4: 完成授权** **Node.js 版本:** ```bash node scripts/register.js --mobile="手机号" --smsCode="用户输入的验证码" ``` **Python 版本:** ```bash python uupt_delivery.py register --mobile="手机号" --sms-code="用户输入的验证码" ``` 处理结果: - 输出 `[REGISTRATION_SUCCESS]` → 注册成功,openId 已自动保存到配置文件 - 告知用户注册成功 - **立即继续执行用户最初要求的功能**(无需用户再次操作) - 输出 `[REGISTRATION_FAILED]` → 注册失败 - **不需要重新询问手机号** - 从 Step 2 开始重试(重新发送验证码 → 用户输入新验证码 → 重新授权) - 最多重试 3 次 - 3 次仍失败 → 告知用户稍后再试或联系客服 ### 回复模板(注册成功后) ``` 注册成功!您的账号已激活。 现在为您继续执行之前的操作... ``` --- ## 场景一:订单询价 计算从起始地址到目的地址的配送费用。用户可以只询价不发单。 ### 执行步骤 1. **执行询价脚本**:从用户输入中提取起始地址、目的地址、城市(可选) 2. **如果输出 `[REGISTRATION_REQUIRED]`**:进入场景零完成注册后,重新执行询价 ### 使用方法 **Node.js 版本:** ```bash node scripts/order-price.js --fromAddress="郑州市金水区农业路经三路交叉口" --toAddress="郑州市二七区德化街100号" --cityName="郑州市" ``` **Python 版本:** ```bash python uupt_delivery.py price --from-address="郑州市金水区农业路经三路交叉口" --to-address="郑州市二七区德化街100号" --city="郑州市" ``` ### 参数说明 | 参数 (JS) | 参数 (Python) | 说明 | 必填 | |-----------|--------------|------|------| | `--fromAddress` | `--from-address` | 起始地址(完整地址) | 是 | | `--toAddress` | `--to-address` | 目的地址(完整地址) | 是 | | `--cityName` | `--city` | 城市名称(需要带"市"字) | 否 | ### 返回结果 返回包含 `priceToken` 和价格信息,价格单位为分,需要格式化为元展示给用户。 ### 回复模板 ``` 💰 配送费用查询结果: 起点:{fromAddress} 终点:{toAddress} 预估费用:{price/100} 元 📝 如需下单,请提供收件人电话。 ``` --- ## 场景二:创建订单(发单) 当用户明确表示要发单/下单时,**询价后直接创建订单**,无需二次确认。 ### 触发条件 用户表达了发单意图,如: - "帮我发个单"、"我要寄东西"、"帮我下单" - "从A送到B,收件人电话xxx" - "帮我配送xxx到xxx" ### 执行步骤 1. **获取必要信息**:起始地址、目的地址、收件人电话(必须在发单前获取) 2. **调用询价接口**:获取 priceToken 3. **立即创建订单**:使用 priceToken 直接创建订单,**不询问用户是否确认** 4. **处理返回结果**:根据余额情况进行不同处理 ### 使用方法 **Step 1: 先询价获取 priceToken** **Node.js 版本:** ```bash node scripts/order-price.js --fromAddress="起始地址" --toAddress="目的地址" ``` **Python 版本:** ```bash python uupt_delivery.py price --from-address="起始地址" --to-address="目的地址" ``` **Step 2: 立即创建订单** **Node.js 版本:** ```bash node scripts/create-order.js --priceToken="xxx" --receiverPhone="13800138000" ``` **Python 版本:** ```bash python uupt_delivery.py create --price-token="xxx" --receiver-phone="13800138000" ``` ### 参数说明 | 参数 (JS) | 参数 (Python) | 说明 | 必填 | |-----------|--------------|------|------| | `--priceToken` | `--price-token` | 询价接口返回的 token | 是 | | `--receiverPhone` | `--receiver-phone` | 收件人手机号 | 是 | ### 返回结果处理 **情况一:余额充足,订单创建成功** 直接返回订单编号,告知用户订单已创建成功。 **回复模板:** ``` 订单创建成功! 订单编号:{order_code} 配送费用:{price/100} 元 骑手正在接单中,请保持电话畅通。 ``` --- **情况二:余额不足,需要微信支付** 当返回的 JSON 中 `data.orderUrl` 不为空且以 `weixin://` 开头时,表示需要微信扫码支付。 **识别标记**:脚本输出包含 `[PAYMENT_REQUIRED]` 和 `[WECHAT_PAY_QRCODE]` 时表示需要微信支付。 **关键输出**: - `QRCODE_FILE=/tmp/wechat_pay_xxx.png` — 本地二维码图片文件路径 - `QRCODE_URL=https://api.qrserver.com/v1/create-qr-code/?...` — 在线二维码链接(兆底方案) **处理流程:** 1. **展示支付二维码给用户**: 从脚本输出中提取: - `QRCODE_FILE=` 后的本地文件路径 - `QRCODE_URL=` 后的在线链接 **回复模板(同时提供两种方式)**: ``` 账户余额不足,需要完成微信支付 订单编号:{order_code} 配送费用:XX.XX 元 请使用微信扫描二维码完成支付: [微信支付二维码]({QRCODE_FILE}) 📱 如果二维码未显示,请在手机上点击此链接查看: {QRCODE_URL} 支付完成后请回来告诉我。 ``` **重要说明**: - 使用 Markdown 图片语法引用本地文件:`[微信支付二维码]({QRCODE_FILE})` - **必须同时提供在线链接作为兆底方案**,用户可在手机上点击链接查看二维码图片 - `{QRCODE_URL}` 格式如:`https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=weixin://wxpay/bizpayurl?pr=xxx` 2. **等待用户返回**:用户支付后会回来 3. **确认支付状态**:当用户回来时,询问用户是否已完成支付: ``` 您好,请问是否已完成支付? - 是,已支付完成 - 否,还未支付 ``` 4. **用户确认支付完成后**:立即调用订单详情接口查询订单状态 **Node.js 版本:** ```bash node scripts/order-detail.js --orderCode="{order_code}" ``` **Python 版本:** ```bash python uupt_delivery.py detail --order-code="{order_code}" ``` 5. **展示订单详情**: ``` 支付成功!订单详情如下: 订单编号:{order_code} 订单状态:{status} 起点:{from_address} 终点:{to_address} 配送费:{price/100} 元 骑手正在接单中,请保持电话畅通。 ``` ### 完整交互流程示例 ``` 用户:帮我从金水区农业路送到二七区德化街,收件人电话 13800138000 Agent: 1. 执行询价 → 获取 priceToken 2. 立即执行创建订单(不询问确认) 3. 如果余额充足 → 返回成功信息 4. 如果余额不足 → 输出支付链接 --- 用户去支付 --- 用户:我支付完了 Agent: 1. 询问确认:请问是否已完成支付? 2. 用户确认后 → 查询订单详情 3. 展示订单状态 ``` --- ## 场景三:查询订单详情 查看订单的当前状态和详细信息。 ### 执行步骤 1. **获取订单编号**:从用户输入或上下文中获取订单编号 2. **调用查询接口** ### 使用方法 **Node.js 版本:** ```bash node scripts/order-detail.js --orderCode="UU123456789" ``` **Python 版本:** ```bash python uupt_delivery.py detail --order-code="UU123456789" ``` ### 参数说明 | 参数 (JS) | 参数 (Python) | 说明 | 必填 | |-----------|--------------|------|------| | `--orderCode` | `--order-code` | 订单编号 | 是 | ### 回复模板 ``` 📋 订单详情: 订单编号:{order_code} 订单状态:{status} 起点:{from_address} 终点:{to_address} 配送费:{price/100} 元 骑手信息:{driver_name} {driver_phone} ``` --- ## 场景四:取消订单 取消未完成的配送订单。 ### 执行步骤 1. **获取订单编号**:从用户输入获取 2. **确认取消原因**:询问用户取消原因(可选) 3. **调用取消接口** ### 使用方法 **Node.js 版本:** ```bash node scripts/cancel-order.js --orderCode="UU123456789" --reason="用户改变主意" ``` **Python 版本:** ```bash python uupt_delivery.py cancel --order-code="UU123456789" --reason="用户改变主意" ``` ### 参数说明 | 参数 (JS) | 参数 (Python) | 说明 | 必填 | |-----------|--------------|------|------| | `--orderCode` | `--order-code` | 订单编号 | 是 | | `--reason` | `--reason` | 取消原因 | 否 | ### 回复模板 ``` 订单已取消 订单编号:{order_code} 取消原因:{reason} 如需重新下单,请告诉我配送地址。 ``` --- ## 场景五:跑男实时追踪 查询配送骑手的实时位置和状态。 ### 执行步骤 1. **获取订单编号**:从用户输入获取 2. **调用跑男追踪接口** ### 使用方法 **Node.js 版本:** ```bash node scripts/driver-track.js --orderCode="UU123456789" ``` **Python 版本:** ```bash python uupt_delivery.py track --order-code="UU123456789" ``` ### 参数说明 | 参数 (JS) | 参数 (Python) | 说明 | 必填 |
View on GitHub
This SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub