pavlog

ウェブエンジニアがあれやこれやを書きます

【Oura】CLI & クライアントツールを作りました【API】

github.com

暇だったので、Goの勉強がてらOura CloudのAPI clientを作ってみました。

Ouraとはなんぞやという人は以下の記事をご覧ください。

【Oura Ring】最新のウェルネスリングの実力と購入方法 - pavlog

インストール

https://github.com/paveg/goura を cloneして以下のようにインストールします。

$ cd path/to/goura
# go がなければ入れる、goenvを使っていれば以下
$ goenv install -s
$ make install

これでインストールは完了です。 Homebrewでも公開しようと思いましたが面倒臭くて放置してます。

$ goura version
goura version: v1.0.0, revision: 13fac6f

できること

基本OuraCloudに生えてるAPIをGoから扱えるようにしただけなので、特に特徴的なことはありません。

helpコマンドを参照すると全て書いてあるのでそちらを見れば良いですが、簡単に書きます。

$ goura --help
goura is an Unofficial API client of Oura Cloud written in Go.
Complete documentation is available at https://github.com/paveg/goura

Usage:
  goura [command]

Available Commands:
  activity    Fetch activities
  configure   Fetch your access_token
  help        Help about any command
  readiness   Fetch readinesses
  sleep       Fetch sleep
  userinfo    Fetch user information
  version     Print the version number of goura

Flags:
  -h, --help   help for goura

Use "goura [command] --help" for more information about a command.

OuraCloudのClientID及びClientSecretを事前に設置しておいてください。

AccessTokenの取得

$ goura configure

とするとaccess tokenを取得します。 Webブラウザでページが開くので自分のアカウントでログインを行い認証します。

正しく実行すれば、 .goura.yaml がルートディレクトリ直下に作成されて情報が記述されます。

accesstoken: xxx
clientid: yyy
clientsecret: zzz
redirecturl: http://localhost:8888

これは、他のAPIを叩く時に利用されます。

APIを叩く

叩けるAPIは以下の4つです。

  • userinfo
  • activity
  • sleep
  • readness

実際に叩くには以下のように行います。

$ goura userinfo | jq .
2019/09/21 13:54:59 HTTP Request: 200 OK
{
  "age": 27,
  "weight": 54.2,
  "height": 170,
  "gender": "male",
  "email": "example@gmail.com",
  "user_id": "xxx"
}

また日付の指定が可能なAPIでは以下のように指定を行います。

範囲指定も可能ですが、1日に絞って指定しています。

$ goura readiness -t 2019-02-02 | jq .
2019/09/21 13:57:07 HTTP Request: 200 OK
{
  "readiness": [
    {
      "summary_date": "2019-02-02",
      "period_id": 0,
      "score": 77,
      "score_previous_night": 67,
      "score_sleep_balance": 64,
      "score_previous_day": 96,
      "score_activity_balance": 92,
      "score_resting_hr": 77,
      "score_recovery_index": 100,
      "score_temperature": 98
    }
  ]
}

おわりに

とくにこれといった大きな学びはないですが、実際にGoでAPIクライアントを作るのはとても楽しかったです。

また cobra などのパッケージを利用して開発ができて、次回以降CLIツールを作るのがすごい敷居が下がりました。

すでに rubyでもAPIクライアントは作成していますが、 その機能の少なさゆえにやることがあまり思い浮かばず、Slackへ睡眠の質が悪い時だけ通知するなどしています。

もしよかったら使ってみてください(雑)。