Fitbitの水摂取量を記録するツールを作った

はじめに

Fitbitでは,水の摂取量を記録することができます.
しかし,記録するためにはFitbitやアプリで摂取量を入力する必要があります.
これを簡単にしたかったので,FitbitのAPIを使って水の摂取量を記録するアプリケーションを作りました.

コーディング

コードはGitHubで公開しています.
github.com
今回はTypeScriptで書いてみました.
アプリケーションのルートパスにリクエストを投げると,リクエストボディーのamountというパラメーターの値をFitbit側に記録します.
FitbitのAPIを使って水の摂取量を記録するには,以下のエンドポイントにPOSTリクエストを投げればOKです.

POST https://api.fitbit.com/1/user/-/foods/log/water.json?amount=${body.amount}&date=${timestamp}

必要なスコープはnutritionだけでOKです.
認証用のBearer Tokenは予め決めた期間を過ぎると無効になります.その場合はexpired_tokenというエラーメッセージが返ってくるので,必要に応じてトークンを更新します.
トークンを更新する際には,以下のエンドポイントにPOSTリクエストを投げます.

POST https://api.fitbit.com/oauth2/token?grant_type=refresh_token&refresh_token=${refresh_token}

このとき,Content-Typeヘッダにはapplication/x-www-form-urlencodedを指定します.また,AuthorizationヘッダにはBearer TokenではなくBasic Tokenを指定します.Basic Tokenは[client_id]:[client_secret]Base64エンコードしたものです.
更新したトークンはsecrets.jsonというファイルに書き込んで保存しています.

スマートスピーカーから使う

Google Homeに話しかけるだけで勝手に記録できるようにしました.Google Homeと今回作ったアプリケーションとの連携はiftttで行っています.
if this then thatのthisにGoogle Assistantを,thatにWebhooksを設定しています.
Google Homeに「水の摂取 $ を記録」と話しかけたときにアプレットが動くように設定します.$は任意の数字を表します.
その後,WebhooksのURLにアプリケーションのURLを,MethodにPOSTを,Content Typeにapplication/jsonを,bodyに{ "amount": {{TextField}} }を設定します.
これで,Google Homeに「水の摂取 200 を記録」と話しかければ200mlの水分摂取をFitbitに記録するようになります.

おわりに

Fitbitの水分摂取量を記録する機能は,これまであまり使っていませんでした.
アプリから記録するのもFitbitで入力するのも微妙にステップ数が多いので結構忘れがちです.
スマートスピーカーに話しかけるだけであれば,サクッとできるので結構便利です.
GitHubにはDockerfileも置いてあるので,もしよかったら使ってみてください.

参考サイト

qiita.com