Python からFitbit のデータを取得する
Table of Contents
はじめに
主にランニング記録用に、去年の9月にFitbit charge2 (official)を購入した。
いわゆる活動量計・スマートウォッチで、歩数や心拍数、ランニングなどの記録を取ってくれる。 スマホと連動して、GPSで取得したランニングコースなども見ることができる。 各記録はスマホアプリ、Webブラウザからも確認可能。
(おすすめのバンドは こちら(Amazon) 。取り外しがとても楽。)
このFitbit、開発者向けの環境が充実している。 Fitbit API が公開されていて、最新機種のFitbit ionic では、専用のSDKまで用意されている。
今回は以下の python-fitbit を使って、これまで記録した歩数や心拍数を取得してみる。
環境
- OS : Windows10
- Python : 3.6.4
準備
準備の流れは以下の通り。 解説している記事は結構あるので詳細は割愛します。
- Fitbitのページで、
client_id
,client_secret
を発行する。 - fitbit-python を用いて
refresh_token
,access_token
を取得する。
client_id
, client_secret
の取得
画面参考: Connect yout app to Fitbit
Fitbit にログインした状態で、下記にアクセスする。
https://dev.fitbit.com/apps/new
Register an application フォームに記入する。下記パラメータ以外は適当でOK。
- OAuth 2.0 Application Type: Personal
- Callback URL: ttp://127.0.0.1:8080/
- Default Access Type: Read-Only
出てきたOAuth2.0 Client IDと Client Secret をメモする。
refresh_token
, access_token
の取得
事前にpython-fitbit をDLしておく。
Requirements を参考に以下を実行。
pip install python-dateutil
pip install requests-oauthlib
- python-fitbit-masterディレクトリ下で
pip install -r .\requirements\base.txt
gather_keys_oauth2.py の実行に必要なパッケージをインストール。
pip install fitbit
pip install cherrypy
gather_keys_oauth2.py を実行する。
python gather_keys_oauth2.py [client_id] [client_secret]
出てきた access_token
, refresh_token
をメモする。
データの取得
今回は 1日の活動の概要を取得する activities
メソッドを使用する。
import fitbit import datetime # CLIENT_ID, CLIENT_SECRET CLIENT_ID = "xxx" CLIENT_SECRET = "xxx" # ACCESS TOKEN, REFRESH TOKEN ACCESS_TOKEN = "xxx" REFRESH_TOKEN = "xxx" # get activities summary in 2017/11/20 client = fitbit.Fitbit(CLIENT_ID, CLIENT_SECRET, access_token=ACCESS_TOKEN, refresh_token=REFRESH_TOKEN) date = datetime.datetime.strptime("2017-11-20", "%Y-%m-%d") print(client.activities(date=date))
cleient.activities(date=date)
の返り値は下記のようなmap オブジェクト。
ちなみに、データ取得のためのリクエストには制限がある(1時間に150)。
{'activities': [], 'goals': {'activeMinutes': 30, 'caloriesOut': 2542, 'distance': 5, 'floors': 10, 'steps': 10000}, 'summary': {'activeScore': -1, 'activityCalories': 974, 'caloriesBMR': 1467, 'caloriesOut': 2353, 'distances': [{'activity': 'total', 'distance': 6.51}, {'activity': 'tracker', 'distance': 6.51}, {'activity': 'loggedActivities', 'distance': 0}, {'activity': 'veryActive', 'distance': 4.38}, {'activity': 'moderatelyActive', 'distance': 0.3}, {'activity': 'lightlyActive', 'distance': 1.82}, {'activity': 'sedentaryActive', 'distance': 0}], 'elevation': 270, 'fairlyActiveMinutes': 8, 'floors': 27, 'heartRateZones': [{'caloriesOut': 857.86064, 'max': 98, 'min': 30, 'minutes': 602, 'name': '範囲外'}, {'caloriesOut': 349.27984, 'max': 137, 'min': 98, 'minutes': 64, 'name': '脂肪燃焼'}, {'caloriesOut': 332.46304, 'max': 166, 'min': 137, 'minutes': 34, 'name': '有酸素運動'}, {'caloriesOut': 62.57888, 'max': 220, 'min': 166, 'minutes': 6, 'name': 'ピーク'}], 'lightlyActiveMinutes': 101, 'marginalCalories': 684, 'restingHeartRate': 67, 'sedentaryMinutes': 1271, 'steps': 13862, 'veryActiveMinutes': 60 } }
これを数カ月分とって、 summary > restingHeartRate
(安静時心拍数) のグラフをプロットしてみる。
冬は心拍数が高くなるらしい。よかった。