Withings APIの変更
Withingsの体重計の測定結果やSleepの睡眠測定結果などをGoogle App Script (GAS)を使って Google Sheetsにコピーしています。
これに使っているAPIが変更されるとのこと。
[BREAKING] Shutting down access and refresh tokens endpoints – Withings Support
ちゃんと見てなかったんですが、去年の3月16日にアナウンスされていて、 古いAPIは今年の2月8日で使えなくなる、とのこと。
認証に使うエンドポイントのURLとかが変わるのでまずはそれを変更しなくてはいけませんが、 送るパラメーターや帰ってくるパラメーターも変わるのでちゃんと見てやる必要があります。
主にはGoogleが作っている googleworkspace/apps-script-oauth2 というOAuth2を扱うライブラリを使っているのでそこでの取り扱いの変更です。
Withings-gas
こんな感じのApp Scriptでやっています。
まずはWithings.gs/getService()の中のsetTokenUrl
の変更:
1 2 |
|
これだけで済めば良いのですが、他がちょっと面倒でした。
新しいAPIではToken取得時にaction
というパラメーターが必須になっています。
このToken取得時に必要なパラメーターはgetService()の中で
1 2 |
|
と、setTokenPayloadHander
を使って関数を使って追加する必要があります。このmyHandler
を
1 2 3 4 5 6 7 |
|
最初の認証の際に必要なパラメーターはsetParam('parameter', 'value')
みたいな感じでセットできますが、
Token取得時のものはこの様に関数を使って加える必要があります。
これに失敗すると、認証ページに行ってCallback関数が呼ばれた時、
Error: Error retrieving token: Not implemented(行 553、ファイル「Service」)
みたいなエラーが表示されます。これが出た場合はToken取得時にaction
の値などが正しくせっとされてません。
うまくいくとapps-script-oauth2のexample通りにCallback関数を作っていればSucess!
が出るはず。
これでScriptsに戻ってもう一度実行すればうまく取得できるかと思ったら、今度はスクリプト実行時に
Error: Withings API returns wrong status:
{"status":401,"body":{},"error":"XRequestID: Not provided invalid_token: The access token provided is invalid"}
これを調べてみると、APIで値を取得時に、
1 2 3 4 5 6 |
|
といった感じでヘッダーを定義しているのですが、このservice.getAccessToken()
の値がnull
になっていました。
この関数は
1 2 3 4 5 6 7 |
|
https://github.com/googleworkspace/apps-script-oauth2/blob/3a2924dd0adc9eaf92e5fd64c242bd93ffb3f3ff/dist/OAuth2.gs#L557
と定義されていて、どうやら取得したJSONの直下にaccess_token
があることが仮定されています。
Withings APIの変更のアナウンス
を見てみると、New response format
とあり、the deprecated endpoint
を使った場合は
access_token
が最上位にいますが、
the new endpoint
の場合はbody
の下にいます。
なので、上の関数のところでtoken.body.access_token
の様にしないといけません。
そっちをいじるのは面倒なので、
getToken()
で直接取得したJSONデータをとってきてbody.access_token
を使うようにします。
一応チェックも入れてあります。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
これで取れるようになりました。
access_tokenの仕様
googleworkspace/apps-script-oauth2
がどれだけ広く使われているか分かりませんが、
素直に使おうとするとこの様にgetAccessToken
は使えないので
殆どの場合はaccess_token
が最上位にあるようにAPIの返答が組まれているのだと思います。
なぜ変えたのか。。。
この辺の事情よく知りませんが、
最近はそういう方向なのでしょうか?(status
的なものをまずは入れたい?)