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

https://back2nature.jp/computer/web/withings-to-garmin-connect

以前紹介した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日追記:大本のソースコードが変更

https://github.com/jaroslawhartman/withings-garmin-v2

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

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

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

https://back2nature.jp/computer/web/withings-to-garmin-connect#2-5withings-garmin-v2

『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の仕様変更で同期が出来ない事になると思いますが^^;

やーまん

山奥に移住し、のんびり暮らしています。
日々の事で感じた事や考え方などを備忘録として残しています。

関連記事