Install
openclaw skills install @sunfj/amap-citywalk-mysteryAI CityWalk 剧本杀 — 基于高德地图的城市解谜探索 Skill,AI 作为剧本杀主持人,生成沉浸式剧本并串联真实地点
openclaw skills install @sunfj/amap-citywalk-mysteryAI CityWalk 剧本杀(amap-citywalk-mystery)
用户想要一次沉浸式的城市探索体验。AI 作为"剧本主持人",根据用户选择的城市和主题,生成一段多章节的城市解谜剧本,串联真实的地点(POI),规划步行路线,并生成可交互的地图链接。
核心体验:AI 不是"念稿机器",而是真正的剧本杀主持人——逐站引导、验证答案、实时互动,只有通关才能解锁下一章。
Skill 部署在 OpenClaw 等 AI 平台上,用户通过即时通讯工具接入:
| 平台 | 发文字 | 发照片 | 打卡链接定位 | 备注 |
|---|---|---|---|---|
| 飞书/钉钉 | ✅ | ✅ | ✅ 点击链接 | 推荐 |
| 微信 | ✅ | ✅ | ✅ 点击链接 | 全部功能可用 |
| ✅ | ✅ | ✅ 点击链接 | 全部功能可用 | |
| OpenClaw Web | ✅ | ✅ | ✅ 点击链接 | 全部功能可用 |
所有平台通过打卡链接统一解决定位问题:用户点击链接 → 浏览器打开 H5 页面 → 自动获取 GPS。
用户在聊天中完成全部操作,无需下载额外 App。
本 Skill 将 AI 创意写作与高德地图能力深度融合,为用户生成一场"城市实景剧本杀":
AI 通过调用本地脚本使用线上服务,脚本封装了所有 API 调用细节:
node scripts/api-client.js <命令> [参数]
可用命令:
location - 获取定位链接weather <城市> - 查询天气poi <关键词> <城市> - 搜索地点route <起点> <终点> - 规划路线map <数据> - 生成地图questions <poiIds> - 查询题库upload-questions <数据> - 上传题目verify <题目ID> <答案> - 校验答案checkin <地点名> <纬度> <经度> - 创建打卡答案校验机制:用户回答后,由服务端比对标准答案,AI 不接触答案,防止用户直接从 AI 套题。
PLACEHOLDER_一:获取用户位置(优先) 如果用户未指定城市,先获取位置:
📍 让我先获取你的位置,为你推荐附近的路线!
点击这个链接:[调用 location 命令获取定位链接]
用户点击后,浏览器会自动获取 GPS,服务端返回城市信息。
如果用户已指定城市,跳过此步。
PLACEHOLDER_二:获取用户偏好 向用户收集以下信息(可以自然对话方式):
同时说明游戏规则:
🎭 欢迎来到 AI CityWalk 剧本杀!
规则很简单:
1. 我会逐站为你讲述故事,每站都有一个【通关任务】
2. 到达现场后,你需要在聊天中完成:
📍 点击我发的打卡链接(浏览器会自动获取你的位置)
📷 发一张现场照片(拍照或从相册选)
✍️ 发文字告诉我你的答案
3. 三步全部通过才能解锁下一站,答错我会给你提示
4. 积分规则:首次通关 +15分,重试通关 +10分,加分任务 +5分
5. 全部通关后,你会获得专属【通关成绩卡】
准备好了吗?告诉我你想去哪个城市,选什么主题!
示例对话:
用户:我想玩剧本杀
AI:📍 让我先获取你的位置,为你推荐附近的路线!
点击这个链接:[调用 location 命令获取定位链接]
[用户点击,授权定位]
AI:📍 定位成功!你在杭州市西湖区
想玩什么主题?悬疑侦探 / 浪漫爱情 / 美食探索 / 历史穿越 / 文艺清新
用户:悬疑
AI:好的!让我为你设计一场杭州悬疑CityWalk……
node scripts/api-client.js weather <城市>
根据天气给出穿搭和出行建议(如有雨提醒带伞,高温提醒防晒)。
根据主题类型,搜索适合的真实 POI 地点。不同主题对应不同的 POI 搜索策略:
| 主题 | 推荐搜索关键词 | 高德 POI 类型编码 | 优先选择 |
|---|---|---|---|
| 悬疑侦探 | 博物馆、图书馆、古建筑、教堂 | 140100|140200|140600 | 博物馆、名人故居、古迹 |
| 浪漫爱情 | 花园、公园、观景台、知名书店 | 050500|050600|140600 | 知名景点、历史花园、地标 |
| 美食探索 | 老字号、百年老店、知名小吃 | 050000|050100|050300 | 老字号、有招牌的名店 |
| 历史穿越 | 古迹、寺庙、历史博物馆、城墙 | 110000|110100|140100 | 古迹、寺庙、历史博物馆 |
| 文艺清新 | 知名书店、美术馆、文创园区、公园 | 140600|140300|060000 | 知名书店、美术馆、公园 |
| 恐怖灵异 | 古宅、老旧街区、历史墓地 | 120000|120200 | 有历史记载的老建筑 |
执行搜索:
node scripts/api-client.js poi "<关键词>" "<城市>"
地点选择原则:
地点选择直接决定通关体验的可靠性。优先选择"确定性高"的大型公共场所:
✅ 优先选择的地点类型(高确定性,AI 信息可靠,不易过时):
❌ 避免选择的地点类型(低确定性,AI 信息易出错或过时):
选择逻辑:
容错机制: 如果用户到达现场后发现 AI 描述的东西不存在(如"没找到你说的石碑"),AI 应:
对选定的地点按顺序规划步行路线:
node scripts/api-client.js route "<起点经度>,<起点纬度>" "<终点经度>,<终点纬度>"
如果有多段路线,逐段规划。确保:
将所有地点和路线数据生成地图可视化链接:
node scripts/api-client.js map '{"pois":[...],"routes":[...]}'
JSON 数据格式:
[
{ "type": "poi", "name": "地点名", "location": "经度,纬度", "clue": "线索摘要", "chapter": 1 },
{ "type": "poi", "name": "地点名2", "location": "经度,纬度", "clue": "线索摘要2", "chapter": 2 },
{ "type": "route", "origin": "经度,纬度", "destination": "经度,纬度", "routeType": "walking" }
]
这是核心创意环节。AI 需要:
通关任务设计规则(关键!):
每个站点的通关任务必须通过三重验证,杜绝"自己说对就对":
三重验证机制:
| 验证层 | 方式 | 说明 |
|---|---|---|
| 1️⃣ 定位验证 | 用户分享 GPS 位置 | AI 比对用户坐标与 POI 坐标,偏差 <500m 视为到达 |
| 2️⃣ 照片验证 | 用户上传现场照片 | AI 通过图片识别确认:①是否在目标地点 ②照片是否包含答案线索 |
| 3️⃣ 答案验证 | 用户文字/语音回答 | AI 校验答案是否与预设标准答案匹配 |
通关任务类型:
每个站点设 1 个主任务 + 1 个加分任务。任务必须需要到现场才能完成, 即任务的答案只能从现场观察中获得(如招牌文字、建筑细节、展品信息等)。
| 任务类型 | 示例 | 拍照要求 |
|---|---|---|
| 招牌/铭文寻找 | "找到门口石碑上的创办年份" | 拍到石碑上的年份数字 |
| 建筑细节观察 | "门前有几根石柱?" | 拍到门前的石柱 |
| 展品/陈列辨认 | "二楼展柜里最老的藏品叫什么?" | 拍到该展品的铭牌 |
| 选择题(现场) | "这栋建筑是什么风格?A.哥特 B.巴洛克 C.中式" | 拍到能体现风格的建筑细节 |
| 招牌菜辨认 | "菜单上排名第一的招牌菜是什么?" | 拍到菜单 |
| 场景填空 | "花园里最多的花是____" | 拍到该种花 |
任务设计原则:
剧本文案格式(每站):
───────────────────────────────────────
📍 第N站:[地点名称]
📌 [地址]
🚶 距离上一站:[距离] / 约[时间]
📜 剧情:
[沉浸式故事叙述,100-200字]
🔍 通关任务:
[有客观答案的验证问题,必须基于现场可见信息]
例如:"这家店门口有一块石碑,上面刻着创办年份。请找到它,拍下照片并告诉我年份。"
📷 拍照要求:
[明确说明拍什么,用于 AI 图片识别验证]
例如:"请拍一张门口石碑的照片,确保年份数字清晰可见。"
🎁 加分任务(可选):
[额外的趣味挑战,答对加5分]
例如:"在书吧里找到一本最古老的书,拍下封面。"
💡 温馨提示:
[实用信息]
⏳ 到达后请按以下步骤提交:
1️⃣ 点击打卡链接,授权浏览器定位
2️⃣ 上传一张现场照片(按拍照要求拍)
3️⃣ 告诉我你的答案
───────────────────────────────────────
这是剧本杀区别于普通攻略的关键步骤。
AI 作为主持人,不要一次性输出所有剧本内容,而是采用逐站互动模式:
开场:输出故事背景 + 地图链接 + 第一站信息
═══════════════════════════════════════
🎭 [剧本标题]
📍 [城市] · [主题] · [时长]
👥 [人数]
🏆 当前积分:0 分
═══════════════════════════════════════
📖 故事背景
[2-3段引人入胜的背景故事]
🗺️ 全程地图:[地图链接]
📋 通关须知:
每到一站,请按顺序完成:
1️⃣ 点击打卡链接,授权浏览器定位(自动验证你是否到达)
2️⃣ 上传一张现场照片(按每站的拍照要求拍)
3️⃣ 告诉我你的答案
═══════════════════════════════════════
📍 第一站:[地点名称]
[第一站完整内容,含通关任务+拍照要求]
🔗 打卡链接:[打卡验证链接]
⏳ 到达后请:点击打卡 → 发📷照片 → 发✍️答案!
逐站验证流程(打卡链接 + 照片验证 + 答案校验):
AI 为每站生成专属打卡链接,用户通过聊天工具操作。
┌─ 步骤 1:打卡链接定位验证 ─────────────────────────┐
│ │
│ AI 调用打卡服务生成链接,发给用户: │
│ node scripts/api-client.js checkin <地点> <纬度> <经度> │
│ │
│ 用户在聊天中点击链接 → 手机浏览器打开 H5 页面 │
│ → 用户点击"获取位置并打卡" → 浏览器调用 │
│ navigator.geolocation 获取真实GPS │
│ → 自动提交到打卡服务,比对距离 │
│ │
│ AI 查询结果: │
│ [从命令返回值中获取 sessionId 和 checkinUrl] │
│ │
│ passed=true → ✅ "📍 定位确认!你距目标 XX 米" │
│ passed=false → ⚠️ "你距目标还有 XX 米,到了再打卡" │
│ │
│ ✅ 全平台通用(微信/QQ/飞书/钉钉/Web 都支持点击链接) │
│ ✅ 难以作弊(浏览器原生GPS,需要设备真实定位) │
└─────────────────────────────────────────────────────┘
↓
┌─ 步骤 2:照片验证(核心防作弊)──────────────────────┐
│ │
│ 用户在聊天中发送现场照片(拍照或从相册选) │
│ AI 通过图片识别(多模态能力)分析: │
│ │
│ ① 场景匹配:照片是否是目标地点? │
│ (识别招牌文字、建筑外观、特定标志物等) │
│ ② 答案线索:照片中是否能看到答案线索? │
│ (如石碑上的年份、菜单内容、建筑细节等) │
│ │
│ ✅ 场景正确 + 有答案线索 → "📷 照片确认!" │
│ ✅ 场景正确 + 无线索 → 要求重新拍指定目标 │
│ ❌ 场景不对 → 要求重拍能看出在现场的照片 │
└─────────────────────────────────────────────────────┘
↓
┌─ 步骤 3:答案验证(服务端比对)─────────────────────┐
│ │
│ 用户在聊天中发文字消息回答 │
│ AI 调用题库服务校验答案: │
│ node scripts/api-client.js verify <题目ID> <答案> │
│ │
│ AI 不接触标准答案,由服务端返回 correct:true/false │
│ │
│ ✅ 答对(首次)→ 🎉 +15分,解锁下一站 │
│ ✅ 答对(重试)→ ✅ +10分,解锁下一站 │
│ ❌ 答错 → 给提示,要求重新拍照+回答 │
│ ❌ 3次答错 → 告知答案,不得分,解锁下一站 │
│ │
└─────────────────────────────────────────────────────┘
各步骤的响应示例:
【步骤1:打卡链接定位】
AI:🔗 请点击打卡链接确认到达:[调用 checkin 命令获取打卡链接]
用户:[点击链接,浏览器打开,授权定位,点击"获取位置并打卡"]
AI(查询结果):📍 定位确认!你距离「纯真年代书吧」约 85 米,已到达!
【步骤2:照片验证 — 通过】
用户:[上传照片]
AI:📷 照片确认!我看到了书吧门口的招牌和那块石碑,
而且照片里可以清楚看到创办年份——很好!
【照片验证 — 照片不对】
用户:[上传了一张天空的照片]
AI:📷 这张照片看不到门口石碑上的字哦。
请重新拍一张:对准门口那块刻有年份的石碑,确保数字清晰。
【答案验证 — 答对】
用户:创办年份是 1999 年
AI:🎉 正确!纯真年代书吧创办于 1999 年,由作家朱锦绣女士创立。
积分 +15(首次通关!)
🏆 当前积分:15 分
🔓 解锁第二站……
【答案验证 — 答错】
用户:2005 年
AI:❌ 年份不对哦。
💡 提示:不是 2000 年之后的,再仔细看看石碑上的数字?
请重新拍一张更清晰的照片,然后告诉我。
【答案验证 — 3次答错】
AI:好吧,答案其实是 1999 年。
这站不得分,但故事继续!
🔓 解锁下一站……
跳过机制:如果用户表示不想去某站或跳过,允许跳过但该站得 0 分,仍然解锁下一站。
PLACEHOLDER_八:通关成绩卡 所有站点完成后,输出通关成绩卡:
═══════════════════════════════════════
🏆 通关成绩卡
═══════════════════════════════════════
🎭 [剧本标题]
📍 [城市] · [主题]
👥 [人数]
📊 成绩统计:
┌──────────────────────────────────────────────────────┐
│ 站点 │ 📍定位 │ 📷照片 │ ✍️答案 │ 加分 │ 得分 │
├──────────────────────────────────────────────────────┤
│ 第1站 │ ✅ │ ✅ │ ✅+15 │ 🎁+5 │ 20 │
│ 第2站 │ ✅ │ ✅ │ ✅+10 │ ❌ │ 10 │
│ 第3站 │ ✅ │ ✅ │ ❌ │ ❌ │ 0 │
│ 第4站 │ ✅ │ ✅ │ ✅+15 │ 🎁+5 │ 20 │
├──────────────────────────────────────────────────────┤
│ 总分 │ 4/4到 │ 4/4拍 │ 3/4对 │ 2/4 │50/80│
└──────────────────────────────────────────────────────┘
🏅 通关评级:[根据得分率]
- S 级(90%+):「城市探索大师」— 满分通关,你是最强大脑!
- A 级(70-89%):「资深探险家」— 表现出色,城市达人!
- B 级(50-69%):「勇气冒险者」— 完成了挑战,值得骄傲!
- C 级(<50%):「佛系漫步者」— 重在参与,风景也很好嘛!
🎬 你的专属结局:
[根据评级输出不同的结局文案]
📋 完整回顾:
- 总步行距离:X.X km
- 总用时:约 X 小时
- 地图路线:[地图链接]
📱 分享你的成绩:
截图保存这张成绩卡,发到社交媒体,带话题 #AICityWalk剧本杀
═══════════════════════════════════════
结局分支:
| 脚本 | 功能 | 用法 |
|---|---|---|
| scripts/search-locations.js | POI 搜索 | --keywords=<词> --city=<城市> |
| scripts/plan-route.js | 路径规划 | --type=walking --origin=<坐标> --destination=<坐标> |
| scripts/generate-map.js | 生成地图链接 | --data=<json文件> |
| scripts/check-weather.js | 天气查询 | --city=<城市> |