前回PhantomJSを使ってHealthPlanetにログインしユーザ名を取得するサンプルを作ってみた。
今回はHealthPlanetで提供されている体組成計データを取得するAPIを使ったプログラムを作ってみたい。

参考:体組成データを取得する。

準備

まずはmixでプロジェクトを作成。今回はhelpgetという名前にします

$ mix new hlpget

続いて各種設定。ライブラリの指定と、HoundのDriverにPhantomJSを指定。

mix.exs
defmodule Hlpget.Mixfile do
use Mix.Project
def project do
[app: :hlpget,
version: "0.0.1",
elixir: "~> 1.1",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps]
end
def application do
[applications: [:logger, :httpoison, :hound]]
end
defp deps do
[
{:httpoison, "~> 0.7.4"},
{:floki, "~> 0.6"},
{:hound, "~> 0.7.2"},
{:oauth2, "~> 0.5"}
]
end
end
config/config.exs
config :hound, driver: "phantomjs", host: "http://localhost", port: 5555

プログラムを書く

それでは「測定日付が”2015/07/01 00:00:00”から”2015/09/30 12:59:59”までの測定データ」をJSON形式で取得してみます。
前回のプログラムにOAuth関連のコードが追加された感じですね。

lib/hlpget.ex
defmodule Hlpget do
use Hound.Helpers
def start do
client = OAuth2.Client.new([
strategy: OAuth2.Strategy.AuthCode,
client_id: "CLIENT_ID.apps.healthplanet.jp", # 適宜置き換えてね
client_secret: "CLIENT_SECRET", # 適宜置き換えてね
site: "https://www.healthplanet.jp/",
authorize_url: "https://www.healthplanet.jp/oauth/auth",
token_url: "https://www.healthplanet.jp/oauth/token",
redirect_uri: "https://www.healthplanet.jp/success.html",
])
# HealthPlanet
user = "ユーザ名" # 適宜置き換えてね
passwd = "パスワード" # 適宜置き換えてね
Hound.start_session
# 認証
OAuth2.Client.authorize_url!(client, [{:scope, "innerscan"}]) |> navigate_to
find_element(:name, "loginId") |> fill_field(user)
find_element(:name, "passwd") |> fill_field(passwd)
find_element(:name, "login.LoginForm") |> submit_element
# 許可
execute_script("goSubmit(true);")
find_element(:name, "common.SiteInfoBaseForm") |> submit_element
# token/expire/refresh_tokenを取得
code = Regex.split(~r/code=/, current_url()) |> List.last
token = OAuth2.Client.get_token!(client, code: code)
# 実際に健康情報を取得
# 体重 (kg),体脂肪率 (%),筋肉量 (kg),筋肉スコア,内臓脂肪レベル2(小数点有り、手入力含まず),基礎代謝量 (kcal),体内年齢 (才),推定骨量 (kg)
tag = "6021,6022,6023,6024,6025,6027,6028,6029"
date = 1
from = "20150701000000"
to = "20150930125959"
format = "json"
%{:access_token => access_token} = token # ACCESS_TOKENを取得
OAuth2.AccessToken.get!(token,
"/status/innerscan.#{format}?tag=#{tag}&date=#{date}&from=#{from}&to=#{to}&access_token=#{access_token}").body
|> IO.inspect
# 後始末
delete_cookies()
Hound.end_session()
end
end

実行

先にPhantomJSを立ち上げてプログラムを実行します。

$ phantomjs --webdriver=5555
$ mix run -e Hlpget.start
Compiled lib/hlpget.ex
Generated hlpget app
%{"birth_date" => "19xxxxxx",
"data" => [%{"date" => "201509292150", "keydata" => "xx.xx",
"model" => "01000088", "tag" => "6021"},
%{"date" => "201509292150", "keydata" => "xx.20", "model" => "01000088",
"tag" => "6022"},
...(省略)
%{"date" => "201508272145", "keydata" => "xx.0", "model" => "01000088", ...},
%{"date" => "201508272145", "keydata" => "xxxxx", ...},
%{"date" => "201508272145", ...}, %{...}, ...], "height" => "xxx.x",
"sex" => "male"}

取得成功!
あとはIO.inspectの部分をCSVに変換して出力するなどして利用していきたいと思います。

ちなみに"model" => "01000088"は何かと思ったら、購入したiPhoneと連携する体組成計の事だったみたいだ。
製品:体組成計 インナースキャンデュアル RD-900

これから体重が増えやすい冬に向けて、こまめに計測して食べ過ぎには気をつけねば…