ClawKit Logo
ClawKitReliability Toolkit
Back to Registry
Official Verified

travel-planner

智能旅行攻略规划师。根据用户提供的出行信息(人数、男女比例、关系、出发地、目的地、日期、天数), 直接调用高德地图 REST API 获取实时路线、POI、距离等数据,生成完整的个性化旅行攻略。 攻略包含:创意名称、出行方式建议(含当地租车判断)、分时段行程(早午晚三餐均有具体推荐)、 景点推荐(含高铁站→景点距离)、住宿推荐(1-2家性价比酒店)、出行物资清单、注意事项、费用汇总。 当用户说"帮我做旅行攻略"、"规划一下行程"、"出去玩怎么安排"等时触发。

skill-install — Terminal

Install via CLI (Recommended)

clawhub install openclaw/skills/skills/bifang988/travel-planner-amap
Or

Travel 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 才能获取实时数据:

    1. 前往 https://lbs.amap.com 注册并创建应用
    2. 添加 Key,平台选择「Web服务」(不是 JS API)
    3. 在高德控制台为该 Key 设置「IP 白名单」和「服务权限」(仅开启本技能需要的接口),限制 Key 的使用范围
    4. 在当前终端执行:export AMAP_KEY=你的ApiKey

    安全提示:不建议将 API Key 写入 ~/.zshrc 明文保存,建议每次使用前在终端临时 export,用完后关闭终端即失效。


Step 1:收集信息(生成攻略前必须完成)

如果用户未提供以下信息,一次性把缺少的问题打包问完,不要多轮反复追问:

必需信息:

  • 出行人数、男女比例、同行关系(情侣 / 同性朋友 / 混合朋友 / 亲子家庭 / 其他)
  • 出发地(具体城市或地址)
  • 目的地(城市 / 景区 / 区域)
  • 出行日期及天数

开场四问(收集到基本信息后,一条消息问完,不要分多次问):

还有四个小问题帮我规划得更好:

  1. 你希望行程紧凑一些(多逛景点)还是轻松一些(慢慢玩)?
  2. 这次大概的预算是多少(人均或总预算均可)?
  3. 有没有一定要去的景点,或者非吃不可的东西?
  4. 到了目的地打算自驾还是坐公共交通出行?

预算处理规则:若用户报的预算明显偏低,直接给出性价比最优方案,备注"这是最合适的方案了",不必纠结预算准确性。


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

Author@bifang988
Stars4473
Views0
Updated2026-05-01
View Author Profile
AI Skill Finder

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 skill
Add to Configuration

Paste this into your clawhub.json to enable this plugin.

{
  "plugins": {
    "official-bifang988-travel-planner-amap": {
      "enabled": true,
      "auto_update": true
    }
  }
}
Safety NoteClawKit audits metadata but not runtime behavior. Use with caution.