🐷 干饭雷达 —— 美食店铺自动收集与归档
核心流程
收到用户发送的链接后,按以下步骤执行:
Step 1: 抓取网页内容
使用 curl 抓取链接内容,提取可读文本:
# 抖音短链需要 -L 跟随重定向
curl -s -L -A "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1" "<URL>"
平台适配要点:
- 抖音:短链(v.douyin.com)需 -L 跟随重定向;HTML 中搜索 videoInfoRes 或 item_list JSON 块提取 desc、digg_count 等
- 小红书:搜索 note 或 noteData JSON 块
- B站:搜索 videoData 或 __INITIAL_STATE__
- 大众点评/美团:直接解析 HTML 结构
- 微博:搜索 $render_data 或 status JSON 块
提取后判断内容是否与美食相关(包含餐厅名、菜品名、美食标签等)。若非美食内容,告知用户"该链接不是美食相关内容"并停止。
Step 2: 提取店铺信息
从抓取到的内容中识别并提取以下信息:
| 字段 | 说明 | 必填 |
|---|---|---|
| 店名 | 店铺全名 | ✅ |
| 简介 | 一句话描述(≤60字),让人一眼知道吃什么 | ✅ |
| 推荐菜 | 博主提到/推荐的菜品列表 | ✅ |
| 博主评价 | 博主的原话评价或总结 | 可选 |
| 人均消费 | 人均价格 | 可选 |
| 来源 | 原始链接 + 博主名称 | ✅ |
| 原始链接 | 用户发送的完整原始 URL,方便日后点击回味视频/帖子 | ✅ |
提取规则:
- 视频描述中的店名通常在标题或 #标签 中
- 如果视频提到多家店,逐一提取每家店的信息
- 简介字段:核心目标是让人一眼知道吃什么,不超过60字
- 如果 HTML 中无法提取到具体店铺信息(如视频内容在画面/语音中),使用 web_search 搜索 "博主名" "视频标题关键词" 店名 来补充
Step 3: 搜索位置信息
对每家店铺,通过 web_search 搜索精确位置:
搜索词:"{店名}" "{城市}" 地址
需要确定:
- 城市(如:成都、兰州、北京)
- 行政区(如:锦江区、武侯区、城关区)
- 详细地址(如:春熙路XX号)
- 经纬度(可选,如果搜索结果中有)
位置搜索策略:
1. 优先从原始内容中识别城市信息(标题标签、视频描述)
2. 搜索 "店名" 地址 获取详细位置
3. 如果搜索不到精确地址,至少确定到城市+行政区级别
4. 对于连锁店,优先记录视频中提到的具体门店
Step 4: 写入美食地图文件
文件路径: 与本 Skill 同级目录,即 /data/workspace/.agent/skills/food-collector/food-map.md
若文件不存在,创建新文件并写入头部模板(见下方格式)。
若文件已存在,读取现有内容,将新店铺插入到对应的城市→行政区分类下。
归档规则:
1. 一级标题:城市名(如 ## 🏙️ 成都)
2. 二级标题:行政区名(如 ### 📍 锦江区)
3. 同一城市的店铺归到同一个城市标题下
4. 同一行政区的店铺归到同一个行政区标题下
5. 新增城市/行政区时,按拼音排序插入
6. 每家店铺用统一的卡片格式记录
去重规则: 写入前检查文件中是否已存在同名店铺(同城市+同店名),若已存在则提示用户并跳过(或询问是否更新)。
文件格式模板
# 🗺️ 我的美食地图
> 自动收集自各平台美食视频/帖子,按城市和行政区归档
> 最后更新:YYYY-MM-DD HH:MM
---
## 🏙️ {城市名}
### 📍 {行政区名}
#### 🍽️ {店名}
- **简介**:{一句话简介,≤60字}
- **推荐菜**:{菜品1}、{菜品2}、{菜品3}
- **人均**:{人均消费}
- **地址**:{详细地址}
- **博主评价**:{博主原话评价}
- **来源**:[{博主名} - {平台}]({原始链接}) | 收录于 {YYYY-MM-DD}
- **🔗 原始链接**:{原始视频/帖子完整URL}(点击回味)
---
Step 5: 确认与反馈
写入完成后,向用户输出摘要:
✅ 已收录 {N} 家店铺到美食地图:
📍 {城市} - {行政区}
🍽️ {店名1}:{简介}
🍽️ {店名2}:{简介}
📄 文件位置:/data/workspace/.agent/skills/food-collector/food-map.md
特殊处理
无法提取具体店铺时
如果网页内容是视频类(抖音/B站等),且 HTML 中只有标题和标签没有具体店名:
1. 先用 web_search 搜索 "{博主名}" "{视频标题}" 店名 推荐
2. 如果仍然无法确定,告知用户:"该视频的店铺信息在画面/语音中,我无法直接提取。请告诉我视频中提到了哪些店铺,我来帮你查找位置并记录。"
多家店铺批量处理
如果一个视频/帖子包含多家店铺(如"成都5大苍蝇馆子"),逐一处理每家店铺,分别搜索位置信息,全部写入同一次归档操作中。
已有美食地图文件的合并
读取现有文件时,解析已有的城市和行政区结构,新店铺插入到正确位置,保持文件整体结构不变。
城市查询与觅食路线推荐
当用户提到自己在某个城市(如"我在成都"、"我到兰州了"、"我现在在北京"),按以下步骤执行:
Step A: 识别城市
从用户消息中提取城市名称。支持的表达方式:
- "我在{城市}"、"我到{城市}了"、"我现在在{城市}"
- "我来{城市}了"、"{城市}有什么好吃的吗"
- "帮我看看{城市}的美食地图"
Step B: 读取美食地图
读取 /data/workspace/.agent/skills/food-collector/food-map.md,找到对应城市(## 🏙️ {城市名})下的所有店铺。
- 如果该城市不存在,告知用户:"你的美食地图中还没有{城市}的店铺记录哦,发我探店视频链接我来帮你收集!"
- 如果文件不存在,告知用户:"你的美食地图还是空的,快发我美食视频链接开始收集吧!"
Step C: 列出所有店铺
按行政区分组,输出该城市所有已收录店铺的摘要:
🏙️ {城市} 美食地图(共 {N} 家店)
📍 {行政区1}
🍽️ {店名1} — {简介} | 人均{XX}元
🍽️ {店名2} — {简介} | 人均{XX}元
📍 {行政区2}
🍽️ {店名3} — {简介} | 人均{XX}元
Step D: 推荐觅食路线
根据店铺的地理位置(行政区 + 详细地址),规划一条合理的觅食路线:
- 就近原则:同一行政区的店铺安排在一起吃
- 时间分配:按 早餐→午餐→下午茶→晚餐→宵夜 的时间线安排
- 路线优化:尽量减少跨区奔波,相邻行政区串联
- 用餐节奏:每餐之间留出消化和移动时间
输出格式:
🗺️ 推荐觅食路线
🌅 早餐
→ {店名}({行政区}):{推荐菜}
🌞 午餐
→ {店名}({行政区}):{推荐菜}
🍵 下午茶
→ {店名}({行政区}):{推荐菜}
🌙 晚餐
→ {店名}({行政区}):{推荐菜}
🌃 宵夜
→ {店名}({行政区}):{推荐菜}
💡 路线说明:{简要说明路线逻辑,如"从XX区出发,沿途经过XX区,最后到XX区"}
如果店铺数量超过一天能吃完的量(>5家),则拆分为多天路线,标注"Day 1"、"Day 2"等。
如果店铺数量较少(≤3家),则简化为一条路线,不必强行填满所有时段。
注意事项
- 所有写入操作使用
edit_file或replace_in_file工具,不要覆盖已有内容 - 简介字段必须精炼,核心是让人一眼知道吃什么
- 推荐菜来源优先级:视频/帖子明确提到 > 网络搜索到的招牌菜
- 地址信息尽量精确到门牌号
- 每次写入后更新文件头部的"最后更新"时间