俺のアウトプット

調べたこと、試したことを書きます

Fitbit APIをcurlで叩いてみた

Fitbitしていますか?

Fitbitとは腕につけて、歩数や心拍数、登った階数、カロリーなどを計測してくれるリスバンドタイプの活動量計です。

www.fitbit.com

自分は普段からFitbitを身に着けています。
とにかくよく歩きます。
アイデアを整理しながら歩いたり、たまに無になって歩いたり。。

f:id:kitsugi:20180903212213p:plain

記録を見ると、シベリア鉄道の全長を超えていました。
目指せ、世界一周ですね。

このFitbitはWeb APIが公開されており、自分のデータを取得することができます。

早速試してみましょう。

アプリケーションの登録

その前にアプリケーションを登録する必要があります。

https://dev.fitbit.com/apps/new

試すだけなので、URLはローカルホストにします。

項目
Application Name 任意
Description 10文字以上
Application Website http://localhost
Organization 任意
Organization Website http://localhost
Terms Of Service Url http://localhost
Privacy Policy Url http://localhost
OAuth 2.0 Application Type Personal
Callback URL http://127.0.0.1:8080
Default Access Type Read-Only

登録後、[OAuth 2.0 tutorial page]リンクをクリックします。

f:id:kitsugi:20180903230103p:plain

OAuth 2.0 チュートリアルページ

このチュートリアルページで、アクセストークンとリフレッシュトークン、およびFitbit API用のcurlコマンドを取得できます。

  1. Flow type を Authorization Code Flow に選択します。
  2. リンクをクリックします。

f:id:kitsugi:20180903230220p:plain

アクセス許可を求める画面が表示されるので、すべて許可するを選択して[許可]ボタンをクリックします。

f:id:kitsugi:20180903231029p:plain

Callback URLをローカルホストに設定しているため、サーバーに接続できずエラー画面が表示されます。

アドレスバー URL内にある40桁のコード値をクリップボードにコピーします。 末尾の#_=_は不要です。

http://127.0.0.1:8080/?code=0123456789012345678901234567890123456789#_=_

コピーしたコード値を、下図のCodeテキストボックス(1番)にペーストします。

トークン取得用のcurlコマンドが表示(2番)されます。 このトークン取得用のcurlコマンドをコピーします。

f:id:kitsugi:20180904053543p:plain

コピーしたトークン取得用のcurlコマンドをローカルのターミナル上にペーストしてcurlを叩きます。

$ curl -X POST -i -H 'Authorization: Basic **********' -H 'Content-Type: application/x-www-form-urlencoded' -d "clientId=******" -d "grant_type=authorization_code" -d "redirect_uri=http%3A%2F%2F127.0.0.1%3A8080" -d "code=**********" https://api.fitbit.com/oauth2/token
HTTP/2 200 
date: Mon, 03 Sep 2018 20:26:42 GMT
content-type: application/json;charset=UTF-8
vary: Origin,Accept-Encoding
cache-control: no-cache, private
content-language: ja-JP
x-frame-options: SAMEORIGIN
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 4518f4ac8f3e94d5-NRT

{"access_token":"**********","expires_in":28800,"refresh_token":"**********","scope":"nutrition heartrate social activity profile sleep weight settings location","token_type":"Bearer","user_id":"******"}

HTTPステータスコード 200が返ってきていたら成功です。 レスポンスボディのJSON結果をコピーします。

テキストエリア(3番)にJSON結果をペーストします。

アクセストークンとリフレッシュトークンが表示(4番)され、プロフィール取得用のcurlコマンドが表示(5番)されます。

curl -i -H "Authorization: Bearer **********.**********" https://api.fitbit.com/1/user/-/profile.json

curlを叩くとプロフィールが取得されます。 URL中の - はカレントユーザーを意味します。

このURLのprofile箇所を変更してcurlを叩くと、各種データを取得できます。

アクセストークンとリフレッシュトークンはプログラムからOAuth2.0認証を利用する場合に利用できます。

URLエンドポイント

いくつかのエンドポイントを見てみましょう。

エンドポイント 説明
activities/today 今日のアクティビティを取得
activities/steps/date/2018-09-03/1d 指定した日の歩数を取得
activities/steps/date/today/1m 1ヶ月分の歩数を取得
activities/heart/date/today/1d 今日の心拍数を取得
activities/heart/date/today/7d 1週間分の心拍数を取得
sleep/date/today 今日の睡眠データを取得
sleep/date/2018-09-01 指定した日付の睡眠データを取得
sleep/date/2018-08-01/2018-08-31 期間を指定して睡眠データを取得

他にも様々なコマンドやオプションがあります。
詳しい使い方は Web API Reference を参考にしてください。

サンプル

サンプルとして、昨日の歩数を取得してみます。

curl -H "Authorization: Bearer **********.**********" https://api.fitbit.com/1/user/-/activities/steps/date/2018-09-03/1d.json | jq .

そのままだとJSONが見づらいので、jq をパイプ連結して、結果を整形しています。

Macユーザーなら、更にパイプ連結でpbcopyを追加すると、クリップボードに直接コピーできます。

{
  "activities-steps": [
    {
      "dateTime": "2018-09-03",
      "value": "11758"
    }
  ],
  "activities-steps-intraday": {
    "dataset": [
      {
        "time": "00:00:00",
        "value": 0
      },
      略
      {
        "time": "08:00:00",
        "value": 25
      },
      {
        "time": "08:01:00",
        "value": 32
      },
      {
        "time": "08:02:00",
        "value": 16
      },
      略
      {
        "time": "23:59:00",
        "value": 0
      }
    ],
    "datasetInterval": 1,
    "datasetType": "minute"
  }
}

無事出力されました。
昨日は 11,758歩。平日なのでまずまずです。

参考