Withings APIの使い方｜オリジナル健康アプリの第一歩

## はじめに
健康て大事ですよね。
リモートワークで動く機会が減り、体重が増えました。
ダイエットのためWithingsというメーカーの体重計を買いまして、
価格はおよそ1万円（ちょっとお高め）

[Withings Body + フランス生まれのスマート体重計 ブラック Wi-Fi/Bluetooth対応 体組成計](https://www.amazon.co.jp/dp/B071LNJTVH)

このメーカーのデバイスはWebAPIを通じて自分の計測データを取得できるそうです。
自分だけのオリジナルなアプリが作れると思うとワクワクしますね。

Withings APIを使って体重データを取得する方法を紹介します。

## Withings APIとは

Withins APIを使うとWithingsデバイスで集められた健康データにアクセスができます。

私であれば登録した基礎データ（身長など）や体重データを取得できるでしょう。

APIを通じて得られるデータは購入したデバイスによって変わります。
Withingsでは体重計以外にもスマートウォッチやスマート睡眠パッドが売られていて、扱いたいデータによって購入するデバイスを変えても面白いかもしれません。

APIを利用するには開発用アカウントを作成しアプリケーションを登録する必要があります。

### 開発用アカウントを作成する

はじめにWithingsの[開発者ポータル](https://developer.withings.com/developer-guide/v3/integration-guide/public-health-data-api/developer-account/create-your-accesses-no-medical-cloud/)にアクセスし、開発用アカウントを作成します。

アカウントを作成するときはSing In/Go to Developer Dashboard をクリックします。
![スクリーンショット 2024-02-23 11.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/ac87750e-c0c5-d1bd-7902-05b8d348a107.png)

### アプリケーションを作成する
アカウントを作るとAPIキーを発行できます。
Developer DashboardからCreate an applicationをクリックしアプリケーションを作成します。

![スクリーンショット 2024-02-23 12.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/97b2a06c-a561-ba6b-6bd3-684b1f914df4.png)

1.Application creationでは「Pubic API integration」を選びます。
![スクリーンショット 2024-02-23 12.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/1df2c1d1-de21-0962-2391-88f5704d9dd7.png)

2.Informationではアプリ名、アプリ詳細、そしてリダイレクトURLを入力します。
リダイレクトURLについて私はlocalhostを指定しました。
認証コードを受け取れるアクセス先を指定してあげましょう。

リダイレクトURLの設定方法はこちらで紹介しているので是非見てください。
[リダイレクトURLとは？URLを作成しアクセストークンを受け取る方法を紹介](https://tellingbook.com/redirect-url-get-access-token/)

![スクリーンショット 2024-02-23 12.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/709e69d6-bceb-af7f-5513-eb3b7b2b4089.png)

以上でアプリケーションの設定は完了です。
ClientIDとSecretキーが発行されました。

![スクリーンショット 2024-02-23 12.11.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/be486ff7-06a3-6983-a6d9-403e8d848712.png)

## OAuth2.0認証でアクセストークンを取得する
Withins APIではOAuth2.0を使いユーザーを認証します。

認証方法は2通りありますが、今回はWeb認証フロー（Web Authorization Flow）を実施します。

[OAuth2](https://developer.withings.com/api-reference)について詳しくは公式リファレンスを確認ください。

### 認証コードを取得する

認証コードを得るには認証URLをブラウザで実行する必要があります。
実行するURLはこちらです。
```
https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=YOUR_CLIENT_ID&scope=user.info,user.metrics,user.activity&redirect_uri=YOUR_REDIRECT_URI&state=YOUR_STATE
```

一部変数を置き換えましょう。
- YOUR_CLIENT_ID：先ほど作成したアプリケーションのclient_id
- YOUR_REDIRECT_URI：アプリケーションで指定したredirect_url
- YOUR_STATE：なんでも良い（今回はhoge）

認証URLを実行すると承認を求められるので許可します。

![スクリーンショット 2024-02-23 12.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/16f3579c-e8ef-5ad6-9659-a8dd5d78bf11.png)

許可したことでURLが変化しました。
code以下が認証コードです。
このコードを使い次はリクエストトークン（アクセストークン）を取得します。

![スクリーンショット 2024-02-23 12.24.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/4aeaaec2-42dc-d3df-bbf4-7d5841ffb518.png)

※注意
> Please note that the authorization code is only valid for 30 seconds.

認証コードの有効時間は30秒しかありません。
30秒を過ぎると再度認証コードを取得しないといけないので先にリクエストトークンを受け取る用のスクリプトを用意するのが良いでしょう。

有効時間を過ぎるとこのようなエラーが返ります。

```json
{
  "status": 503,
  "body": {},
  "error": "Invalid Params: invalid code"
}
```


### リクエストトークンを取得する

エンドポイント：https://wbsapi.withings.net/v2/oauth2 にクライアント情報と認証コードを送りリクエストトークンを取得します。

```bash
# クライアントID
CLIENT_ID="xxxxxxxxxxxxx"
# クライアントシークレット
CLIENT_SECRET="yyyyyyyyyyyyyyyyy"
# 認証コード
CODE="zzzzzzzzzzzzzzzzz"
# リダイレクトURI
REDIRECT_URI="http://localhost:8080/oauth2/callback"

curl -X POST "https://wbsapi.withings.net/v2/oauth2" \
     -d "action=requesttoken" \
     -d "grant_type=authorization_code" \
     -d "client_id=${CLIENT_ID}" \
     -d "client_secret=${CLIENT_SECRET}" \
     -d "code=${CODE}" \
     -d "redirect_uri=${REDIRECT_URI}" | jq
```

実行結果
![スクリーンショット 2024-02-23 12.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/0ed2cfbd-650c-3307-210a-82481c982a0b.png)

アクセストークンやリフレッシュトークが返ってきましたね。

## 体重データを取得する

2023年12月1日~12月7日の体重データを取得します。
開始日時（startdate）と終了日時（enddate）はUNIXタイムスタンプである必要があります。
そしてmeastype=1を指定します。

パラメーターや指定する数値で戻り値が変わるので詳しくはリファレンスを確認ください。
[Measure - Getmeas](https://developer.withings.com/api-reference#tag/measure)

```bash
curl --header "Authorization: Bearer ACCESS_TOKEN" \
		--data "action=getmeas" \
        --data "meastype=1" \
        --data "startdate=1701388800" \
        --data "enddate=1701907200" \
        --data "category=1" \
        'https://wbsapi.withings.net/measure' | jq
```

実行結果
![スクリーンショット 2024-02-23 14.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/94eeccfb-15c8-9511-afb0-253885bcdcbe.png)


体重はmeasuresのvalueを確認します。
65600は65.6kgを意味します。

作成時間（created=1701905483）を日本時間に直すと2023年12月07日です。

![IMG_4518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449065/ef71a739-c569-72cf-ce77-7fa7c4681552.jpeg)

0.1kgズレていますが平均とあるのでこの日は複数回計測したようです。
そのうちの1回が65.6kgだったのでしょう。

正しく取得できていますね！

## まとめ
今回はWithings APIを使って体重データを取得する方法を紹介しました。

体重以外にも体脂肪率、他のデバイスを購入すれば睡眠データなどもAPIで取れるそうです。

このAPIを使ったオリジナル健康アプリでも作ろうかと思いました。