/ #fitbit 

【備忘録】Fitbit APIを使って自分の睡眠データを取得する

もくじ

こんにちは。最近いつも眠いなーと感じてるいる sisii です。

でですね。私は Fitbit を愛用しているのですが、10 月から自分の睡眠時間の平均が通常より 30 分以上落ちているということがわかりました。

あぁー、これ改善しないとまずいなーと思いまして、ついでにそういえば Fitbit のデータって API とかで取得できるのかしら?ということで調べてみました。

という話の備忘録になります。(今回の記事は調べながらとりとめもなく書いてますのでまとまってなくてごめんなさい)

何がしたいの?

Fitbit のデータを API 的なもので取得したい。

前提

私は何もわかっていない。Fitbit のアカウントを持っているくらい。

やったこと。

色々飛ばしまして、ググると「Fitbit Web API」というものがでてきます。

これは Fitbit の公式の API のようです。私個人の希望だと「Fitbit が各個人のアクセストークン的なものをくれて、それを使うとサクッとデータを取得できる」そんな手軽なものを求めていたのですが、これ OAtuh2.0 を使ってどうのこうのということで、気軽に使うにはだいぶハードル高いなーという感想です。

目標として、疎通確認してデータを取得したいーという気持ちがあるので、とりあえず進みます。

Fitbit の Developer ページにログインします。

そしてアプリ登録画面でアプリを登録します。

後で編集できるっぽいので一旦アプリケーション type だけをPersonalにしてあとはダミーの値で仮登録します。

続いて認証を頑張ります。

公式によるとこのへん使うと楽だよ!!とのことなので使わせて頂こうと思います。

選択肢が渋いなー、、、という感想。

ts で書くことになるかもー、とか覚悟していたのですが ts ないですし、普通に python があるので python で行きましょうかーという気持ち。

とうことでPython-fitbit →→→ 最終更新 4 年前、星 611 個。

んーー、、、もしプロダクトを作るぜ!とかの場合はちょっと別の選択肢を考える必要あるよねーと思いつつ動作確認だけだからいいかなという気持ちで進めることに。

適当なディレクトリにクローンしてきます。インストールしてみます。

$ git clone https://github.com/orcasgit/python-fitbit.git
$ cd python-fitbit
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install -r requirements/base.txt

続いてQuickstart

を見てみたのですが、↓ とのことで使うには CustomerKey と CustomerSecret が必要とのことですが、そんなものはない。。。

import fitbit
unauth_client = fitbit.Fitbit('<consumer_key>', '<consumer_secret>')

なんとなくこのライブラリー古くて現状に対応してなさそうだなーという肌感を感じだのでそっと閉じてOAuth 2.0 Tutorialというのがあったのでそっちをやる。

$ cd python-fitbit.git
$ rm -rf python-fitbit # さらば!!

ということでこちら

Client IDはアプリを作ったときに生成されたので、それを追加。

Application TypeClient

PKCE Code VerifierGenerateを押して生成。

StateGenerateを押して生成。

Scopesは絞ってもいいですが一旦すべて選択。

Authorization URLに URL がせっていされるので、そこにアクセスして認証します。

すると ↓ のような画面がでました。めっちゃお手軽でしたね!

ここでチェックをいれて許可!!!

そしてここで問題発生。リダイレクト URL に適当な値をいれていたので認可フローが停止しました。

とおもったら fitbit さんそれを見越した神対応してました。

Step 3: Handle the Redirectのテキストボックスにリダイレクトされた URL を貼り付ければよしなに cURL コマンドを生成してくれるとのこと。

そしてSUBMIT REQUEST!! リクエストまでブラウザでやってくれるの楽だなーって思ってたら、↓ のようなエラーがでました。

{"errors":[{"errorType":"invalid_client","message":"Invalid authorization header format. The header was not recognized to be a valid header for any of known implementations or a client_id was not specified in case of a public client Received header = null. Visit https://dev.fitbit.com/docs/oauth2 for more information on the Fitbit Web API authorization process."}],"success":false}

header がイケてないとのこと。

https://dev.fitbit.com/docs/oauth2を読めとのことなので読んで見る。

header にAuthorizationがないのが原因っぽいです。

そして値は<client_id>:<client_secret>の文字列を Base64 にして入れてねとのこと。

ふむふむclient_secret使うのね。

とここで振り返ってみると、一番上のApplication TypeClientに設定しちゃったけどこれServerにしてClient Secretをアプリ登録したときに生成されたやつ入れればよしなにうごくのでは?とやりなおしてみる。

🎉🎉 !! SUCCES !! 🎉🎉

わーいわーい、無事にアクセストークンとリフレッシュトークンが取得されました!!

Access User Dataでも、アプリ登録したときの内容が取得されました!

ということで睡眠情報をとってみる

curl -i -H "Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"  \
 https://api.fitbit.com/1.2/user/-/sleep/date/2023-12-01.json
>{"sleep":....} # たくさんデータでたので割愛

わーいわーい。データ取れたー!!

まとめ

Fitbit の API をつかって個人のデータをとって見ました。

アプリさえ登録すればほぼ画面ポチポチでアクセストークンが取得できて、それを使えばよしなに Fitbit のデータが取得できそうでした。

色々使えそうでワクワクしますねー。

以上です。ありがとうございましたー。

感謝!

表紙の写真は UnsplashKate Stone Mathesonが撮影した写真です。 ありがとうございます!

Author

Sisii

インフラが好きなエンジニアぶってるなにか