Withingsの体重データをGarmin Connectと連携する:2

オフィシャルでは不可能な Withingsの体重データをGarmin Connectと連携させるお話。 有志によって公開されているプログラムを Windows10環境に導入し実現しました。 ※導入する方は自己責任でお願い致します。不具合が生じてもこちらでは責任取れません。 1:Python(パイソン)の導入 そのプログラムは使用言語がPython(パイソン)。 まずはこれを動かせる環境作り。 1-1:ダウンロード まずはPythonをダウンロード。 https://www.python.org/downloads/release/python-2712/ バージョンが複数ありますが今回は2.7.12を使用。 僕は『Windows x86 MSI installer』を選んで ダウンロードしました。 1-2:インストール ダウンロードしたファイルをダブルクリックで起動。 『Install for all users』を選んで『Next >』をクリック インストール先はそのままにして『Next >』をクリック (Cドライブ直下になります) カスタム項目は『Add python.exe to Path』から 『Entire feature will be installed on local hard drive』を選択。 ↑これ重要 選択出来たら『Next >』をクリック 環境によってはユーザーアカウント制御の表示が出ますが許可。 Finishボタンを押してインストール終了。 1-3:pipのインストール Pythonに追加のプログラムをインストール。 まずはコマンドプロンプトを起動。 キーボードの+Rキーを押して 『cmd』と入力しEnterキーを押しても起動可能です。 コマンドプロンプトが起動したら pip install requests と入力してEnter。 Collecting requestsと表示されて、しばし待機。 Successfully~と表示されたら成功。 ここまで出来ればPython導入編は完了。 2:withings-garmin-v2の導入 Pythonのインストールが完了したら 今回の目的を叶えるプログラム『withings-garmin-v2』を 入れてみます。 2-1:ダウンロード https://github.com/jaroslawhartman/withings-garmin-v2 上記サイトからプログラムをダウンロード。 緑色の『Clone or download』ボタンをクリック後 『DownLoad ZIP』ボタンをクリック。 僕はPythonをこのプログラム以外に使う用途が無さそうなので、 Pythonのインストールフォルダに解凍し展開しました。 『C:\Python27』の中身はこんな感じ。 2-2:設定 展開したファイル内から『sync.py』ファイルをテキストエディタで開いて設定します。 変更箇所は17行目あたりからはじまる5つ。 WITHINGS_USERNMAE = '' WITHINGS_PASSWORD = '' WITHINGS_SHORTNAME = '' GARMIN_USERNAME = '' GARMIN_PASSWORD = '' 各''内に自分のWithings、Garminの IDやパスワードを半角英数字で入力。 Withingsのショートネームは初期設定のままだと 『AAA』の可能性が高い。 体重計に乗ったら左上に表示される3桁の英数字です。 入力できたら上書き保存して下さい。 2-3:withings-garmin-v2の実行 設定が出来れば基本的には『sync.py』を実行するだけで OKです。 但し設定が正しく出来ていなくても終了してしまうので、 コマンドプロンプトをまた使い 正しく実行出来ているか確認。 sync.py と入力してEnter。 設定に不備があるとこんな感じでエラーが出て弾かれます。 その場合は先程の『sync.py』ファイル内の IDやパスワードに誤りが無いか要チェック。 2-4:まさかの・・・ 僕はここまでは順調に行きました。 まさかこのあと解決まで半日以上かかるとは 思いもよりませんでした。 先ほどの設定が上手く行っていれば↑みたいな感じになります。 しかしこれはWithingsのデーターが拾えないエラー。 user *** has not opened withings data withingsのセキュリティ設定の問題かアクセスしても弾かれている様子。 withingsの共有設定などWEBサイトやスマホアプリで 変更出来そうな箇所は開放してsync.pyを実行するが user *** has not opened withings data やーまんまたエラーかよ! あれこれ試してみるがやっぱりエラー。 時間だけが過ぎていく・・・ 最後に思いついたのが、 自分のアカウントは独立して1人で使ってるから ショートネームで判断する必要なし? WITHINGS_SHORTNAMEを空白にしてみるが、 新しいエラーcould not find user:の表示。 やーまんダメだー(´・ω・`) ユーザーは判別している様だ。 2-5:withings-garmin-v2の改造 ではエラーメッセージを返している部分のコードを飛ばすとどうなるか? 『sync.py』ファイル内の83行目あたりからはじまるWithings API関連のコード。 そこから次のコードの先頭に半角の#シャープを追加、 もしくはまるごと削除。 # if not user: # print 'could not find user: %s' % withings_shortname # return # if not user.ispublic: # print 'user %s has not opened withings data' % withings_shortname # return ここでは#を入れて対応している。 この言語は先頭に#を入れるとコメントとみなしてコードを実行しない。 さて結果は またuser *** has not opened withings dataが表示されると思っていたら Garmin Connect User Name: ***** 今まで見たこと無い表示。 これはつまり成功? Garmin Connectにアクセスすると・・・ 反映されている!!!!! やーまんやったー\(^o^)/ 2-6:過去の体重データを引っ張る 苦労しただけあっておもわずヤッホーな状態ですが、 上記のやり方だと当日の体重データのみ反映されます。 過去のデーターを引っ張ってくるには、 コマンドプロンプトで下記の様に入力します。 sync.py -f 2011-01-16 -t 2016-09-02 ↑この例だと2011年の1月16日から2016年9月2日までのデータを 引っ張ってくる形になります。 3:その後 毎日パソコンを立ち上げる方は スタートアップに『sync.py』を登録すれば 自動でデータを同期してくれますね。 あとはタスクスケジューラに登録して 定時に『sync.py』起動する様にする等。 僕は毎日パソコン使わないので、 恐らく2-6:の方法でまとめて同期すると思います。 長文お疲れ様でした。 4:追記Garmin Connectの仕様変更 9月下旬あたりからデーターが反映されず???状態でした。 正確な日付はわかりませんが、Garmin Connectへログインする際 複雑なパスワードを求める仕様に変更となりました。 それに伴いパスワードの変更を行い、『sync.py』も 新パスワードに書き換えると問題なく反映されました。 5:12月16日追記 Garmin Connectの仕様変更に対応してみました。 長くなったので別記事へアップ。 https://back2nature.jp/computer/web/withings-to-garmin-connect2 Withings Bluetooth対応 活動量計 Go 睡眠/走行距離/防水 ブルー 【日本正規代理店品】 WAM02-BLUE-ASIAposted with カエレバ Withings 2016-09-02 Amazon楽天市場Yahooショッピング

