Power Automate (旧 Microsoft Flow) を使って fitbit の WebAPI から体重データを取得する

2019/12/13 サービス名変更伴い、タイトルおよび本文を修正

# 初めに
- Qiita 初投稿となります

いろんな方々の Qiita 投稿を見ながら、自身も勉強した内容をまとめて、記録したいと思ったため投稿に至りました。
また、当記事で扱っている Power Automate 含む、他のサービスについても**全くの素人**です。
「そんなやり方しなくても・・・」という内容がございましたら遠慮なくご指摘いただければ幸いです 。

- 記事を書いたきっかけ

2019/8/11(日)に行われた、connpassの勉強会「Microsoft Graph 勉強会 in 福岡」にて学んだ REST API の応用で、 fitbit の WebAPI も同様の考えで「API を叩けるじゃね？」から想像が膨らみ、自身の活動データを SharePoint Online に蓄積したいと思ったところがきっかけとなります。

- 今回やること

今回は Power Automate を使って fitbit の WebAPI を利用してデータを取得するまでとなります。
初心者の方でも試せるようにわかりやすい記事を心がけたいと思います。

# 環境

### fitbit の端末
- 自身の活動データを計測するために必須のアイテムです。

<img width="200" alt="IMG_20190901_143241.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/cef2d84f-19f6-d334-abb9-0f519b34bb66.jpeg">

### fitbit のアカウント登録
- fitbit を既に利用されているのであれば、カウント登録済みかと思われます
- 端末がなくてもアカウント登録と体重を記録するぐらいは可能・・・かも？

### Power Automate の有料ライセンス(Power Automate per user plan 等)
- HTTP リクエストはプレミアムコネクタとなるため、office 365 の無償範囲でのライセンスではコネクタを利用できません。
- ライセンスをお持ちでない方は、PowerApps Community Plan でも可(9月1日現在)

> [PowerApps Community Plan](https://powerapps.microsoft.com/ja-jp/communityplan/)

# 準備

### OAuth認証情報の取得
- fitbit の認証情報取得に関しては、以下の記事を参考にしました。

>「たった5分で自分だけのFitbit Clock Faceを作る」
>https://qiita.com/makopo/items/32f41128c2e055cec68f

- 取得したアクセストークンを控えておきます

# フローの作成

### 全体イメージ

全体のイメージは以下の通り。今回はすごく単純です。
<img width="468" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/2cb20b18-a3df-74e2-0abb-b16a2a7250af.png">

### 1.トリガーの作成

トリガーの作成に関しては特に指定はありません。とりあえず動かしたかったら、以下の通り手動ボタンのトリガーでもＯＫです。
<img width="138" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/51e28f73-f1ed-3395-c3f2-a30881d0998f.png">


### 2. HTTP リクエストで fitbit の WebAPI を使う

① 以下のアクションを選択します。
<img width="118" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/196afc5f-2673-713f-15e6-d6cb5a215707.png">

② 以下の通りリクエストを作成します。
<img width="460" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/1109f6f2-5dcb-05a8-ec1f-147a873b4467.png">

- 方法：`GET`
- URI ：`https://api.fitbit.com/1/user/-/body/log/weight/date/yyyy-mm-dd.json`
- ヘッダー `(KEY)Authorization  (VALUE)Bearer 取得したアクセストークン`

※VALUE値は「準備」の項の「OAuth認証情報の取得」で取得したアクセストークンを利用します。「Bearer」の後ろは半角スペースを入れてください。
※名前が「fitbit get weight」となっていますが、アクション作成時の初期値は「HTTP」です。初期値のままでＯＫです。
※詳細オプションの設定は不要です
※他の API を試したかったら、fitbit の [WebAPI リファレンス](https://dev.fitbit.com/build/reference/web-api/)を参照ください。

### 3.JSON の解析

① 以下のアクションを選択します。
<img width="106" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/56f44121-7b4a-44d6-ce5c-68d5484aa1df.png">

② 以下の内容で JSON を解析します。
<img width="461" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/af845af8-a0b7-f066-eb37-0713fd71f238.png">

- コンテンツ：`本文` ＞直前で作成した「HTTP」アクションの「本文」を指定する
- スキーマ：`スキーマ` ＞fitbit WebAPI のレスポンスは JSON で帰ってきますので、スキーマの指定を行います。

コンテンツは本文を指定することで、HTTP リクエストのレスポンスをインプットとしています。

取得した JSON データはスキーマをきちんと指定しないと、後続のアクションで使用できません。
体重に関する WebAPI の解説については [WebAPI リファレンス(体重)](https://dev.fitbit.com/build/reference/web-api/body/#weight) を参照ください。
当記事で扱っている体重に関する API であれば、以下のスキーマをそのまま利用できます。

```
{
    "type": "object",
    "properties": {
        "weight": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "bmi": {
                        "type": "number"
                    },
                    "date": {
                        "type": "string"
                    },
                    "fat": {
                        "type": "number"
                    },
                    "logId": {
                        "type": "integer"
                    },
                    "source": {
                        "type": "string"
                    },
                    "time": {
                        "type": "string"
                    },
                    "weight": {
                        "type": "number"
                    }
                },
                "required": [
                    "bmi",
                    "date",
                    "fat",
                    "logId",
                    "source",
                    "time",
                    "weight"
                ]
            }
        }
    }
}
```

そのほかの WebAPI でスキーマを作成したい場合は、「サンプルのペイロードを使用してスキーマを生成する」を選択し、サンプルのデータを利用することで生成することもできます。

- サンプルのデータを入手したい場合
私の場合は POSTMAN で fitbit の WebAPI を試して、その結果を「サンプルのペイロードを使用してスキーマを生成する」に張り付けて生成していたりします。

- 「サンプルのペイロードを使用してスキーマを生成する」の例
<img width="385" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/c1c3c9fa-ac64-d791-1ae1-89d53cb0f458.png">

# 実行結果

上手くいくと以下のような結果となります。
<img width="465" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/8bbe145d-d04f-58be-5068-98c625b858a2.png">

- JSON の解析が成功しているので、後続のアクションで「動的なコンテンツ」として扱うことができます。
- SharePoint Online のカスタムリストに登録する例
 <img width="474" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438156/f2c18327-8774-9dd7-b03c-5658baf7701d.png">

# 補足
取得したアクセストークンには有効期限があります。フローのアクション内に保存したアクセストークンは有効期限切れにより fitbit の WebAPI は リクエストを受け付けてくれなくなります。
（デフォルトでは、アクセストークンは７日で有効期限切れになる）
毎日、体重や運動記録を残したい場合、トリガーは定期実行になると思いますが、その度にアクセストークンを取得するわけにはいきません。
fitbit の WebAPI はリフレッシュトークン使ってアクセストークンを常に維持することができますので、今後はその方法を記事にしたいと思います。