体重や体脂肪率が毎日Google Spreadsheetに更新されるようになった


いらん前書き

 オッサンになるって怖いです。いきなり家の中から4年も前にサービス終了したデバイスが見つかったりします。4年なんて言ったら、大学1年生にしてみたら高校どころか中学まで遡ってしまう、過去も過去、もはや黒歴史の時代ですよね。
 オッサンになるって怖いです。学生のころはあれだけ運動していたのに、仕事や家庭にかまけていたら、そういえば半年くらい運動していない・・・ということがすぐに起こります。そして、その生活を変えようとすると凄い努力が必要になってしまう。。

本編

 家の中からスマート体組成計(301SI)が発掘されました。一年に一度しか体重計に乗らない(健康診断)生活を改める良い契機なんじゃないかと思い、とりあえずハックしました。

処理の流れ

  1. https://healthcare.mb.softbank.jp/v3/web_login にSIMの電話番号とユーザーIDとパスワードをpostして、cookieにセッションIDをいただき、
  2. 1でもらったセッションIDをcookieにセットして https://healthcare.mb.softbank.jp/v3/web_api_get_home_summary に日付をつけてgetすると色々な身体のデータが取れる。

実装(Python)

 requestを使ってpostとgetする。requestがセッションを張ってcookie等をよしなにしてくれるので、とても楽。一部を抜粋するとこんなかんじ。

session = requests.session()

login_url = 'https://healthcare.mb.softbank.jp/v3/web_login'
inputs = {"telno": "08012345678", "user_id": "1", "passwd": "0401",}

r = session.post(login_url, data=inputs)
  if r.status_code == requests.codes.ok:
    print(r.text)

 実際のコードはこちら

実装(Javascript)

 Google Spreadsheetにスクリプトを仕込んで自動更新させるのに、一番相性が良いのはやっぱりjsでしょう。
 UrlFetchApp.fetchを使うんだけど、Pythonのrequestみたいによしなにやってくれないので、けっこう気を遣うことになる。セッションをつなげるために、cookieを手動でセットする。getAllHeaders()['Set-Cookie']で取得した値には、Expired dateが入っているせいで、そのまま次のセッションのCookieに転用することができないので、丁寧に削ってあげる必要があった。あと、UrlFetchApp.fetchのオプションにヘッダを載せるときのハッシュラベルが"header"じゃなくて"headers"なことになかなか気づけなくて、しばらく時間を無駄にした。

 なにはともあれ、できたスクリプトを↓みたいに一行目に項目名を記述したspreadsheetに張り付けて、深夜に回すように時間指定トリガーをかけたら完成

 健康になれますように。