以前紹介したWithingsの体重データをGarmin Connectと連携する方法ですが、
11月頃からGamin Connectの仕様変更なのか、使えなくなりました。
下記修正点になります。

大本のソースコードが変更されたので、
3月31日追記:日付のズレ対策まで記事をすっ飛ばしてください。

garmin.pyの修正1

基本このファイルのみ修正です。


s = requests.session()

上記コードを11行目の空白行に挿入してください。

garmin.pyの修正2

テキストエディタの置換機能を使って
下記の様に置換して下さい。
.(ドット)をお忘れなく。

・検索ワード
requests.

・置換後
s.

garmin.pyの修正3

次は138行目辺りにある


return (cookies)

上記コードを下記のように書き換えます。


return (s.cookies)

garmin.pyの修正4

最後に81行目辺りにある


# "gauthHost": "https://sso.garmin.com/sso",

ここからコメントアウトするための#を取り外します。
注意点は一つ上の行頭とツラを合わせることです。

修正出来たら

いつもの様にsync.pyを実行します。

僕の環境では問題なくアップ出来ました。
sync.py実行時に-vのオプション付けると
上記の画像のようにメッセージが付加されます。

馴染みのないPythonなので、苦労しましたが、
アップ出来てスッキリしました。

3月1日追記:403エラー対策

いつの間にやらGarmin Connectの仕様変更なのか、
アップ出来なくなってました。
早速対策です。
おなじみのgarmin.pyを修正します。
154行目あたりのコードに追記します。


req = urllib2.Request(self.UPLOAD_URL)

↑このコードを↓こんな感じに変更します。


req = urllib2.Request(self.UPLOAD_URL, headers={"nk": "NT"})


以上で対策完了です。
“nk”: “NT”って何でしょうね?
tapiriikさんのコードを参考にしました。
ありがとうございます。

3月31日追記:日付のズレ対策

Garmin Connectに表示される体重のデータが、
微妙にズレている事を今更ですが気が付きました。
朝に計測しているデータが前日扱いになってました。
午後に計測するとその日になっていました。
恐らくWithingsのデータが何故か標準時刻でアップされてると思われます。

