名称: clawdbites
描述: 从 Instagram Reels 中提取食谱。当用户发送 Instagram Reels 链接并希望获取字幕中的食谱时使用。将食材、步骤和营养信息解析为清晰格式。
主页: https://github.com/kylelol/ClawdBites
元数据: {"clawdbot":{"emoji":"🦞","os":["darwin","linux"],"requires":{"bins":["yt-dlp","ffmpeg","whisper"]},"install":[{"id":"yt-dlp","kind":"brew","formula":"yt-dlp","bins":["yt-dlp"],"label":"通过 Homebrew 安装 yt-dlp"},{"id":"ffmpeg","kind":"brew","formula":"ffmpeg","bins":["ffmpeg"],"label":"通过 Homebrew 安装 ffmpeg"},{"id":"whisper","kind":"shell","command":"pip3 install --user openai-whisper","label":"安装 Whisper(本地运行,无需 API 密钥)"}]}}
使用多层方法从 Instagram Reels 中提取食谱:
1. 字幕解析 — 即时检查,优先查看描述
2. 音频转录 — 使用 Whisper(本地运行,无需 API 密钥)
3. 画面分析 — 使用视觉模型识别屏幕上的文字
无需 Instagram 登录。适用于公开的 Reels。
务必遵循此完整流程 — 如果字幕中缺少步骤说明,切勿在解析字幕后停止:
--dump-json) 提取元数据yt-dlp -o "/tmp/reel.mp4" "URL"ffmpeg -y -i /tmp/reel.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/reel.wavwhisper /tmp/reel.wav --model base --output_format txt --output_dir /tmp完整性检查启发式规则:
- 包含食材 = 包含 3 个或以上“数量+物品”模式(例如,“1 杯面粉”、“2 磅鸡肉”)
- 包含步骤说明 = 包含动作动词(搅拌、烹饪、烘烤、混合、倒入、添加)+ 顺序或编号步骤
yt-dlp --dump-json "https://www.instagram.com/reel/SHORTCODE/" 2>/dev/null
JSON 输出中的关键字段:
- description — 包含食谱的字幕
- uploader — 创作者姓名
- channel — 创作者用户名
- webpage_url — 原始 URL
- like_count — 受欢迎程度指标
在字幕中寻找以下模式:
营养信息:
- “X 卡路里 | Xg 蛋白质 | Xg 碳水 | Xg 脂肪”
- “每份营养信息”
- “卡路里/蛋白质/碳水/脂肪”
食材:
- 以数量开头的行(1 杯、2 汤匙、24 盎司)
- 包含计量单位的行
- 表情符号项目符号(🥩 🌽 🧀 等)
章节:
- “对于 [组成部分]:”
- “食材:”
- “步骤:”
- “说明:”
清晰地呈现提取的食谱:
## [食谱名称]
*来自 @[用户名]*
**营养信息(每份):** X 卡路里 | Xg 蛋白质 | Xg 碳水 | Xg 脂肪
### 食材
- [食材 1]
- [食材 2]
...
### 步骤
1. [步骤 1]
2. [步骤 2]
...
---
来源:[原始 URL]
让用户决定后续操作:
- “保存到我的食谱” → 保存到 Apple 备忘录(如果 meal-planner 技能可用)
- “添加到愿望清单” → 保存到 memory/recipe-wishlist.json
- “只显示给我看” → 仅显示,不保存
- “为下周计划这个” → 转交给 meal-planner 技能
用于存储用户稍后想尝试的食谱(可选):
memory/recipe-wishlist.json:
{
"recipes": [
{
"name": "食谱名称",
"source": "instagram",
"sourceUrl": "https://instagram.com/reel/...",
"handle": "@创作者",
"addedDate": "2026-01-26",
"tried": false,
"macros": {
"calories": 585,
"protein": 56,
"carbs": 25,
"fat": 28,
"servings": 3
},
"ingredients": [...],
"instructions": [...]
}
]
}
如果 yt-dlp 失败:
- 检查 URL 是否为有效的 Instagram Reels 格式
- 可能是私密账户 — 通知用户
- 建议用户手动粘贴字幕文本作为备用方案
如果在字幕中未找到食谱(重要):
提取后,扫描字幕寻找食谱指示:
- 食材数量(数字 + 单位,如盎司、杯、汤匙、磅)
- 食谱章节(“对于...”、“食材:”、“步骤:”)
- 烹饪动词(烘烤、烹饪、炒、混合、结合)
- 营养信息(卡路里、蛋白质、碳水、脂肪)
如果未找到,请明确告知用户:
“我提取了字幕,但看起来食谱不在里面 — 这可能只是一个预告,或者食谱只在视频本身中展示。以下是字幕内容:
[显示字幕]
几个选项:
1. 查看评论 — 有时创作者会在那里发布食谱
2. 查看他们的个人简介链接 — 可能指向完整食谱
3. 描述你在视频中看到的内容,我可以帮你找到类似的食谱”
食谱检测启发式规则:
包含食谱 如果字幕包含:
- 3 个或以上类似食材的模式(数量 + 食物)
- 或 “recipe” + 食材列表
- 或 营养细分 + 食材
- 或 编号/项目符号步骤说明
不包含食谱 如果字幕:
- 大部分是标签
- 只是描述/预告
- 少于 100 个字符
- 没有数量或计量单位
meal-planner 技能可以引用此技能:
- 计划餐食时,检查愿望清单中未尝试的食谱
- 根据现有食材推荐愿望清单中的食谱
- 在食谱用于餐食计划后标记为“已尝试”
当字幕缺少步骤说明时,务必自动转录音频。 不要停下来询问用户 — 直接执行。这是最常见的情况,因为创作者通常将食材放在字幕中,但口述步骤说明。
步骤 1:下载视频
yt-dlp -o "/tmp/reel.mp4" "https://instagram.com/reel/XXX"
步骤 2:提取音频
ffmpeg -i /tmp/reel.mp4 -vn -acodec pcm_s16le -ar 16000 -ac 1 /tmp/reel.wav
步骤 3:使用 Whisper 转录
/Users/kylekirkland/Library/Python/3.14/bin/whisper /tmp/reel.wav --model base --output_format txt --output_dir /tmp
步骤 4:解析转录文本寻找食谱
寻找烹饪步骤说明、口述的食材。
务必在未提供时推断数量。 切勿呈现没有数量的食谱 — 根据上下文和标准包装尺寸进行估算。
| 他们说的内容 | 推断 |
|---|---|
| “一些鸡肉” | ~1 磅 |
| “一点大蒜” | 2-3 瓣 |
| “一把菠菜” | ~2 杯 |
| “淋上油” | 1-2 汤匙 |
| “根据口味调味” | ½ 茶匙盐,¼ 茶匙胡椒 |
| “少许酱油” | 1-2 汤匙 |
| “几汤匙” | 2-3 汤匙 |
| “一些米饭” | 1 杯生米 |
| “顶部放奶酪” | ½ - 1 杯碎奶酪 |
| “切碎的洋葱” | 1 个中等洋葱 |
| “甜椒” | 2 个甜椒 |
| 食材 | 标准包装 | 推断 |
|---|---|---|
| 酥皮 | 17 盎司片 | 1 片 |
| 碎牛肉/火鸡肉 | 1 磅包装 | 1 磅 |
| 鸡胸肉 | ~1.5 磅包装 | 1.5 磅 |
| 香肠链接 | 14 盎司 / 4-5 根 | 1 包 |
| 培根 | 12 盎司 / 12 片 | ½ 包 (6 片) |
| 碎奶酪 | 8 盎司袋 | 1-2 杯 |
| 玉米饼 | 8-10 片装 | 1 包 |
| 罐装豆子 | 15 盎司罐 | 1 罐 |
| 高汤/汤底 | 32 盎司盒 | 1-2 杯 |
| 意大利面 | 16 盎司盒 | 8 盎司 (半盒) |
| 米饭 | 2 磅袋 | 1-2 杯生米 |
根据食谱类型:
- 2 人份炒菜 → 1 磅蛋白质,4 杯蔬菜
- 汤/炖菜 → 1.5-2 磅蛋白质,4 杯高汤
- 烤盘餐 → 1.5 磅蛋白质,3-4 杯蔬菜
- 开胃菜 → 较小份量,估算每批约 12-15 份
根据提到的份数:
- “4 人份” → 按 4 人份缩放标准数量
- “一周备餐” → 假设 5-8 人份
- 未提及份数 → 默认为 4 人份
根据蛋白质目标(如果用户有营养目标):
- 每份 40-50 克蛋白质 → 每份约 6-8 盎司熟肉
- 相应缩放食谱蛋白质含量
始终清晰地呈现推断的数量:
### 食材
- 1 磅火鸡肉 *(估算)*
- 1 个中等洋葱,切碎 *(估算)*
- 2 杯高汤 *(基于典型汤品估算)*
用 (估算) 标记推断的数量,以便用户知道哪些来自源内容,哪些是推断的。
1. 尝试字幕(即时)
└── yt-dlp --dump-json → 解析描述
└── 找到食谱? → 完成 ✅
└── 检查“置顶”/“在评论中”/“查看评论” → 标记
2. 如果标记:检查创作者评论
└── 在评论中查找创作者用户名
└── 如果找到包含食谱的创作者评论 → 完成 ✅
└── 如果未找到 → 继续 + 通知用户
3. 尝试音频(30-60 秒)
└── 下载视频
└── 使用 ffmpeg 提取音频
└── 使用 Whisper(基础模型)转录
└── 解析转录文本寻找食谱
└── 推断缺失的计量
└── 找到食谱? → 完成 ✅
4. 呈现结果 + 必要时提示
└── 显示从音频中提取的内容
└── 如果标记了“置顶”,告知用户:
“创作者提到完整食谱在评论中置顶。
我从音频中提取了能获取的内容,但如果你想要
精确的计量,请将置顶评论粘贴到这里,我会
将其与我找到的内容合并。”
5. 尝试画面分析(如果音频不完整)
└── 使用 ffmpeg 提取 5-8 个关键帧
└── 发送给 Claude 视觉模型
└── 询问:“提取显示的任何食谱文本、食材或计量”
└── 将发现与音频转录合并
6. 备用方案(未找到任何内容)
└── 通知用户:“字幕或音频/视频中未找到食谱”
└── 提供:根据视频标题/描述搜索类似食谱
提取关键帧并使用视觉模型分析。
提取帧:
# 每 5 秒提取 1 帧
ffmpeg -i /tmp/reel.mp4 -vf "fps=1/5" /tmp/frame_%02d.jpg
# 或提取特定数量的均匀分布帧
ffmpeg -i /tmp/reel.mp4 -vf "select='not(mod(n,30))'" -vsync vfr /tmp/frame_%02d.jpg
发送给视觉模型:
使用 Claude 的图像分析功能读取每一帧:
- 食谱卡片 / 标题屏幕
- 屏幕上显示的食材列表
- 文字叠加中的计量
- 显示的逐步说明
视觉提示词:
分析这个烹饪视频的帧。提取任何:
- 食谱名称或标题
- 带数量的食材
- 烹饪步骤说明
- 营养信息 / 营养数据
- 任何其他显示的食谱相关文本
如果没有可见的食谱文本,请回复“未找到食谱文本。”
合并策略:
- 音频转录 = 主要来源(口述步骤说明)
- 画面分析 = 补充(精确计量、食谱卡片)
- 结合两者,优先使用视觉中的具体计量而非音频推断
扫描字幕中的以下短语(不区分大小写):
- “recipe pinned”
- “pinned in comments”
- “check comments”
- “in the comments”
- “comment below”
- “recipe below”
- “full recipe in comments”
如果检测到,在提取后标记并通知用户:
“请注意 — 创作者说食谱在评论中置顶。
我从音频中获取了能获取的内容,但 yt-dlp 无法在没有登录的情况下访问置顶评论。
如果你想要确切的食谱,复制置顶评论并发送给我 — 我会将其正确格式化。”
yt-dlp — brew install yt-dlpffmpeg — brew install ffmpegwhisper — pip3 install openai-whisper(本地运行,无需 API 密钥)