Health Planet API 仕様書 を参考にしてデータを取り出していく
- https://www.healthplanet.jp/ にアクセス
- 登録情報 > サービス連携 で、「アプリケーション開発者の方はこちら」をクリック
- 適当に入力して登録。最初にアプリケーションタイプを「クライアントアプリケーション」に設定すると入力項目が減り、サービス名とメールアドレスだけなる
- client_id と client_secret が表示される
ブラウザで https://www.healthplanet.jp/oauth/auth?client_id=<client_id>&redirect_uri=https://www.healthplanet.jp/success.html&scope=innerscan,sphygmomanometer&response_type=code を開き、同意画面で同意する。これで「コード」が得られる。scope は取得したいデータをカンマ区切りで列挙するが、今回は体組成計と血圧計のデータを指定している。 つづいて curl で tokenを得る
$ curl -X POST https://www.healthplanet.jp/oauth/token?client_id=<client_id>&client_secret=<client_secret>&redirect_uri=https://www.healthplanet.jp/success.html&code=<code>&grant_type=authorization_code
token が表示されるのでコピーしておく
$ curl https://www.healthplanet.jp/status/innerscan.json?access_token=<access_token>&date=0&tag=6021,6021 > innerscan.json
$ curl https://www.healthplanet.jp/status/sphygmomanometer.json?access_token=<access_token>&date=0&tag=622E,622F,6230 > sphygmomanometer.json
データがたくさんある場合には from to パラメータを指定して、複数回にわけて取り出す必要があるかもしれない。
Withings は、Web サイトにログインし「設定」で自分のアイコンをクリックすると「データを管理」「データをインポート」という項目が現れる。 それをクリックするとデータフォーマットが簡単に説明されており、そこからアップロードもできる。データは CSV 形式なのでデータをコンバートする必要がある
注意が必要なのは、体脂肪は、率ではなく量を kg で入力する必要がある点である。
体重データの変換
import sys
import json
out = {}
data = json.loads(sys.stdin.read())
for data in data["data"]:
datestr = "%s-%s-%s %s:%s" % (data["date"][:4], data["date"][4:6],
data["date"][6:8], data["date"][8:10], data["date"][10:12])
if not datestr in out:
out[datestr] = [None, None]
if data["tag"] == "6021":
out[datestr][0] = data["keydata"]
elif data["tag"] == "6022":
out[datestr][1] = data["keydata"]
for k in out:
out[k][1] = "%.2f" % (float(out[k][0]) * float(out[k][1]) / 100.0)
for k in sorted(out):
print(",".join([k, *out[k]]))
こんな python を保存して
python hoge.py < innerscan.json > innerscan.csv
でコンバートし、この csv を withings にアップロード
血圧データのコンバートはこんな感じ
import sys
import json
out = {}
data = json.loads(sys.stdin.read())
for data in data["data"]:
datestr = "%s-%s-%s %s:%s" % (data["date"][:4], data["date"][4:6],
data["date"][6:8], data["date"][8:10], data["date"][10:12])
if not datestr in out:
out[datestr] = [None, None, None]
if data["tag"] == "622E":
out[datestr][1] = data["keydata"]
elif data["tag"] == "622F":
out[datestr][2] = data["keydata"]
elif data["tag"] == "6230":
out[datestr][0] = data["keydata"]
for k in sorted(out):
if out[k][0] == None:
continue
print(",".join([k, *out[k]]))