Withingsの体重計のデータを、FitbitのAPIから取得することができました。今回は、取得した体重データをスプレッドシートに記録します。
デバイスと環境
体重計・・・Withings「Body +」
活動量計・・・Fitbit「Alta HR」
Windows10
Node.js 14.15.4
スプレッドシートをサーバー化
まずは記録用のスプレッドシートを簡易サーバーとして設定ます。
「Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法」を参考にしながら、下記のコードを用意しました。
1 2 3 4 5 6 7 8 9 10 11 |
function doPost(e) { let ss = SpreadsheetApp.getActive(), sheet = ss.getActiveSheet(), data = [], contents = e.postData.contents.split("&"); for(let i=0;contents[i];i++) { let kv = contents[i].split('='); data[i]=kv[1]; } sheet.appendRow(data); } |
デプロイ時にWebアプリケーションURLが発行されます。
Node.jsでFitbitのAPIを取得
Fitbitの体重データAPIの取得は、Node.jsを利用しました。
Fitbitのトークンと、先ほどスプレッドシートで発行したWebアプリケーションURLを使って、下記のJavaScriptを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
const axios = require('axios'); const FITBIT_TOKEN = "[Fitbitのトークン]"; const GAS_URL = "[スプレッドシートWebアプリケーションURL]"; const getFitbit = (url) => { let config = { baseURL: 'https://api.fitbit.com/1', url: `/user/[user-id]/${url}`, method: 'get', headers: {'Authorization': `Bearer ${FITBIT_TOKEN}`} }; axios.request(config).then((res) => { let data = res.data.weight.slice(-1)[0];//最新のデータ if(!data.fat){ data = res.data.weight.slice(-2)[0];//体脂肪率がなければ1つ前のデータ } postData(GAS_URL, `dt=${data.date} ${data.time}&weight=${data.weight}&fat=${data.fat.toFixed(1)}&bmi=${data.bmi}`); }); }; const postData = (url, data) => { axios.post(url, data) .then(function (response) { console.log("書き込み完了"); }) }; getFitbit("body/log/weight/date/today.json"); |
これをapp.jsなどの名前で保存して、コマンドプロントで「node app.js」を実行すれば、スプレッドシートに体重・体脂肪などが記入されていきます。
体重データ取得の注意
Fitbitの体重取得APIで、不思議な結果が返ってくることがあります。
なぜか今日23時59分59秒の体重が返ってきます。まだ朝です。
取得しているデータをNode.jsのログで見てみます。
23時59分59秒に、fat(体脂肪率)がないデータが存在します。fatが記録できないのも問題なので、このデータは除外しましょう。前述のコードでは、fatがない時に1つ前のデータを取得するようにしています。
なぜこのデータが存在するのかは分かっていません。
スプレッドシートの確認
問題なく動作していれば、スプレッドシートに今日の体重が追記されます。
今回作ったNode.jsアプリを1日1回、体重を測った後に実行させると、体重推移を確認できます。
日付と体重の列を指定してグラフを作成すれば、データと連動してグラフも更新されていきます。