Linuxを日常的に使う実験ブログ

fitbit Charge 2で取得したライフログにAPI経由でアクセスする

 2017-07-09

 Linux全般

こんにちは。今回のテーマは『fitbit Charge 2で取得したライフログにAPI経由でアクセスする』です。最近、オンラインショップだけでなく家電ショップでもアクティブトラッカーの販売が目に付くようになりました。健康意識の高い人のための特別なガジェットだったアクティブトラッカーがより身近な存在になってきているのかなという印象を受けました。今回はfitbit社がアクティブトラッカーを用いて取得したデータをAPI経由で取得してみます。 [adsense02] 【目次】 アクティブトラッカーって? fitbit社のアクティブトラッカー Charge 2を使ってみた fitbit APIは機能満載 fitbitアカウントを作成 アプリケーションの登録 OAuth認証 fitbit APIへのアクセス

アクティブトラッカーって?

アクティブトラッカーと聞いてもピンと来ない方のために簡単に説明すると、アクティブトラッカーとは腕等に装着することで心拍数や歩数、消費カロリー、睡眠時間を記録してくれるデバイスです。ウェアラブル端末の一種であり、スマートウォッチのカテゴリーとして扱われることもあります。(スマートウォッチの定義自体が曖昧なのですが・・・) アクティブトラッカーへの事業に参入していくるメーカーも増えてきており、家電ショップで見かけるだけでもJAWBONE,fitbit,GARMIN,Xiaomi,EPSON,SONY,Withings(現NOKIA)等のメーカーが凌ぎを削っている状態です。

fitbit社のアクティブトラッカー Charge 2を使ってみた

アクティブトラッカー(活量計)が市場に出回り始めたのは2013年ごろであったと思いますが、その頃は健康意識が高かったり、ITガジェットに敏感な一部の人のためのものという感じがあり、あまり一般的ではなかったような印象を持っていました。2017年現在では大手家電ショップでもスマートフォン売り場や、ヘルスケア商品棚に陳列され一般市民にも浸透してきた感があります。 ネット上の情報からスペックを比較してfitbit Charge 2を入手しました。本体のレビューは本題から逸れるので割愛しますが、睡眠時のログがレム睡眠を含めて詳細に取れるのが非常に気に入っています。

| |

[画像のリンク先はAmazonの商品ページです] fitbit製のトラッカーは「無理のないフィットネスを応援する」というコンセプトのもとに日常生活の心拍数や運動量を高い精度(秒単位での測定)で把握できる能力を持っています。フィットネスに特化したエクササイズモード(機種によってはマルチスポーツモード)があり、運動時には更に緻密な測定も可能になります。このような特徴から、きめの細かいライフログを取得したい方にはオススメできるメーカーだと思います。

fitbit APIは機能満載

筆者が本記事を書こうと思った経緯はfitbitのハード的な魅力よりもむしろ充実したAPIに魅力を感じたからです。例えばfitbitの公式アプリでは心拍数は5分間隔で表示されますが、自作のプログラムからAPIにアクセスすれば秒刻みの心拍データを取得ることも可能です。(後述しますが、日中の細かいデータにはデベロッパー本人のデータにしかアクセスできません。)筆者の場合は健康意識からよりもプログラミングで遊べるという動機からfitbitを触ってみました。 他のメーカーではJOWBONEやWithigns等のメーカーがAPIを公開していますが、APIリファレンスを見た限りではfitbitほどの機能は提供されていない印象です。時間があれば他メーカーのAPIも触ってみたいですね。

fitbitアカウントを作成

まずはfitbitアカウントを作らないと始まりません。https://www.fitbit.com/loginにアクセスしてアカウントを作成しましょう。メールアドレスとパスワードだけで簡単に作れます。 このアカウントとfitbit端末を結びつけて装着することでアカウントにデータが蓄積されていきます。運動するも良し、ダラダラするも良し、fitbit端末がバイタル情報を取得して作成したアカウントにデータを蓄積してくれます。(端末からBluetooth通信でスマートフォンアプリを経由してサーバーにデータ蓄積するというのがデータの流れです)

アプリケーションの登録

登録の種類は3種類

アプリケーション登録の種類は以下の3種類があります。

  • Server
  • Client
  • Personal

このカテゴライズが非常に分かりづらいのですが、ServerとClientは認証時の秘密鍵の有無(OAuth2.0の機密クライアントとパブリッククライアント)の違いですが、Personalだけはちょっと他の二つとは異なります。

詳細なライフログへのアクセス可能なのは開発者本人のみ

まず、前提としてfitbit APIで詳細な「日中データ(秒単位や分単位のデータ)」にアクセスできるのはプログラム開発者本人のアカウントのデータのみです。(※1)たとえ家族や友人の同意があっても開発用のアカウントと異なる場合はアクセスできません。そして、自分自身のデータにアクセスするにもアプリケーションタイプをPersonalにしないといけないという2重の制限がついています。 それだけライフログをプライベートな情報と考えていると言うことですね。今回はPersonalでアプリケーションを登録し、自分自身の心拍データを秒間単位で取得してみます。 ※1:自作のプログラムから他人の日中データにアクセスしたい場合はfitbit社いレビュー依頼して特別に許可を得ないと駄目みたいですね。

