利用 Fatsecret api 获取食物营养成份数据

Fatsecret-Cover.png

最近的业务中应用于了 Fatsecret 平台的数据,由此做下相关的记录也给一些相关行业人员一些使用参考。

FatSecret Platform

是全球排名第一的食品和营养数据库,被50多个国家的1万多名开发人员使用,每月贡献超过5亿API调用。

除提供 api 开放数据平台外,还提供了相关的应用和服务,包含可以帮 普通用户,记录和计算一日三餐每餐食物卡路里的软件,自动推算出要达成的体重应该摄取多少的卡路里,可以帮助你合理地控制饮食,每天吃的都能记录其中,自动显示食物卡路里数值;

我们今天主要讲一下 api 平台的应用和技术对接

api 平台用户注册

首先进入 https://platform.fatsecret.com/api/ ,

image.png

进入官方网站注册成为开发者,

image.png

基础信息都比较简单,可以参考填写。填写完成后进入登录页面:

image.png

初次登录会要求创建一个新的应用,按照指引选择创建即可,我这里选择的是 WEB 应用。应用建立好后,可以准备对接API开发,在你的账户信息中进行 api 的配置:

image.png

Fatsecret 提供了两种 api 对接验方式,oauth1、oauth2,我们两种都有对接,今天主要讲的是 oauth2的对接,上图中的 OAuth2 中要生成 Client Secret,需要记下来,只会生成一次,忘记的话要重新生成。

Allowed IP 中,要填写你的 IP。我这里填了本地的开发用IP和服务器IP,这样 Fatsecret 才会允许你的数据请求。配置好后,我们打开 api 对接文档来进行 API 对接。



image.png

image.png

由于我们这个业务应用的技术是 Nodejs 而官方并未提供相关的SDK,一来我们自己做了一套对接,但后发现 github 有一套开源的基于 typescript 实现得比较完整,但是针对本地化 api 没有做处理,无法返回中文数据。改了一下实现 fork 在这里 https://github.com/baisheng/fatsecret-ts

实操

因为我们的目的是利用数据,所以需要一定量的食物名称数据来进行爬取:

先从一些菜谱网站爬取了一定量的食物名称、菜谱,分成了汤类、西餐、零食、自制、菜名、主食、热饮、冷饮几大类,约上万条数据。然后会利用这些名称来调用 food.search api 来获取具体的食物ID,为下一步取食物营养详情数据做准备。临时将数据存储到了维格表(比较安利,很好用),后面可以讲一下怎么利用维格表来整体数据并对外提供api 使用。

image.png

数据获取

我们主要应用了以下几个 api:

食物查询 fatSecret.foodsSearch

FoodListResult {
  meta: ListMeta { maxResult: 20, pageNumber: 0, totalResult: 123 },
  data: [
    FoodShort {
      id: 1350,
      name: '牛肉',
      type: 'Generic',
      brandName: null,
      description: '每101克 - 卡路里: 290千卡 | 脂肪: 19.70克 | 碳水物: 0.00克 | 蛋白质: 26.55克',
      fatSecretUrl: undefined
    },
...

菜谱查询 fatSecret.recipesSearch

RecipeListResult {
  meta: ListMeta { maxResult: 20, pageNumber: 0, totalResult: 3423 },
  data: [
    RecipeShort {
      id: 50389820,
      name: 'Stir Fry Sirloin Steak',
      image: 'https://m.ftscrt.com/static/recipe/7e071b9e-7c23-416d-a48f-efbad136ec03.jpg',
      description: "A low-cholesterol, meat dish that's easy to prepare.",
      fatSecretUrl: 'https://www.fatsecret.com/recipes/50389820-stir-fry-sirloin-steak/Default.aspx',
      nutrition: RecipeNutrition {
        fat: 6.22,
        protein: 6.15,
        calories: 115,
        carbohydrate: 10.45
      }
    },
...

食物详情 fatSecret.foodGet(需要获取食物营养素数据):

Food {
  id: 892,
  name: '热巧克力可可(全脂牛奶)',
  type: 'Generic',
  fatSecretUrl: undefined,
  servings: [
    FoodServing {
      id: 104,
      calcium: 275,
      calories: 190,
      measurementDescription: '杯',
      carbohydrate: 29.9,
      url: undefined,
      cholesterol: 17,
      fat: 5.47,
      metricServingUnit: '克',
      fiber: 2.3,
      iron: 1,
      metricServingAmount: 250,
      monounsaturatedFat: 1.52,
      numberOfUnits: 1,
      description: '1 杯',
      polyunsaturatedFat: 0.263,
      potassium: 440,
      protein: 8.8,
      saturatedFat: 3.308,
      sodium: 95,
      sugar: 27.4,
      vitaminA: 105,
      vitaminC: 0.3
    },
...

结果也一样存在了维格表,方便进行下一步的数据处理:

image.png

image.png

具体的技术代码可以参考我文中的 github项目的 example 示例,整体操作上面还是不复杂的,主要是 api 的对接和使用和准备种子数据的工作较多。后面的文章中我会讲一下应用。

像饮食、菜谱、营养数据还是有众多的应用场景,特别是 Fatsecret 中针对食物的份量、营养成份这些数据,对于健康、营养相关的产品会有很大的帮助。希望能对相应业务的同学有所帮助。

举报
评论 0