健身API开发者的数据难题:Exercises Dataset 1324个动作5分钟上手
健身API开发者的数据难题:Exercises Dataset 1324个动作5分钟上手
【免费下载链接】exercises-dataset1,324-exercise fitness dataset — animation GIFs, 180×180 thumbnails, muscle-group & equipment data, and step-by-step instructions in 6 languages. The exercise data layer behind the LogPress app.项目地址: https://gitcode.com/GitHub_Trending/ex/exercises-dataset
做健身应用的开发者,十有八九会卡在同一个环节:动作数据。Exercises Dataset 是一个收录了 1324 个健身动作的开源数据集,自带动画 GIF、肌肉与器械分类,以及中、英、西、意、土、俄 6 种语言的逐步动作指导,让后端开发可以跳过数据收集,直接进入业务逻辑。本文会从一个真实的需求出发,带你走完"看数据 → 起接口 → 进数据库 → 出训练计划"的全过程。
让项目停摆的,往往不是逻辑,而是数据
去年我想做一个"居家健身"小程序,功能很简单:用户选一个部位,我给他推荐动作。听起来不难,对吧?
真正动手才发现坑全在数据上。翻遍全网,英文动作库倒是不少,可要么接口要付费,要么数据是抓来的,动作名、器械名五花八门对不齐;想做成多语言版本,还得自己找人翻译几百条动作要领;更别提每个动作还要配图、配动图——光想到这个工作量,我差点就放弃了。
如果你也经历过这种"代码还没写,先被数据劝退"的滋味,Exercises Dataset 就是为你准备的。它把健身应用最吃力的那部分——结构化的动作数据、多语言文案、配套媒体文件——一次性打包好了。
先看看口袋里有什么:一条动作记录能拆出几层信息
项目根目录下的data/exercises.json是唯一的核心数据文件,一个 JSON 数组,装了全部 1324 条动作记录。随便挑第一条,长这样:
{ "id": "0001", "name": "3/4 sit-up", "category": "waist", "body_part": "waist", "equipment": "body weight", "instructions": { "en": "Lie flat on your back ...", "es": "Túmbate sobre tu espalda ...", "it": "Sdraiati sulla schiena ...", "tr": "Sırt üstü yatın ...", "ru": "Лягте на спину ...", "zh": "平躺,膝盖弯曲,双脚平放在地上 ..." }, "instruction_steps": { "zh": ["平躺,膝盖弯曲,双脚平放在地上。", "将双手放在脑后,肘部朝外。", "..."] }, "muscle_group": "hip flexors", "secondary_muscles": ["hip flexors", "lower back"], "target": "abs", "image": "images/0001-2gPfomN.jpg", "gif_url": "videos/0001-2gPfomN.gif" }把字段拆开看,信息量比想象中大:
- 分类三件套:
category/body_part(身体部位)、target(主练肌群)、muscle_group与secondary_muscles(协同肌群),做筛选和推荐时直接拿来当索引。 - 6 语言说明:
instructions下挂着 en、es、it、tr、ru、zh 六份完整文案,中文也在其中,做国际化产品不用再逐条翻译。 - 分步拆解:
instruction_steps把一段说明拆成了步骤数组,App 里可以按步骤逐条展示,体验比一大段文字好得多——这是很多同类数据集没有的细节。 - 媒体路径:
image指向 180×180 缩略图,gif_url指向同尺寸动画,1324 个动作每个都配齐了,前端直接引用本地路径即可。
别急着写代码:双击就能用的动作浏览器
写接口之前,建议你先花两分钟把数据"看"一遍,建立直觉。仓库里自带了一个纯前端的浏览工具index.html,不需要装任何依赖,双击用浏览器打开就行。
它干了几件事:顶部实时搜索框可以跨全部 1324 条记录检索动作名;左侧可以按身体部位、器械、目标肌肉做组合筛选;往下滚是无限流式的卡片网格,点开任意一张卡,就能看到该动作的缩略图、动图,以及 6 种语言下各自的动作要领。
对产品经理、设计师,乃至想先验证想法的你来说,这相当于一个零成本的"数据预览台"——数据是否够用、分类是否合理,扫一眼就有答案,不必等后端写完再返工。
最省事的搭法:零依赖跑起一个健身 API
确认数据没问题,就可以动手了。这里给一个"纯净版"方案:只用 Python 标准库,不装 Flask、不装任何第三方包,把文件保存成server.py,python3 server.py就能跑起来。
# server.py —— 零依赖健身 API import json from http.server import BaseHTTPRequestHandler, HTTPServer from urllib.parse import urlparse, unquote # 启动时一次性加载全部数据,避免每次请求都读文件 with open("data/exercises.json", encoding="utf-8") as f: EXERCISES = json.load(f) class Handler(BaseHTTPRequestHandler): def do_GET(self): path = unquote(urlparse(self.path).path) # 路由一:返回全部动作,/api/exercises if path == "/api/exercises": body = json.dumps(EXERCISES, ensure_ascii=False).encode("utf-8") # 路由二:按身体部位筛选,/api/exercises/chest elif path.startswith("/api/exercises/"): category = path.split("/")[-1] matched = [e for e in EXERCISES if e["category"] == category] body = json.dumps(matched, ensure_ascii=False).encode("utf-8") # 路由三:按 id 取指定语言说明,/api/instructions/0001/zh elif path.startswith("/api/instructions/"): _, _, ex_id, lang = path.split("/") ex = next((e for e in EXERCISES if e["id"] == ex_id), None) if not ex or lang not in ex["instructions"]: self.send_response(404); self.end_headers(); return body = json.dumps( {"name": ex["name"], "instruction": ex["instructions"][lang]}, ensure_ascii=False).encode("utf-8") else: self.send_response(404); self.end_headers(); return # 统一返回 JSON,注意 UTF-8,中文才不会乱码 self.send_response(200) self.send_header("Content-Type", "application/json; charset=utf-8") self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) if __name__ == "__main__": HTTPServer(("0.0.0.0", 8000), Handler).serve_forever()跑起来后,浏览器里可以直接验证三个接口:
http://localhost:8000/api/exercises—— 全量数据http://localhost:8000/api/exercises/chest—— 只看胸部动作(163 条)http://localhost:8000/api/instructions/0001/zh—— 中文动作要领
ensure_ascii=False这行是关键,不然中文会被转义成\uXXXX,接口就没法直接用了。
想上生产?把 1324 条数据一键倒进数据库
接口验证通过后,下一步通常是落库。手动写 1324 条 INSERT 语句不现实,好在仓库里的setup.html就是干这个的。
这是一个开发者向导页面,同样双击即可打开。里面按数据库类型分了四个页签:SQL Server、PostgreSQL、MySQL、SQLite。选好类型、填上你要的字段,点击生成,浏览器会直接产出一份包含建表语句和全部 1324 条 INSERT 的.sql文件,下载后导入你的数据库即可。
以 SQLite 为例,生成的建表语句大致是这个形态:
CREATE TABLE exercises ( id VARCHAR(10) PRIMARY KEY, -- 动作唯一编号 name VARCHAR(255), -- 动作名称 category VARCHAR(50), -- 身体部位分类 equipment VARCHAR(50), -- 所需器械 instructions_en TEXT, -- 英文说明 instructions_zh TEXT, -- 中文说明 muscle_group VARCHAR(100), -- 协同肌群 target VARCHAR(100), -- 目标肌肉 image VARCHAR(255), -- 缩略图路径 gif_url VARCHAR(255) -- 动图路径 );多语言说明在 JSON 里是嵌套对象,在关系库里拍平成instructions_en、instructions_zh这样的独立列即可,setup.html已经帮你处理好了这一层映射。导入完成后,查询、分页、加索引都交给数据库,性能不再是问题。
让 AI 替你写后端:一条提示词换一个完整 REST API
如果你连接口都不想手写,setup.html里还藏着一个更"偷懒"的选项:Ask Your LLM模块。
它会根据你的选择(框架 + 数据库)拼出一段结构化的提示词,你只需要把它粘贴给 ChatGPT、Claude、Gemini 之类的模型,就能一次生成一个可上生产的 REST API。支持的组合覆盖了主流技术栈:
- 后端框架:Express.js、FastAPI、ASP.NET Core、Spring Boot、Laravel、Gin
- 配套数据库:就是前面那四种,SQL Server / PostgreSQL / MySQL / SQLite
生成完别忘了两件事:一是把数据从 JSON 导入到你选的数据库,二是让 AI 参照data/exercises.json的真实字段来定义模型,接口才会和你本地数据对得上。
这套数据到底够不够用:规模与分布速览
决定要不要用它之前,先看分布。1324 个动作按身体部位拆开是这样的:
身体部位速览
- 上臂 292 · 大腿 227 · 背部 203 · 腰部 169
- 胸部 163 · 肩部 143 · 小腿 59 · 前臂 37
- 有氧 29 · 颈部 2
器械维度同样值得留意,因为它直接决定了"用户在家能不能练":
器械分布速览
- 自重 325 · 哑铃 294 · 绳索 157 · 杠铃 154
- 固定器械 81 · 弹力带 54 · 史密斯机 48 · 壶铃 41
- 负重 36 · 健身球 28 · EZ 杠铃 23 · 其他 83
两组数字放在一起看,两个结论很直观:全身各部位都有覆盖,没有明显短板;约四分之一的动作不需要任何器械,做"居家训练""零器械计划"这类场景素材完全够用。
收个尾:写一个能出训练计划的生成器
最后,把前面用到的能力串起来,写一个真正能用的东西:随机训练计划生成器。这次换成 Node.js 版本,和前面的 Python 接口正好凑齐两种语言。
// workout.js —— 根据部位与器械随机生成训练计划 const exercises = require("./data/exercises.json"); // 筛选 + 洗牌 + 截取前 n 条 function buildPlan(category, equipment = null, count = 5) { const pool = exercises.filter(ex => ex.category === category && (!equipment || ex.equipment === equipment) ); for (let i = pool.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); // Fisher-Yates 洗牌 [pool[i], pool[j]] = [pool[j], pool[i]]; } return pool.slice(0, count).map(ex => ({ name: ex.name, target: ex.target, equipment: ex.equipment, zh: ex.instructions.zh, // 直接带上中文要领,App 端免翻译 })); } // 生成一套 4 个动作的杠铃练腿计划 const plan = buildPlan("upper legs", "barbell", 4); console.log(JSON.stringify(plan, null, 2));运行node workout.js,输出的就是一份带动作名、目标肌群和中文要领的训练计划。往这个思路上再走一步,就能扩展出"按用户已有器械过滤""按目标肌肉打分排序"这类更聪明的推荐逻辑——数据字段都现成,差的只是你的想象力。
动图与图片能用吗?先看清楚版权红线
有一件事必须在动手前说清楚。这个仓库的代码与结构化数据(动作名、分类、多语言文案)遵循 MIT 协议,可以放心商用;但images/ 和 videos/ 下的全部媒体文件归 Gym visual 所有,属于授权转发,使用时有两条硬性约束:
- 只能在180×180 分辨率下使用,不得放大、二次加工后分发;
- 任何使用场景都必须保留
© Gym visual署名,每条 JSON 记录里的attribution字段就是给你预留的版权声明位。
如果你打算把动图用在商业 App 里,建议先查阅 Gym visual 的使用条款,必要时直接向其获取授权。媒体只是锦上添花,真正可自由使用的"动作数据 + 多语言文案"已经足够撑起一个产品的核心功能了。
读完这篇文章,你的下一步
五分钟很短,但足够你做完三件事:把仓库克隆下来(git clone https://gitcode.com/GitHub_Trending/ex/exercises-dataset),用浏览器打开index.html把 1324 个动作翻一遍,再把上面的零依赖 API 跑起来试试。
如果你正好在做一个健身类产品,这里有几个可以立刻上手的方向:
- 用
setup.html生成 SQL,把数据导入数据库,先跑通"查动作"这条主链路; - 用 Ask Your LLM 的提示词生成一个带筛选接口的后端,前端直接对接;
- 基于
target、equipment字段做一个"根据我的器械推荐动作"的小功能,验证你的产品想法。
数据是健身应用的底座,而 Exercices Dataset 把这块底座打磨好了。剩下的,就是把你的业务逻辑盖上去——动手吧。💪
【免费下载链接】exercises-dataset1,324-exercise fitness dataset — animation GIFs, 180×180 thumbnails, muscle-group & equipment data, and step-by-step instructions in 6 languages. The exercise data layer behind the LogPress app.项目地址: https://gitcode.com/GitHub_Trending/ex/exercises-dataset
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
