travel-planner
智能旅行攻略规划师。根据用户提供的出行信息(人数、男女比例、关系、出发地、目的地、日期、天数), 直接调用高德地图 REST API 获取实时路线、POI、距离等数据,生成完整的个性化旅行攻略。 攻略包含:创意名称、出行方式建议(含当地租车判断)、分时段行程(早午晚三餐均有具体推荐)、 景点推荐(含高铁站→景点距离)、住宿推荐(1-2家性价比酒店)、出行物资清单、注意事项、费用汇总。 当用户说"帮我做旅行攻略"、"规划一下行程"、"出去玩怎么安排"等时触发。
Install via CLI (Recommended)
clawhub install openclaw/skills/skills/bifang988/travel-planner-amapTravel Planner — 智能旅行攻略规划师
直接调用高德地图 REST API 获取实时数据,无需 GUI 容器。
Step 0:检查 API Key
[ -n "$AMAP_KEY" ] && echo "AMAP_KEY: configured" || echo "AMAP_KEY: not set"
-
输出 configured → 配置成功,跳到 Step 1
-
输出 not set → 提示用户:
需要配置高德地图 API Key 才能获取实时数据:
- 前往 https://lbs.amap.com 注册并创建应用
- 添加 Key,平台选择「Web服务」(不是 JS API)
- 在高德控制台为该 Key 设置「IP 白名单」和「服务权限」(仅开启本技能需要的接口),限制 Key 的使用范围
- 在当前终端执行:
export AMAP_KEY=你的ApiKey
安全提示:不建议将 API Key 写入
~/.zshrc明文保存,建议每次使用前在终端临时 export,用完后关闭终端即失效。
Step 1:收集信息(生成攻略前必须完成)
如果用户未提供以下信息,一次性把缺少的问题打包问完,不要多轮反复追问:
必需信息:
- 出行人数、男女比例、同行关系(情侣 / 同性朋友 / 混合朋友 / 亲子家庭 / 其他)
- 出发地(具体城市或地址)
- 目的地(城市 / 景区 / 区域)
- 出行日期及天数
开场四问(收集到基本信息后,一条消息问完,不要分多次问):
还有四个小问题帮我规划得更好:
- 你希望行程紧凑一些(多逛景点)还是轻松一些(慢慢玩)?
- 这次大概的预算是多少(人均或总预算均可)?
- 有没有一定要去的景点,或者非吃不可的东西?
- 到了目的地打算自驾还是坐公共交通出行?
预算处理规则:若用户报的预算明显偏低,直接给出性价比最优方案,备注"这是最合适的方案了",不必纠结预算准确性。
Step 2:数据收集(调用高德 REST API)
所有用户输入(地址、城市名等文本)通过环境变量传入 Python,由 urllib.parse.urlencode 统一编码后发起 HTTP 请求,不经过 shell 拼接,避免命令注入风险。坐标由 API 返回(格式固定为 经度,纬度),可直接使用。
2.1 地理编码(获取坐标)
先获取出发地、目的地、目的地高铁站的坐标,后续所有 API 都依赖这些坐标:
# 出发地坐标
ADDR="{出发地}" python3 - << 'EOF'
import urllib.request, urllib.parse, json, os
params = urllib.parse.urlencode({'address': os.environ['ADDR'], 'key': os.environ['AMAP_KEY']})
with urllib.request.urlopen('https://restapi.amap.com/v3/geocode/geo?' + params) as r:
d = json.load(r)
g = d.get('geocodes', [])
print(g[0]['location'] if g else 'NOT_FOUND')
EOF
# 目的地坐标
ADDR="{目的地}" python3 - << 'EOF'
import urllib.request, urllib.parse, json, os
params = urllib.parse.urlencode({'address': os.environ['ADDR'], 'key': os.environ['AMAP_KEY']})
with urllib.request.urlopen('https://restapi.amap.com/v3/geocode/geo?' + params) as r:
d = json.load(r)
g = d.get('geocodes', [])
print(g[0]['location'] if g else 'NOT_FOUND')
EOF
# 目的地高铁站坐标
ADDR="{目的地}高铁站" python3 - << 'EOF'
import urllib.request, urllib.parse, json, os
params = urllib.parse.urlencode({'address': os.environ['ADDR'], 'key': os.environ['AMAP_KEY']})
with urllib.request.urlopen('https://restapi.amap.com/v3/geocode/geo?' + params) as r:
d = json.load(r)
g = d.get('geocodes', [])
print(g[0]['location'] if g else 'NOT_FOUND')
EOF
记录三组坐标(格式:经度,纬度),供后续步骤使用。
2.2 出发地→目的地路线
坐标为 API 返回值,格式固定(\d+\.\d+,\d+\.\d+),直接传参安全:
# 驾车路线
python3 - << 'EOF'
import urllib.request, urllib.parse, json, os
params = urllib.parse.urlencode({
'origin': '{出发地坐标}', 'destination': '{目的地坐标}', 'key': os.environ['AMAP_KEY']
})
with urllib.request.urlopen('https://restapi.amap.com/v3/direction/driving?' + params) as r:
d = json.load(r)
paths = d.get('route', {}).get('paths', [])
if paths:
p = paths[0]
print(f"驾车: {int(p['distance'])//1000}km / {int(p['duration'])//60}分钟 / 过路费¥{p.get('tolls',0)}")
EOF
Metadata
Not sure this is the right skill?
Describe what you want to build — we'll match you to the best skill from 16,000+ options.
Find the right skillPaste this into your clawhub.json to enable this plugin.
{
"plugins": {
"official-bifang988-travel-planner-amap": {
"enabled": true,
"auto_update": true
}
}
}Related Skills
lobster-rank
Scan locally installed OpenClaw skills, collect evidence data, submit to the lobster ranking server for scoring, and let the user confirm uploading their result to the public leaderboard. Use when the user asks to score, rate, evaluate, rank, or certify their lobster / AI agent capability set, or wants to upload their score to the leaderboard.
boss-greeting
BOSS直聘打招呼语生成器。调用 boss-cli 获取目标职位详情,分析岗位核心要求, 再对照用户简历找出最匹配的经历,生成一段不超过200字的个性化打招呼语。 当用户说"帮我写打招呼语"、"投这个岗位怎么打招呼"、"生成boss打招呼"等时触发。