Python からFitbit のデータを取得する

Table of Contents

  1. はじめに
  2. 準備
    1. client_id, client_secret の取得
    2. refresh_token, access_token の取得
  3. データの取得

はじめに

主にランニング記録用に、去年の9月にFitbit charge2 (official)を購入した。

いわゆる活動量計・スマートウォッチで、歩数や心拍数、ランニングなどの記録を取ってくれる。 スマホと連動して、GPSで取得したランニングコースなども見ることができる。 各記録はスマホアプリ、Webブラウザからも確認可能。

(おすすめのバンドは こちら(Amazon) 。取り外しがとても楽。)


このFitbit、開発者向けの環境が充実している。 Fitbit API が公開されていて、最新機種のFitbit ionic では、専用のSDKまで用意されている。

Fitbit studio

今回は以下の python-fitbit を使って、これまで記録した歩数や心拍数を取得してみる。

環境

  • OS : Windows10
  • Python : 3.6.4

準備

準備の流れは以下の通り。 解説している記事は結構あるので詳細は割愛します。

  1. Fitbitのページで、 client_id, client_secret を発行する。
  2. 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 を参考に以下を実行。

  1. pip install python-dateutil
  2. pip install requests-oauthlib
  3. python-fitbit-masterディレクトリ下で pip install -r .\requirements\base.txt

gather_keys_oauth2.py の実行に必要なパッケージをインストール。

  1. pip install fitbit
  2. 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 (安静時心拍数) のグラフをプロットしてみる。

冬は心拍数が高くなるらしい。よかった。