筋トレ系APIの探し方&使ってみた


[筋トレ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/workout)という文字を見つけて何か書きたくなったので、無理やりネタをみつけてきました！

フィットネス系のパブリックデータかAPIが公開されてれば、それ使ってみるのありかな〜と思ってググったらいいの発見。

ProgrammableWebというAPIの情報をあつめたサイトにフィットネスAPIを集約しているページが！
https://www.programmableweb.com/category/fitness/api
(2020/12/05時点で登録API数:119)

ウェアラブルデバイスで集積した情報を扱ったり、サイトにヘルスケア情報などを登録するものからいろいろあって楽しそうです。

# 使ってみる

数あるAPIの中から適当に [wger Workout Manager REST API](https://wger.de/en/software/api) というのに目をつけたので使ってみます。

> Wger Workout Manager is an open source web application for tracking your fitness and managing your exercises. 

# 準備

## 登録

まずWger Workout Manager自体に[ユーザー登録](https://wger.de/en/user/registration)します。

![Register.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/12883409-6b63-0bab-09c2-35d71b3452d5.png)

適当に入力して登録します(すみません本当はちゃんと入力しました)


## APIキーの発行

登録後に[REST APIのページ](https://wger.de/en/software/api)の「Generate API KEY」を押すと発行できます。
１回エラーみたいなのが出たけど、もう１回やったらいけました。

![API_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/2c0dce74-d5f3-0d31-e0c8-02d79b323a5b.png)

有効なAPIキーはユーザーあたり1つのように見えました。
「Delete current API key and generate new one」すると現在のキーを破棄し新しいキーを発行することができます。

## (オプション)ウェブの画面から何かしら入力

![Add_weight_entry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/f8b16f60-e6f8-4476-9678-19dfa1493d3d.png)

ワークアウト履歴やスケジュールを登録する画面もありましたが、使い方がよくわからなかったので体重だけ登録しました。

# APIを叩く

## Example with curl

APIキー発行時に提示されたcurlをとりあえず叩きます。

```shell
$ curl -X GET https://wger.de/api/v2/workout/ -H 'Authorization: Token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

{"count":1,"next":null,"previous":null,"results":[{"id":xxxxxx,"creation_date":"2020-12-05","comment":""}]}
```
なんか返ってきたんでたぶんいけてる。

## 一覧
https://wger.de/api/v2/
ルートのエンドポイントを開くと、一覧が表示されて便利。ブラウザで開くリンクはさっき発行したAPIキーが適用されているようで、リンクたたけば結果が表示される。

![REST_API_-_Api_Root.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/fc99c92b-5c64-800c-7aa8-c4e0453a1ef7.png)




## weightentry(体重の履歴)

### GET
https://wger.de/api/v2/weightentry/

```json

{
    "count": 1,
    "next": null
    "previous": null,
    "results": [
        {
            "id": 000000,
            "user": 111111,
            "date": "2020-12-05",
            "weight": "81.50"
        }
    ]
}
```

さっき入力した体重が表示されてしまいました。恥ずかしいです。

### POST
APIから体重を追記してみます。使い慣れているPostmanから打ってみます。

ヘッダこんな感じで入れて
![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/33e78d7a-485e-4db5-b45c-d5132c15924e.png)

覚えているいちばん昔の自分の体重を入れて打ってみます。


![Postman_と_codeseries-serverless-tutorial.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/db2a3ae1-ed54-3591-f63e-d2de0dbdef2f.png)

↓

![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/b72eb0c9-0e17-3575-3f90-243740b818a6.png)

怒られました。体重30kg以上じゃないとダメらしいです。

仕方ないので測ってないけど適当に最近の体重を打ってみます。


![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/4c20bbd7-7b6e-e2d1-debb-c0a6bd04eb51.png)

↓

![Postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/caffedef-2077-a54c-02f2-fa6406557acb.png)

いけました！

GETしてみると反映されています
https://wger.de/api/v2/weightentry/

```json
{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 222222,
            "user": 111111,
            "date": "2020-12-01",
            "weight": "81.75"
        },
        {
            "id": 000000,
            "user": 111111,
            "date": "2020-12-05",
            "weight": "81.50"
        }
    ]
}
```

## exercise(エクササイズ情報)

さっきはユーザーに紐づいた情報をとってみましたが、提供されているエクササイズデータを取得してみます。

https://wger.de/api/v2/exercise/

```json
{
    "count": 409,
    "next": "https://wger.de/api/v2/exercise/?limit=20&offset=20",
    "previous": null,
    "results": [
        {
            "id": 345,
            "license_author": "deusinvictus",
            "status": "2",
            "description": "
Two Handed Russian Style Kettlebell swing",
            "name": "2 Handed Kettlebell Swing",
            "name_original": "2 Handed Kettlebell swing",
            "creation_date": "2015-08-03",
            "uuid": "c788d643-150a-4ac7-97ef-84643c6419bf",
            "license": 2,
            "category": 10,
            "language": 2,
            "muscles": [],
            "muscles_secondary": [],
            "equipment": [
                10
            ]
        },
        {
            "id": 174,
            "license_author": "flori",
            "status": "2",
            "description": "
\n
in eine aufrechte Position setzen, bei der die Beine hüftbreit geöffnet sind\n
den Rücken, die Knie und die Oberschenkelaußenseite an die jeweiligen Polster pressen\n
mit den Händen an den Griffen festhalten\n
die Oberschenkel bis zum Anschlagpunkt der Hebelarme auseinander drücken\n
danach die Beine wieder zusammen führen\n
das Gesäß nicht vom Sitz abheben\n
beim Auseinanderdrücken der Hebelarme aus- und beim Zusammenführen einatmen\n",
            "name": "Abduktoren-Maschine",
            "name_original": "Abduktoren-Maschine",
            "creation_date": "2013-07-19",
            "uuid": "99881bdd-43d7-4c3b-82ed-9c187d0455b7",
            "license": 1,
            "category": 9,
            "language": 1,
            "muscles": [
                8,
                6
            ],
            "muscles_secondary": [
                11
            ],
            "equipment": []
        }
...
```

こんな感じでいっぱいでてきます。今現在409あって、ページのデフォだと20個ずつ取ってるようで次ページurlもnextで返ってきてますね。

対象筋の情報や

```json
"muscles": [
    8,
    6
]
```

使用器具など

```json
 "equipment": [
   10
]
```

属性もいろいろ載っています。この番号が何に対応しているかは
https://wger.de/api/v2/muscle/
https://wger.de/api/v2/equipment/
で確認ができます。

パスにmuscleって入ってるのいいですね。
equipmentのほうも叩くとBarbell、Bench、Kettlebellなんかが返ってきてAPI叩くだけで筋肥大しそうです。

けっこうおもしろかったので、気が向いたら是非:lifter: