Dinh dưỡng thể hình - Công cụ lập kế hoạch tập luyện và theo dõi dinh dưỡng
{/* Trang này được tạo tự động từ SKILL.md của kỹ năng bởi website/scripts/generate-skill-docs.py. Chỉnh sửa nguồn SKILL.md, không phải trang này. */}`#Dinh dưỡng thể hình
Kế hoạch tập luyện phòng tập thể dục và theo dõi dinh dưỡng. Tìm kiếm hơn 690 bài tập theo cơ, thiết bị hoặc danh mục thông qua wger. Tra cứu macro và calo cho hơn 380.000 loại thực phẩm thông qua USDA FoodData Central. Tính toán chỉ số BMI, TDEE, mức tối đa một lần lặp lại, phân chia macro và lượng mỡ trong cơ thể - Python thuần túy, không cần cài đặt pip. Được xây dựng dành cho những ai đang theo đuổi mục tiêu tăng cân, giảm cân hoặc chỉ cố gắng ăn uống tốt hơn.
Siêu dữ liệu kỹ năng
| Nguồn | Tùy chọn — cài đặt với |
| `Hermes skills install official/health/fitness-nutrition | |
| ` | |
| Đường dẫn |
optional-skills/health/fitness-nutrition ` | | Phiên bản |
1.0.0 ` | | Giấy phép | MIT | | Nền tảng | Linux, macOS, Windows | | Thẻ |
health
, `fitness
, `nutrition
, `gym
, `workout
, `diet
,
exercise |
Tham khảo: đầy đủ SKILL.md
Sau đây là định nghĩa kỹ năng đầy đủ mà Hermes tải khi kỹ năng này được kích hoạt. Đây là những gì tác nhân coi là hướng dẫn khi kỹ năng được kích hoạt.
Thể hình & Dinh dưỡng
Huấn luyện viên thể hình chuyên nghiệp và kỹ năng dinh dưỡng thể thao. Hai nguồn dữ liệu cộng với máy tính ngoại tuyến — mọi thứ mà người tập gym cần ở một nơi.
Nguồn dữ liệu (tất cả đều miễn phí, không phụ thuộc vào pip):
- wger (https://wger.de/API/v2/) — cơ sở dữ liệu bài tập mở, hơn 690 bài tập về cơ bắp, thiết bị, hình ảnh. Điểm cuối công cộng không cần xác thực.
- USDA FoodData Central (https://API.nal.usda.gov/fdc/v1/) — Cơ sở dữ liệu dinh dưỡng của chính phủ Hoa Kỳ, hơn 380.000 loại thực phẩm.
DEMO_KEYhoạt động ngay lập tức; đăng ký miễn phí cho các giới hạn cao hơn.
Máy tính ngoại tuyến (Python stdlib thuần túy):
- BMI, TDEE (Mifflin-St Jeor), tối đa một lần lặp lại (Epley/Brzycki/Lombardi), chia nhỏ macro, % mỡ cơ thể (phương pháp của Hải quân Hoa Kỳ)
Khi nào nên sử dụng
Kích hoạt kỹ năng này khi người dùng hỏi về:
- Bài tập, tập luyện, thói quen tập gym, nhóm cơ, chia tập luyện
- Macro thực phẩm, lượng calo, hàm lượng protein, lập kế hoạch bữa ăn, tính lượng calo
- Thành phần cơ thể: BMI, mỡ cơ thể, TDEE, dư/thâm hụt calo
- Ước tính tối đa một lần, tỷ lệ đào tạo, quá tải lũy tiến
- Tỷ lệ vĩ mô để cắt, đóng gói hoặc bảo trì
Thủ tục
Tra cứu bài tập (API wger)
Tất cả các điểm cuối công khai đều trả về JSON và không yêu cầu xác thực. Luôn thêm
format=JSON và
language=2 (tiếng Anh) để thực hiện các truy vấn.
Bước 1 — Xác định điều người dùng muốn:
- Bằng cơ → sử dụng
/API/v2/exercise/?muscles={id}&language=2&status=2&format=JSON
- Theo danh mục → sử dụng
/API/v2/exercise/?category={id}&language=2&status=2&format=JSON
- Theo thiết bị → sử dụng
/API/v2/exercise/?equipment={id}&language=2&status=2&format=JSON
- Theo tên → sử dụng
/API/v2/exercise/search/?term={query}&language=english&format=JSON
- Chi tiết đầy đủ → sử dụng
/API/v2/exerciseinfo/{exercise_id}/?format=JSON ``Bước 2 — ID tham chiếu (vì vậy bạn không cần thêm lệnh gọi API):
Các hạng mục bài tập:
| ID | Danh mục |
|---|---|
| 8 | Vũ khí |
| 9 | Chân |
| 10 | Cơ bụng |
| 11 | Ngực |
| 12 | Quay lại |
| 13 | Vai |
| 14 | Bê |
| 15 | Tim mạch |
Cơ bắp:
| ID | Cơ bắp | ID | Cơ bắp |
|---|---|---|---|
| 1 | Bắp tay cánh tay | 2 | Cơ delta trước |
| 3 | Serratus trước | 4 | Cơ ngực chính |
| 5 | Obliquus bên ngoài | 6 | Dạ dày |
| 7 | Cơ bụng trực tràng | 8 | Cơ mông cực đại |
| 9 | Hình thang | 10 | Cơ tứ đầu đùi |
| 11 | Bắp tay đùi | 12 | Latissimus dorsi |
| 13 | Cánh tay | 14 | Cơ tam đầu cánh tay |
| 15 | Đế |
Thiết bị:
| ID | Thiết bị |
|---|---|
| 1 | Thanh tạ |
| 3 | Quả tạ |
| 4 | Thảm tập thể dục |
| 5 | Bóng Thụy Sĩ |
| 6 | Thanh kéo |
| 7 | không có (trọng lượng cơ thể) |
| 8 | Băng ghế |
| 9 | Ghế nghiêng |
| 10 | Ấm đun nước |
Bước 3 - Tìm nạp và hiển thị kết quả:
# Search exercises by name
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
# Get full details for a specific exercise
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
# List exercises filtering by muscle, category, or equipment
# Combine filters as needed: ?muscles=4&equipment=1&language=2&status=2
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',[])}\")
"
`
### Tra cứu dinh dưỡng (USDA FoodData Central)
Sử dụng
`USDA_API_KEY
` env var nếu được đặt, nếu không thì quay lại
`DEMO_KEY
.
DEMO_KEY = 30 yêu cầu/giờ. Key đăng ký miễn phí = 1.000 yêu cầu/giờ.
``` bash
# Search foods by name
FOOD="$1"
API_KEY="$\{USDA_API_KEY:-DEMO_KEY}"
ENCODED=$(Python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$FOOD")
curl -s "https://API.nal.usda.gov/fdc/v1/foods/search?API_key=$\{API_KEY}&query=$\{ENCODED}&pageSize=5&dataType=Foundation,SR%20Legacy" \
| Python3 -c "
import JSON,sys
data=JSON.load(sys.stdin)
foods=data.get('foods',[])
if not foods: print('No foods found.'); sys.exit()
for f in foods:
n=\{x['nutrientName']:x.get('value','?') for x in f.get('foodNutrients',[])}
cal=n.get('Energy','?'); prot=n.get('Protein','?')
fat=n.get('Total lipid (fat)','?'); carb=n.get('Carbohydrate, by difference','?')
print(f\"\{f.get('description','N/A')}\")
print(f\" Per 100g: \{cal} kcal | \{prot}g protein | \{fat}g fat | \{carb}g carbs\")
print(f\" FDC ID: \{f.get('fdcId','N/A')}\")
print()
"
`
`
``` bash
# Detailed nutrient profile by FDC ID
FDC_ID="$1"
API_KEY="$\{USDA_API_KEY:-DEMO_KEY}"
curl -s "https://API.nal.usda.gov/fdc/v1/food/$\{FDC_ID}?API_key=$\{API_KEY}" \
| Python3 -c "
import JSON,sys
d=JSON.load(sys.stdin)
print(f\"Food: \{d.get('description','N/A')}\")
print(f\"\{'Nutrient':<40} \{'Amount':>8} \{'Unit'}\")
print('-'*56)
for x in sorted(d.get('foodNutrients',[]),key=lambda x:x.get('nutrient',\{}).get('rank',9999)):
nut=x.get('nutrient',\{}); amt=x.get('amount',0)
if amt and float(amt)>0:
print(f\" \{nut.get('name',''):<38} \{amt:>8} \{nut.get('unitName','')}\")
"
`
### Máy tính ngoại tuyến
Sử dụng tập lệnh trợ giúp trong
`scripts/
` cho các hoạt động hàng loạt,
hoặc chạy nội tuyến cho các phép tính đơn lẻ:-
`Python3 scripts/body_calc.py bmi <weight_kg <height_cm
-
`Python3 scripts/body_calc.py tdee <weight_kg <height_cm <age <M|F <activity 1-5
-
`Python3 scripts/body_calc.py 1rm <weight <reps
-
`Python3 scripts/body_calc.py macros <tdee_kcal <cut|maintain|bulk
-
`Python3 scripts/body_calc.py bodyfat <M|F <neck_cm <waist_cm [hip_cm] <height_cm
``Xem
`references/FORMULAS.md
` để biết tính khoa học đằng sau mỗi công thức.
---
## cạm bẫy
- điểm cuối của bài tập wger trả về **tất cả ngôn ngữ theo mặc định** — luôn thêm
`language=2
` cho tiếng Anh
- wger bao gồm **bài gửi của người dùng chưa được xác minh** — thêm
`status=2
` để chỉ nhận các bài tập đã được phê duyệt
- USDA
`DEMO_KEY
` có **30 yêu cầu/giờ** — thêm
`sleep 2
` giữa các yêu cầu hàng loạt hoặc nhận khóa miễn phí
- Dữ liệu của USDA là **trên 100g** — nhắc nhở người dùng chia tỷ lệ theo khẩu phần thực tế của họ
- BMI không phân biệt cơ với mỡ - BMI cao ở người cơ bắp không nhất thiết là không tốt cho sức khỏe
- Công thức lượng mỡ trong cơ thể là **ước tính** (±3-5%) — khuyên bạn nên quét DEXA để có độ chính xác
- Công thức 1RM mất độ chính xác trên 10 lần lặp lại — sử dụng hiệp 3-5 để có ước tính tốt nhất
- điểm cuối
`exercise/search
` của wger sử dụng
`term
` chứ không phải
`query
` làm tên tham số
---
## Xác minh
Sau khi chạy tìm kiếm bài tập: xác nhận kết quả bao gồm tên bài tập, nhóm cơ và thiết bị.
Sau khi tra cứu dinh dưỡng: xác nhận mỗi 100g macro sẽ được trả về kcal, protein, fat, carbs.
Sau máy tính: kết quả đầu ra để kiểm tra độ tỉnh táo (ví dụ: TDEE phải là 1500-3500 đối với hầu hết người lớn).
---
## Tham khảo nhanh
| Nhiệm vụ | Nguồn | Điểm cuối |
|------|--------|----------|
| Tìm kiếm bài tập theo tên | cá cược |
GET /API/v2/exercise/search/?term=&language=english
` |
| Chi tiết bài tập | cá cược |
GET /API/v2/exerciseinfo/\{id}/
` |
| Lọc theo cơ | cá cược |
GET /API/v2/exercise/?muscles=\{id}&language=2&status=2
` |
| Lọc theo thiết bị | cá cược |
GET /API/v2/exercise/?equipment=\{id}&language=2&status=2
` |
| Danh sách danh mục | cá cược |
GET /API/v2/exercisecategory/
` |
| Danh sách cơ bắp | cá cược |
GET /API/v2/muscle/
` |
| Tìm kiếm thực phẩm | USDA |
GET /fdc/v1/foods/search?query=&dataType=Foundation,SR Legacy
` |
| Chi tiết món ăn | USDA |
GET /fdc/v1/food/\{fdcId}
` |
| BMI / TDEE / 1RM / macro | ngoại tuyến |
Python3 scripts/body_calc.py
` |