# 身体追踪 Skill 套件(多用户版 + 飞书卡片推送) > Claude Code 身体追踪 Skill:支持多用户自助 onboarding、飞书群聊饮食记录、AI 营养估算、飞书多维表格仪表盘同步、每日卡片推送。包含 body-track(日常记录)、body-track-dashboard(仪表盘同步)和 body_push.py(定时卡片推送脚本)。 ## Install Copy the content below into your project: --- name: body-track description: 多用户身体追踪。用户报告吃了什么、发食物照片、问某个食物热量、汇报运动/手表数据、或想查看饮食记录时触发。首次使用自动进入 onboarding 收集身体数据。 argument-hint: [口述吃了什么/照片路径/食物热量查询/setup,或留空] allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent --- # 身体追踪 · 饮食运动记录(多用户版) ## 概述 这是一个可以分享给其他人使用的身体追踪 skill。每个用户把这个文件夹复制到自己的 `~/.claude/skills/body-track/`,首次使用时会自动引导设置。 ## 数据目录 所有数据存放在 `~/body-track/`: ``` ~/body-track/ profile.json # 用户配置(身体数据、目标、飞书信息) W{周数}_{日期}.md # 每周追踪文件 {年}-{月}_月报.md # 月报文件 {MMDD}/ # 食物照片文件夹 ``` --- ## 第一步:检查是否已完成 Onboarding 每次触发时先检查 `~/body-track/profile.json` 是否存在。 - **如果存在**:读取 profile,直接进入「日常记录流程」 - **如果不存在**:进入「Onboarding 流程」 --- ## Onboarding 流程(首次使用) ### 1. 检查飞书环境 先确认用户的 lark-cli 是否可用: ```bash lark-cli auth status 2>&1 ``` - 如果未登录或未安装,告诉用户: 1. 安装 lark-cli:`npm i -g @anthropic-ai/lark-cli`(或按实际安装方式) 2. 配置飞书应用:`lark-cli config init` 3. 登录:`lark-cli auth login` 4. 需要的权限:`im:message`(读消息)、`im:resource`(下载图片)、`bitable:app`(多维表格) - 完成后再继续 ### 2. 收集身体数据 通过对话逐步收集(必填项标 *): | 项目 | 说明 | 用途 | |------|------|------| | * 性别 | 男/女 | BMR 计算 | | * 年龄 | 周岁 | BMR 计算 | | * 身高 (cm) | | BMR 计算 | | * 体重 (kg) | 当前体重 | BMR 计算 + 追踪基线 | | 体脂率 (%) | 如有体测报告 | 更精确的目标设定 | | 骨骼肌 (kg) | 如有体测报告 | 增肌参考 | | 健康状况 | 胰岛素抵抗、三高、甲状腺、PCOS 等 | 影响饮食建议方向 | | 饮食偏好/禁忌 | 素食/清真/过敏/不吃什么 | 建议时避开 | | 穿戴设备 | 有无手表/手环 | 是否有实际消耗数据 | | * 目标 | 减脂/增肌/维持/改善饮食 | 决定热量策略 | | 减脂目标 (kg) | 想减多少 | 计算减脂进度 | 一次性问完不友好,分 2-3 轮对话收集。先问基础(性别、年龄、身高、体重、目标),再问详情。 ### 3. 计算个性化参数 用 Mifflin-St Jeor 公式: - 男:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄 + 5 - 女:BMR = 10 × 体重(kg) + 6.25 × 身高(cm) - 5 × 年龄 - 161 默认 TDEE = BMR × 1.2(久坐)。如果有手表数据,用实际消耗。 热量目标: - 减脂:TDEE - 300 ~ 500 kcal(不低于 BMR) - 维持:TDEE - 增肌:TDEE + 200 ~ 300 kcal 蛋白质目标:体重 × 1.2 ~ 1.6 g(减脂取高值,维持取低值) ### 4. 收集飞书信息 问用户: 1. **饮食记录群的 chat_id**:用户在飞书哪个群记录饮食?让用户提供群的 chat_id。获取方式: ```bash # 搜索群聊 lark-cli im +chat-list --query "群名关键词" --as user ``` 2. **Webhook URL**:让用户在群设置里添加自定义机器人,获取 webhook 地址(用于每日推送) ### 5. 创建飞书多维表格 用 lark-cli 自动创建: ```bash # 在用户的云空间里创建多维表格 lark-cli base +create --name "身体追踪" --as user ``` 创建 4 张数据表(参考字段设计,用 lark-cli base 命令): **表1: 每日汇总** - 日期(日期)、摄入kcal(数字)、蛋白质g(数字)、碳水g(数字)、脂肪g(数字) - 消耗kcal(数字)、热量差(数字)、体重(数字) **表2: 饮食明细** - 日期(日期)、餐次(单选:早餐/午餐/晚餐/加餐)、食物(文本)、份量(文本) - 热量(数字)、蛋白质(数字)、脂肪(数字)、碳水(数字) **表3: 运动记录** - 日期(日期)、类别(单选:有氧/无氧)、运动名称(文本)、时长min(数字)、消耗kcal(数字) **表4: AI建议** - 分类(单选:总评/蛋白质/微量元素/运动/饮食推荐/减脂进度)、内容(文本)、数据依据(文本)、优先级(单选:高/中/低) 创建完成后记录 base_token 和各 table_id。 ### 6. 保存 profile.json ```bash mkdir -p ~/body-track ``` 写入 `~/body-track/profile.json`: ```json { "name": "用户名", "chat_id": "oc_xxx", "base_token": "xxx", "table_ids": { "daily": "tbl...", "detail": "tbl...", "exercise": "tbl...", "advice": "tbl..." }, "webhook_url": "https://open.feishu.cn/open-apis/bot/v2/hook/xxx", "body": { "gender": "female", "age": 30, "height_cm": 165, "weight_kg": 60, "body_fat_pct": null, "skeletal_muscle_kg": null, "conditions": [], "diet_prefs": [], "has_wearable": false }, "targets": { "goal": "fat_loss", "target_weight_loss_kg": 5, "daily_kcal_min": 1400, "daily_kcal_max": 1600, "protein_g": 80, "bmr": 1300, "tdee": 1560 }, "created_at": "2026-04-07", "weight_start": 60, "exercise_goal": "3-4次/周,每次20-30分钟" } ``` ### 7. 设置每日推送 创建推送脚本 `~/body-track/body_push.py`,逻辑: - 读取最新的 dashboard HTML,提取未达标建议 - 每天 3 次轮播推送(早安/午间/晚间) - 用 webhook 发送飞书卡片消息 - 卡片格式:标题栏 + 三列汇总指标 + 建议列表 + 运动提醒 + 累计赤字 推送脚本模板参考 `~/scripts/feishu-bot/body_push.py`(如果存在的话),核心逻辑: - `find_latest_dashboard()` 找最新 dashboard HTML - `collect_all_advice()` 提取红黄标签的建议 - `extract_summary_metrics()` 提取汇总指标 - `extract_exercise_summary()` 从周报提取运动数据 - `build_card()` 构建飞书卡片 JSON - `send_webhook()` 发送到用户的 webhook 推送脚本要从 `~/body-track/profile.json` 读取 webhook_url 和 body_dir 路径。 设置定时任务(macOS launchd): ```bash # 创建 plist 文件 cat > ~/Library/LaunchAgents/com.bodytrack.push.plist << 'EOF' Label com.bodytrack.push ProgramArguments /usr/bin/python3 $HOME/body-track/body_push.py StartCalendarInterval Hour8Minute0 Hour12Minute30 Hour19Minute0 StandardOutPath $HOME/body-track/push.log StandardErrorPath $HOME/body-track/push.log EOF # 加载 launchctl load ~/Library/LaunchAgents/com.bodytrack.push.plist ``` ### 8. Onboarding 完成 告诉用户: - 数据目录:`~/body-track/` - 飞书看板:提供多维表格链接 - 每天 3 次推送已设置(8:00 / 12:30 / 19:00) - 以后直接在群里发食物照片和口述,然后用 `/body-track` 来同步记录 --- ## 日常记录流程 读取 `~/body-track/profile.json` 获取用户配置后: ### 数据来源:飞书对话 从用户的飞书群聊拉取消息: ```bash lark-cli im +chat-messages-list --chat-id {profile.chat_id} \ --start "YYYY-MM-DDT00:00:00+08:00" --end "YYYY-MM-DDT23:59:59+08:00" \ --sort asc --as user --format json ``` ### 下载食物照片 ```bash cd /tmp && lark-cli im +messages-resources-download \ --message-id om_xxx --file-key img_xxx --type image --as user \ --output food_MMDD_序号.png ``` 下载后用 Read 工具查看图片,识别食物。照片归档到 `~/body-track/{MMDD}/`。 ### 处理照片 - HEIC 先转换:`sips -s format jpeg -Z 800 原文件 --out /tmp/food_photos/输出.jpg` - 看照片时注意:手机作为尺寸参照物、吃前吃后对比判断实际吃了多少 - 如有营养标签,直接读取标签数据计算 ### 营养估算 必须有份量依据(重量/个数/比例),不能凭"一碗""一杯"模糊估算。 每种食物估算以下营养素: | 营养素 | 说明 | |--------|------| | 热量 (kcal) | 总热量 | | 蛋白质 (g) | | | 碳水化合物 (g) | 其中标注糖的含量 | | 脂肪 (g) | 其中标注饱和脂肪 | | 膳食纤维 (g) | | | 钠 (mg) | | | 钙 (mg) | | | 铁 (mg) | | | 钾 (mg) | | | 维生素C (mg) | 如有显著来源 | | 维生素A (μg) | 如有显著来源 | 每餐汇总展示:热量 / 蛋白质 / 碳水 / 脂肪 四大项 + 值得注意的微量元素。 ### 更新追踪文件 读取 profile.json 中的目标数据来做对比。 **周文件**(详细记录): - 命名:`W{周数}_{起始日期}-{结束日期}.md`(周一到周日,ISO 周数) - 每天记录:各餐内容+份量+热量+蛋白质+碳水+脂肪、消耗、热量差、体重 - 消耗:有手表数据用手表,无手表用 profile.targets.tdee - 先读已有文件看格式,保持一致 - 如果当周文件不存在,新建(格式参考已有周文件或模板) 周文件模板(新建时使用): ```markdown # 第{周数}周 · {月}月{日}日 - {月}月{日}日 ## 本周目标 - 热量摄入:{daily_kcal_min}-{daily_kcal_max} kcal/天 - 蛋白质:≥ {protein_g}g/天 - 运动:{exercise_goal} --- ## 周一 M/DD | | 内容 | 份量 | 热量 | 蛋白质 | 脂肪 | 碳水 | |---|---|---|---|---|---|---| | 早餐 | ... | ... | ... | ... | ... | ... | | **摄入合计** | | | **X kcal** | **Xg** | **Xg** | **Xg** | | | 消耗 | |---|---| | 静息+活动 | {tdee} kcal | | **消耗合计** | **{tdee} kcal** | | 热量差 | 体重 | 能量值 | |---|---|---| | **X kcal** | — | /5 | ``` **月报文件**(趋势总览): - 命名:`{年}-{月}_月报.md` - 包含:每日数据表、周均趋势对比、关键发现 - 每次更新周文件时同步更新月报 ### 回复用户 - 当餐/当天的 热量 / 蛋白质 / 碳水 / 脂肪 - 如果当天还没吃完,告诉剩余预算(基于 profile 中的目标) - 指出高热量低蛋白、高碳水、高钠的项目,但不说教不安慰 - 用户问某食物热量就直接回答数字,加上当天累计 - 如果用户有特殊健康状况(如胰岛素抵抗),相关建议只在用户问时提 ### 能量和运动探测 每次交互时简短问一句:"今天能量怎么样?1-5" - 如果能量 ≥ 3,问一句"想动一下吗?" - 不强推,用户说不想就不追问 - 记录能量值和运动数据到周文件 ## 注意事项 - 如实记录,不要为了让用户感觉好而低估热量 - 用户的所有个性化数据从 profile.json 读取,不要硬编码 - 保持简单直接 - 估算要诚实,不美化不安慰 $ARGUMENTS --- Source: https://tokrepo.com/en/workflows/b6e3483c-90b8-4af2-9e82-231d5b95b78a Author: shiny.lucc