てな訳で、日本時間に合わせる為に『fit.py』に追記してみます。
76行目あたりのコードに追記します。


t = time.mktime(t.timetuple())

↑このコードを↓こんな感じに変更します。


t = time.mktime(t.timetuple()) + 32400


標準時刻から日本は9時間進んでいるので、
32,400秒分を足した感じです。
とりあえず現状はこれでOKかな?

5月15日追記:大本のソースコードが変更

withings-garmin-v2 - Withings to Garmin Connec sync

またしてもGarmin Connectの仕様変更か、同期ができない状況になってました。
久々にソースの配布元をチェックすると、
『garmin.py』と『sync.py』のコードが大幅に変更されてました。
4月21日頃にアップデートされているので、
それ以前にダウンロードした方は再度ダウンロードして、
ソースのアップデートをおすすめします。

今まで色々改造していましたが、この2点のソースコードを
大本と同じ物にアップデートしました。

で、5月15日時点ではそのままではやっぱりエラーが出るので修正します。

オフィシャルでは不可能な Withingsの体重データをGarmin Connectと連携させるお話。 有志によって公開されているプログラムを Windows10環境に導入し実現しました。 ※導入する方は自己責任でお願い致します。不具合が生じてもこちらでは責任取れません。 1:Python(パイソン)の導入 そのプログラムは使用言語がPython(パイソン)。 まずはこれを動かせる環境作り。 1-1:ダウンロード まずはPythonをダウンロード。 https://www.python.org/downloads/release/python-2712/ バージョンが複数ありますが今回は2.7.12を使用。 僕は『Windows x86 MSI installer』を選んで ダウンロードしました。 1-2:インストール ダウンロードしたファイルをダブルクリックで起動。 『Install for all users』を選んで『Next >』をクリック インストール先はそのままにして『Next >』をクリック (Cドライブ直下になります) カスタム項目は『Add python.exe to Path』から 『Entire feature will be installed on local hard drive』を選択。 ↑これ重要 選択出来たら『Next >』をクリック 環境によってはユーザーアカウント制御の表示が出ますが許可。 Finishボタンを押してインストール終了。 1-3:pipのインストール Pythonに追加のプログラムをインストール。 まずはコマンドプロンプトを起動。 キーボードの+Rキーを押して 『cmd』と入力しEnterキーを押しても起動可能です。 コマンドプロンプトが起動したら pip install requests と入力してEnter。 Collecting requestsと表示されて、しばし待機。 Successfully~と表示されたら成功。 ここまで出来ればPython導入編は完了。 2:withings-garmin-v2の導入 Pythonのインストールが完了したら 今回の目的を叶えるプログラム『withings-garmin-v2』を 入れてみます。 2-1:ダウンロード https://github.com/jaroslawhartman/withings-garmin-v2 上記サイトからプログラムをダウンロード。 緑色の『Clone or download』ボタンをクリック後 『DownLoad ZIP』ボタンをクリック。 僕はPythonをこのプログラム以外に使う用途が無さそうなので、 Pythonのインストールフォルダに解凍し展開しました。 『C:\Python27』の中身はこんな感じ。 2-2:設定 展開したファイル内から『sync.py』ファイルをテキストエディタで開いて設定します。 変更箇所は17行目あたりからはじまる5つ。 WITHINGS_USERNMAE = '' WITHINGS_PASSWORD = '' WITHINGS_SHORTNAME = '' GARMIN_USERNAME = '' GARMIN_PASSWORD = '' 各''内に自分のWithings、Garminの IDやパスワードを半角英数字で入力。 Withingsのショートネームは初期設定のままだと 『AAA』の可能性が高い。 体重計に乗ったら左上に表示される3桁の英数字です。 入力できたら上書き保存して下さい。 2-3:withings-garmin-v2の実行 設定が出来れば基本的には『sync.py』を実行するだけで OKです。 但し設定が正しく出来ていなくても終了してしまうので、 コマンドプロンプトをまた使い 正しく実行出来ているか確認。 sync.py と入力してEnter。 設定に不備があるとこんな感じでエラーが出て弾かれます。 その場合は先程の『sync.py』ファイル内の IDやパスワードに誤りが無いか要チェック。 2-4:まさかの・・・ 僕はここまでは順調に行きました。 まさかこのあと解決まで半日以上かかるとは 思いもよりませんでした。 先ほどの設定が上手く行っていれば↑みたいな感じになります。 しかしこれはWithingsのデーターが拾えないエラー。 user *** has not opened withings data withingsのセキュリティ設定の問題かアクセスしても弾かれている様子。 withingsの共有設定などWEBサイトやスマホアプリで 変更出来そうな箇所は開放してsync.pyを実行するが user *** has not opened withings data やーまんまたエラーかよ! あれこれ試してみるがやっぱりエラー。 時間だけが過ぎていく・・・ 最後に思いついたのが、 自分のアカウントは独立して1人で使ってるから ショートネームで判断する必要なし? WITHINGS_SHORTNAMEを空白にしてみるが、 新しいエラーcould not find user:の表示。 やーまんダメだー(´・ω・`) ユーザーは判別している様だ。 2-5:withings-garmin-v2の改造 ではエラーメッセージを返している部分のコードを飛ばすとどうなるか? 『sync.py』ファイル内の83行目あたりからはじまるWithings API関連のコード。 そこから次のコードの先頭に半角の#シャープを追加、 もしくはまるごと削除。 # if not user: # print 'could not find user: %s' % withings_shortname # return # if not user.ispublic: # print 'user %s has not opened withings data' % withings_shortname # return ここでは#を入れて対応している。 この言語は先頭に#を入れるとコメントとみなしてコードを実行しない。 さて結果は またuser *** has not opened withings dataが表示されると思っていたら Garmin Connect User Name: ***** 今まで見たこと無い表示。 これはつまり成功? Garmin Connectにアクセスすると・・・ 反映されている!!!!! やーまんやったー\(^o^)/ 2-6:過去の体重データを引っ張る 苦労しただけあっておもわずヤッホーな状態ですが、 上記のやり方だと当日の体重データのみ反映されます。 過去のデーターを引っ張ってくるには、 コマンドプロンプトで下記の様に入力します。 sync.py -f 2011-01-16 -t 2016-09-02 ↑この例だと2011年の1月16日から2016年9月2日までのデータを 引っ張ってくる形になります。 3:その後 毎日パソコンを立ち上げる方は スタートアップに『sync.py』を登録すれば 自動でデータを同期してくれますね。 あとはタスクスケジューラに登録して 定時に『sync.py』起動する様にする等。 僕は毎日パソコン使わないので、 恐らく2-6:の方法でまとめて同期すると思います。 長文お疲れ様でした。 4:追記Garmin Connectの仕様変更 9月下旬あたりからデーターが反映されず???状態でした。 正確な日付はわかりませんが、Garmin Connectへログインする際 複雑なパスワードを求める仕様に変更となりました。 それに伴いパスワードの変更を行い、『sync.py』も 新パスワードに書き換えると問題なく反映されました。 5:12月16日追記 Garmin Connectの仕様変更に対応してみました。 長くなったので別記事へアップ。 https://back2nature.jp/computer/web/withings-to-garmin-connect2 Withings Bluetooth対応 活動量計 Go 睡眠/走行距離/防水 ブルー 【日本正規代理店品】 WAM02-BLUE-ASIAposted with カエレバ Withings 2016-09-02 Amazon楽天市場Yahooショッピング

『sync.py』はユーザーネームで弾かれるので、以前と同じ方法で、
コメントアウトかソースを消して対処します。

次は『garmin.py』の修正です。
77行目あたりのコードをコメントアウトか消します。


data["lt"] = re.search("name=\"lt\"\s+value=\"([^\"]+)\"", preResp.text).groups(1)[0]

↑このコードを↓こんな感じに変更します。
これはコメントアウトした場合です。


#data["lt"] = re.search("name=\"lt\"\s+value=\"([^\"]+)\"", preResp.text).groups(1)[0]

次は104行目あたりのコード『params={“ticket”: ticket},』を消します。


gcRedeemResp = session.get("https://connect.garmin.com/post-auth/login", params={"ticket": ticket}, allow_redirects=False)

↑このコードを↓こんな感じに変更します。


gcRedeemResp = session.get("https://connect.garmin.com/post-auth/login",  allow_redirects=False)

以上の変更で5月15日時点では同期可能となります。
いずれGarmin Connectの仕様変更で同期が出来ない事になると思いますが^^;