Skip to content
Back to skills

Fitness Nutrition

BSecurity

健身动作库与营养查询。通过 wger API 搜索 690+ 动作(按肌群/器械/名称), 通过 USDA FoodData Central 查询 38万+ 食物营养数据。 离线计算器:BMI、TDEE、1RM、宏量分配、体脂率。纯 Python,无 pip 依赖。

  • 417 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added September 8, 2026
educationpythongobashapi

Works with

  • api

Security analysis

B88/100
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro scans all 4 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add infometa/workbuddyskills --skill fitness-nutrition --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Fitness Nutrition?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Fitness Nutrition
[![Security: B — Skills Directory](https://www.skillsdirectory.com/api/skills/infometa-fitness-nutrition/badge)](https://www.skillsdirectory.com/skills/infometa-fitness-nutrition)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: fitness-nutrition
description: >
  健身动作库与营养查询。通过 wger API 搜索 690+ 动作(按肌群/器械/名称),
  通过 USDA FoodData Central 查询 38万+ 食物营养数据。
  离线计算器:BMI、TDEE、1RM、宏量分配、体脂率。纯 Python,无 pip 依赖。
platforms: [linux, macos, windows]
version: 1.0.0
authors:
  - haileymarshall (original)
license: MIT
---

# Fitness & Nutrition

健身动作库 + 营养查询 + 身体计算器,训练计划所需数据全部在这里。

## When to Use

触发此 skill 当用户:
- 制定训练计划(需要查动作)
- 问动作怎么做(需要动作详情)
- 问饮食/营养(需要食物数据或宏量计算)
- 需要计算 BMI / TDEE / 1RM / 体脂率 / 宏量分配

## Procedure

### 动作查询(wger API)

wger 公开端点无需认证。始终加 `language=2&status=2` 获取已审核英文动作。

**按名称搜索:**

```bash
QUERY="$1"
ENCODED=$(python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$QUERY")
curl -s "https://wger.de/api/v2/exercise/search/?term=${ENCODED}&language=english&format=json" \
  | python3 -c "
import json,sys
data=json.load(sys.stdin)
for s in data.get('suggestions',[])[:10]:
    d=s.get('data',{})
    print(f'  ID {d.get(\"id\",\"?\"):>4} | {d.get(\"name\",\"N/A\"):<35} | Category: {d.get(\"category\",\"N/A\")}')
"
```

**获取动作详情:**

```bash
EXERCISE_ID="$1"
curl -s "https://wger.de/api/v2/exerciseinfo/${EXERCISE_ID}/?format=json" \
  | python3 -c "
import json,sys,html,re
data=json.load(sys.stdin)
trans=[t for t in data.get('translations',[]) if t.get('language')==2]
t=trans[0] if trans else data.get('translations',[{}])[0]
desc=re.sub('<[^>]+>','',html.unescape(t.get('description','N/A')))
print(f'Exercise  : {t.get(\"name\",\"N/A\")}')
print(f'Category  : {data.get(\"category\",{}).get(\"name\",\"N/A\")}')
print(f'Primary   : {\", \".join(m.get(\"name_en\",\"\") for m in data.get(\"muscles\",[])) or \"N/A\"}')
print(f'Secondary : {\", \".join(m.get(\"name_en\",\"\") for m in data.get(\"muscles_secondary\",[])) or \"none\"}')
print(f'Equipment : {\", \".join(e.get(\"name\",\"\") for e in data.get(\"equipment\",[])) or \"bodyweight\"}')
print(f'How to    : {desc[:500]}')
imgs=data.get('images',[])
if imgs: print(f'Image     : {imgs[0].get(\"image\",\"\")}')
"
```

**按肌群/器械筛选:**

```bash
FILTER="$1"  # e.g. "muscles=4" or "category=11" or "equipment=3"
curl -s "https://wger.de/api/v2/exercise/?${FILTER}&language=2&status=2&limit=20&format=json" \
  | python3 -c "
import json,sys
data=json.load(sys.stdin)
print(f'Found {data.get(\"count\",0)} exercises.')
for ex in data.get('results',[]):
    print(f'  ID {ex[\"id\"]:>4} | muscles: {ex.get(\"muscles\",[])} | equipment: {ex.get(\"equipment\",[])}')
"
```

### 营养查询(USDA FoodData Central)

使用 `USDA_API_KEY` 环境变量,未设置则回退到 `DEMO_KEY`。
DEMO_KEY = 30次/小时,免费注册 = 1000次/小时。

```bash
# 搜索单种食物
python3 scripts/nutrition_search.py "chicken breast"

# 搜索多种食物
python3 scripts/nutrition_search.py "rice" "eggs" "broccoli"
```

### 身体计算(离线)

```bash
python3 scripts/body_calc.py bmi <体重kg> <身高cm>
python3 scripts/body_calc.py tdee <体重kg> <身高cm> <年龄> <M|F> <活动量1-5>
python3 scripts/body_calc.py 1rm <重量> <次数>
python3 scripts/body_calc.py macros <TDEE> <cut|maintain|bulk>
python3 scripts/body_calc.py bodyfat <M|F> <颈围cm> <腰围cm> [臀围cm] <身高cm>
```

公式出处见 `references/FORMULAS.md`。

## 中文适配规则

wger 和 USDA 返回的数据都是英文,必须:

1. **动作名**:保留英文原名 + 附带中文常用名(如 Bench Press/卧推)
2. **动作描述**:翻译为中文后输出,不直接给用户看英文原文
3. **食物名**:翻译为中文(如 chicken breast → 鸡胸肉)
4. **肌群名**:用中文(如 Pectoralis major → 胸大肌)

## Pitfalls

- wger 默认返回所有语言 → 必须加 `language=2` 筛英文
- wger 包含未审核用户提交 → 必须加 `status=2` 只取已审核
- USDA `DEMO_KEY` 30次/小时 → 批量查询加 `sleep 2` 或注册免费 Key
- USDA 数据是每 100g → 提醒用户按实际份量换算
- BMI 不区分肌肉和脂肪 → 肌肉型用户高 BMI 不是问题
- 体脂率公式误差 ±3-5% → 建议DEXA扫描获取精确值
- 1RM 公式在 >10 次时准确度下降 → 用 3-5 次的数据估算最准
- wger 的搜索端点用 `term` 不是 `query`

Files in this skill

  • SKILL.md4.5 KB
  • references/FORMULAS.md3.2 KB
  • scripts/body_calc.py6.3 KB
  • scripts/nutrition_search.py2.6 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

View all in education →

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.