Skip to content

Instantly share code, notes, and snippets.

@yasuoka
Last active May 23, 2021 03:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yasuoka/2dd59c3d36fb272d4db25556c904657c to your computer and use it in GitHub Desktop.
Save yasuoka/2dd59c3d36fb272d4db25556c904657c to your computer and use it in GitHub Desktop.
Health Planet から Withings にデータ移行

Health Planet からデータ取り出し

Health Planet API 仕様書 を参考にしてデータを取り出していく

Health Planet API の client_id と client_secret を得る

  1. https://www.healthplanet.jp/ にアクセス
  2. 登録情報 > サービス連携 で、「アプリケーション開発者の方はこちら」をクリック
  3. 適当に入力して登録。最初にアプリケーションタイプを「クライアントアプリケーション」に設定すると入力項目が減り、サービス名とメールアドレスだけなる
  4. client_id と client_secret が表示される

Health Planet API の token を得る

ブラウザで 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 でデータを取り込む

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]]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment