oauth2で認証してからjawbone gemを使う。

ここに置いてある
https://github.com/shokai/jawbone-up-api-study


腕輪型アクティビティロガーのAPI

腕輪型アクティビティロガーではJawbone Up、FitBit、FuelBandの3つが有名だと思う。どれもAPIがある。

JawboneがOAuth2、FitBitがOAuthで認証して詳細なデータが取得できて、APIもいろいろあって遊べる。作ったアプリを他人に使ってもらいやすい。
Nike FuelBandは野良開発者は自分のバンドしかデータが取れず、しかも詳細な数値はナイキのパートナーしか取得できないようだ。遊べない。

Jawbone Up24(Bluetooth LEでiPhone/Androidと同期するやつ)はwebhookのURLが登録できて、OAuth2で読み取り権限をくれたユーザーのデータがガンガン自分のwebアプリにサーバー間プッシュされるらしいので興味深い。例えば睡眠に入った、起きた、等のタイミングでpushされるらしい。普通のUpでも同期したタイミングでpushされてくるかなと思って試したけど、webhookされなかった。Up24がほしい。

俺が普通のJawbone Upを買ったのは3つのAPIドキュメントを比較してみて、Jawboneが一番面白そうだなと思ったからなんだけど、当時AndroidではUp24とbluetooth接続できなかったので普通のUpを買ったという次第。Up24ほしい。


まずアプリを登録する

https://jawbone.com/up/developer/

とりあえずローカルホストでアプリを作るのでcallbackをうけるためにlocalhost:5000で登録する。

Client IdとApp Secretをメモしておく。


認証する


これをSinatraで実装する
UP for Developers: Authentication

config.ru

require 'sinatra'
require 'oauth2'

CLIENT_ID="your-client-id"
APP_SECRET="your-app-secret"

require_relative 'main'

enable :sessions
set :session_secret, (ENV["SESSION_SECRET"] || "zanmai-kazusuke-kazudon-marutaka")

run Sinatra::Application

main.rb

def oauth_client
@client ||= OAuth2::Client.new(CLIENT_ID, APP_SECRET,
:site => 'https://jawbone.com',
:authorize_url => '/auth/oauth2/auth',
:token_url => '/auth/oauth2/token')
end

get '/' do
unless session[:oauth_token]
@mes = %Q{<p><a href="/login">login</a></p>}
else
@mes = %Q{<p><a href="/logout">logout</a></p>
<p>your token : #{session[:oauth_token]}</p>}
end
end

get '/login' do
scope = "extended_read sleep_read mood_read"
redirect oauth_client.auth_code.authorize_url(:scope => scope,
:redirect_uri => "http://localhost:5000/auth")
end

get '/auth' do
code = params["code"]
halt 400, 'code missing' unless code
begin
session[:oauth_token] = oauth_client.auth_code.get_token(code).token
rescue => e
STDERR.puts e.message
end
redirect "/"
end

get '/logout' do
session.delete :oauth_token
redirect "/"
end

起動

% bundle exec rackup config.ru -p 5000


loginするとjawboneのサイトに飛んでoauthで認証しlocalhost:5000に戻ってくる。


APIで睡眠データを取得する

/users/@me/sleeps
 を読む。

これが
UP for Developers: Endpoints

ラップされてjawbone gemになる

["move", "body_event", "workout", "sleep", "meal", "cardiac_event", "generic_event", "mood"]
が使える。


require 'jawbone'
require 'awesome_print'

OAUTH_TOKEN = "your-oauth-token"

client = Jawbone::Client.new OAUTH_TOKEN

ap client.user
ap client.sleeps
睡眠時間などを取得する


何時から何時まで寝たか(asleep_timeとawake_time)、深い眠り(deep)と浅い眠り(light)の長さ、ただ横になっているだけで寝ていない時間(awake)、二度寝を何回したか(awakenings)などがわかる。
単位は全て秒とunixtime。