登録作業

登録作業自体はフォームに必要事項を記入するだけなので難しくはありません。ただし、あとの認証作業のことを考慮して「Callback URL」は”http://127.0.0.1:8080/“としておきます。ご自身でOAuth認証を実装する場合は適宜変更して下さい。 登録が完了すると以下の様な画面になります。クライアントIDやクライアントシークレットは後ほど必要になるのでメモしておきます。

OAuth認証

OAuth2.0での認証となりますので、一般的な方法で認証すれば良いのですが、ここではpython-fitbitというライブラリを用いて簡単に行いたいと思います。筆者の環境はArch Linuxですが、適宜ご自身の環境に合わせて読み替えていただければ結構です。

python-fitbitの準備

$ git clone https://github.com/orcasgit/python-fitbit $ cd python-fitbit $ sudo pip3 install -r requirements/dev.txt

gather_key_oauth2.pyによる認証

準備が整ったのでgather_key_oauth2.pyを使って認証を行います。以下のコマンドを実行します。

$ python3 ./gather_key_oauth2.py <client id> <client secret>

ウェブブラウザで以下のようなページがひらきますので先程アプリケーションを登録したアカウントでログインします。 下図のような画面になるので「許可」をクリックします。 これで認証は終わりました。ウェブブラウザ上には以下のような画面が表示されます。 以下のような画面がターミナルに表示されるのでアクセストークンとリフレッシュトークンは後ほどAPIにアクセスする際に必要になるのでメモしておきます。

fitbit APIへのアクセス

fitbit APIは機能がとても多く、ここで全ての説明することは困難です。APIリファレンス(英語)をご覧いただいて興味のある機能を使ってみるのでも面白いと思います。今回は心拍数を取得してみることにしますのでGet Heart Rate Intraday Time Seriesの機能を使用します。

Pythonでコードを書いてみる

APIにアクセスしてJSONを取得するだけであればCRULコマンドやRESTクライアントを用いれば十分なのですが、もう少し遊びたいのでPythonでアクセスして表形式で出力する簡単なコードを書いてみます。今回はサンプルコードなのでトークンの更新処理は省きました。トークン更新についてはhttps://dev.fitbit.com/docs/oauth2/#refreshing-tokensをご覧ください。 先程紹介したpytohn-fitbitを使用する手もあるのですが、HTTPリクエストしてJSON取得するだけの簡単なコードですので自作します。今回は取得したJSONをパースしてtexttableモジュールを使って表にしてみたいと思います。 サンプルコードは以下のようになります。標準出力に表形式で出力するだけでなく、CSVファイルを作成したりプロット用のモジュールを使うともっと面白いことが出来ると思います。 サンプルコード [python] #! /usr/bin/python3 import requests from requests.auth import HTTPBasicAuth as hba import json import texttable as tt CLIENT_ID = “<クライアントID>” CLIENT_SECRET = “<クライアントシークレット>” ACCESS_TOKEN = “<アクセストークン>” REFRESH_TOKEN = “<リフレッシュトークン>” FITBIT_BASE_URL = “https://api.fitbit.com/” def getHeartRate(): """ 心拍数を秒単位で取得する """ api_ver = “1” detail_level = “1sec” date = “2017-05-13” start_time = “15:00” end_time = “15:15” url = FITBIT_BASE_URL + api_ver + “/user/-/activities/heart/date/” + \ date + “/1d/” + detail_level + “/time/” + start_time + ”/” + \ end_time + “.json” headers = {“Authorization” : “Bearer ” + ACCESS_TOKEN} res = requests.get(url,headers=headers) jsonStr = json.loads(res.text) return res.text def showTable(res_str): ''' JSONをパースしてテーブル形式で出力を行う ''' res_dic = json.loads(res_str) datas = res_dic[“activities-heart-intraday”][“dataset”] row_list = [[“TIME”,“HEAT RATE”]] for data in datas: heart_rate_list = [] heart_rate_list.append(data[“time”]) heart_rate_list.append(data[“value”]) row_list.append(heart_rate_list) table = tt.Texttable() table.set_cols_dtype([“t”,“t”]) table.set_cols_align([“l”,“r”]) table.add_rows(row_list) print(table.draw()) # 表の出力 if __name__ == “__main__”: showTable(getHeartRate()) [/python] 出力例 一部ですが、こんな感じに出力されます。

最後に

今は無料で公開されているWEB APIが沢山あり大変便利になっています。プログラミングの文法は一通り勉強したけどイマイチ何を作っていいか分からないという方は、いろいろな企業や団体が公開しているAPIを調査してみるのも1つの道だと思います。APIが提供するサービスを上手く取り入れて素敵なWEBアプリやモバイルアプリを作ってみてはいかがでしょうか。 [adsense]