Install
openclaw skills install @linex5709/travel-itinerary-builder旅行行程规划总入口。当用户提出多日旅行规划、制作旅行手册、定制亲子/家庭出游行程、 或任何涉及 "旅行计划" "行程安排" "出游攻略" "旅游攻略" "day trip" "itinerary" 等请求时触发。产出格式为自包含 HTML(零外部 CDN 依赖),包含每日时间线、 景点卡片(图片/交通/流程/贴士)、能量趋势图、后勤工具箱。内容深度对标首尔 6 日 亲子游手册——每个景点都有时间预估、交通指引、why/how/tips 三层信息结构。 自动适配航班时刻、当地天气、儿童年龄。
openclaw skills install @linex5709/travel-itinerary-builder当用户请求涉及以下任一场景时,加载此 skill:
始终生成自包含的 HTML 单文件,零外部 CDN 依赖。使用 assets/template.html 作为 CSS 和 JS 架构模板。
'PingFang SC','Microsoft YaHei','Hiragino Sans GB',system-ui,-apple-system,sans-serifrenderChart() 的实现)header (sticky, logo + 标题 + 日期 + 标签)
├── overview-card (能量趋势 CSS 条形图 + 关键统计)
├── day-nav (日期切换按钮)
├── #day-content (动态渲染区域)
│ ├── day-intro (日期badge + 航班badge + 标题 + 描述 + 时间线)
│ └── spots-list
│ └── spot-card × N
│ ├── spot-img-wrap (景点大图 + 浮层名称)
│ └── spot-body
│ ├── time-badge (建议游玩时长)
│ ├── transport-box (交通指引)
│ ├── spot-reason (Why It's an Adventure?)
│ ├── spot-how (编号步骤)
│ └── tips-box (Expert Tips)
├── logistics (住宿建议 / 地图App / 必备装备)
└── footer
| 字段 | 说明 | 示例 |
|---|---|---|
name | 景点全称(双语) | "HiKR Ground (好客空间)" |
img | 图片路径(本地优先) | seoul_images/compressed/hikr_ground.jpg |
timeSlot | 建议时间窗口 + 游玩时长 | "16:00 — 18:00(建议游玩 2 小时)" |
transport | 交通方式、线路、耗时 | "从明洞步行约 10 分钟即达" |
reason | 为什么值得去(3-5句) | 从体验独特性、孩子适配度、体力消耗角度说明 |
how | 编号步骤 4-5 步 | 每步写明具体做什么、区域/楼层、时间分配 |
tips | 实用贴士 | 价格、预约、穿着、最佳时段、备选方案 |
{
title: "简洁有力的日主题(8-15字)",
date: "X月X日(周X)",
flightNote: "✈️ 航班信息(仅首尾日)",
timeline: "08:00 → 09:00 ... → 20:00 返回(全天时间节点)",
description: "当日概述(3-5句):主题定位 + 体力节奏 + 关键衔接逻辑",
spots: [ /* 2-3 个景点卡片 */ ]
}
在编写每段行程时,必须逐项确认:
今日是[主题定位]。上午[活动A],下午[活动B]。[衔接逻辑描述]。
[体力消耗预估]。[特别提醒——天气/人流/时间]。
onerror 回调渲染 SVG 占位图(灰底+景点名称)使用纯 CSS 条形图(参照模板 renderChart()),显示每日:
数值判断参考:
| 情景 | 体能 | 趣味 |
|---|---|---|
| 全室内轻松日(如 KidZania) | 40-50 | 90-100 |
| 水上运动日 | 85-95 | 85-90 |
| 半天室内+半天室外 | 65-75 | 80-90 |
| 半日到达首日 | 35-45 | 60-70 |
| 半日离开末日 | 45-50 | 75-85 |
assets/template.html — 完整的首尔 6 日游 HTML 模板,包含所有 CSS 变量、JS 渲染逻辑和响应式布局。每次生成新行程时:
itinerary 对象中的每日数据chartData 中的能量值当需要从 Wikipedia 获取景点图片时,使用以下模式(每次请求间隔 ≥3 秒):
import requests, time
from PIL import Image
HEADERS = {'User-Agent': 'TravelItineraryBot/1.0'}
BASE = 'https://en.wikipedia.org/api/rest_v1/page/summary/'
def get_image(title):
resp = requests.get(BASE + title, headers=HEADERS, timeout=15)
if resp.status_code == 200:
data = resp.json()
return data.get('originalimage', {}).get('source')
return None
def compress(input_path, output_path, max_width=1600, quality=80):
img = Image.open(input_path)
if img.width > max_width:
ratio = max_width / img.width
img = img.resize((max_width, int(img.height * ratio)), Image.LANCZOS)
img.save(output_path, quality=quality, optimize=True)
按上述模式下载后立即压缩,再用于 HTML/PDF 生成。