19

何をしているのかよくわかりません。これにはライブラリを使用する必要がありますか?それとも手動で行いますか?

そこで、Python で WiThings ( http://www.withings.com/api ) API を使って作業をしようとしています。

一部のリクエストを実行するには、OAuth 認証が必要です。リクエスト ライブラリを使用して、oauth トークンとシークレット トークンを、コンシューマーおよびコンシューマー シークレット トークンと共に取得しました。

今、私はリクエストをしなければならないところにいて、いくつかの問題に直面しています。作成する必要があるリクエストの形式は次のとおりです (API の例)。

http://wbsapi.withings.net/notify?action=subscribe
&callbackurl=http%3a%2f%2fwww.yourdomain.net%2fyourCustomApplication.php
&comment=Your%20Own%20Application%20Description
&oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b
&oauth_nonce=accbac1b7ee2b86b828e6dc4a5a539b2
&oauth_signature=XfobZMboIg2cRyNKAvyzONHHnKM%3D
&oauth_signature_method=HMAC-SHA1
&oauth_timestamp=1311842514
&oauth_token=887557411788d5120537c6550fbf2df68921f8dd6f8c7e7f9b441941eb10
&oauth_version=1.0
&userid=831

私が知る限り、これは末尾のユーザー ID を除いて、OAuth の典型的な形式です。

では、リクエスト ライブラリを使用してこのようなリクエストを行うことはできますか? それとも他のライブラリですか?コメント、userid、および callbackurl フィールドを使用して、URL を正しく取得するにはどうすればよいですか? または、この URL を手動で生成する必要がありますか? その場合、これを行うための最良の方法は何ですか?

私はしばらくこれに固執していたので、どんな支援も大歓迎です。

編集

したがって、明確にするために、参照されているコードの約 98% を理解しています。最後に少しだけ問題があります。

だからここに、次のコードがあります:

from __future__ import unicode_literals
from urlparse import parse_qs
import requests
from requests_oauthlib import OAuth1Session

consumer_key = '**Valid consumer key**'

consumer_secret = '**Valid consumer secret**'


oauth_key = '**Valid oauth key obtained through requests library and OAuth workflow**'

oauth_secret ='**Valid oauth secret obtained through requests library and OAuth workflow**'

verifier = '**Valid consumer key obtained through requests library and OAuth workflow**'

base_url = 'http://wbsapi.withings.net/notify'

params = {
'action': 'subscribe',
'callbackurl': '**callback URL**',
'comment': '**comment**',
'oauth_consumer_key': '**consumer_key**',
'oauth_nonce': 'etc etc',
'oauth_signature' : '' # <-------------- Where do I get this
# etc etc... I have everything else
}
r = requests.get("http://wbsapi.withings.net/notify", params=params)

必要なのはこれだけです。必要なものはすべて揃っていますが、署名はありません。oauth ライブラリから署名を取得する方法はありますか? これが私を支えてきたすべてです。

4

2 に答える 2

35

GETURL クエリ文字列でリクエストを実行するには:

import requests

params = {
    'action': 'subscribe',
    'callbackurl': '',
    'comment': '',
    'oauth_consumer_key': '',
    'oauth_nonce': '',
    # more key=value pairs as appeared in your query string
}
r = requests.get("http://wbsapi.withings.net/notify", params=params)

これをクリアしたら、 http: //www.withings.com/en/api/oauthguide に記載されているワークフローに従って 実装するだけです。

  1. OAuth キーと OAuth シークレットを受け取ったらGET、次のエンドポイントとクエリ文字列を使用してリクエストを実行すると、返されますtoken

    https://oauth.withings.com/account/request_token ? oauth_callback=http%3A%2F%2Fexample.com%2Fget_access_token &oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=f71972b1fa93b8935ccaf34ee02d7657 &oauth_signature=J8xzgFtHTsSRw8Ejc8UDV2jls34%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311778988 &oauth_version=1.0

  2. 次に、受け取ったトークンを次のリクエストで承認する必要があります。これにより、 user_idが得られます。

    https://oauth.withings.com/account/authorize ? oauth_callback=http%3A%2F%2Fexample.com%2Fget_access_token &oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=369f9ceb2f285ac637c9a7e9e98019bd &oauth_signature=OR9J9iEl%2F2yGOXP2wk5c2%2BWtYvU%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311778988 &oauth_token=5bb105d2292ff43ec9c0f633fee9033045ed4643e9871b80ce586dc1bf945 &oauth_version=1.0

  3. access_token次に、このエンドポイントにいくつかのクエリ文字列を追加して、をリクエストする必要があります。

    https://oauth.withings.com/account/access_token ? oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=7acd22371fc56fd8a0aaf8416f79f84f &oauth_signature=jmj1g%2FB3rYR2DCpWp86jB5YVHIM%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311778988 &oauth_token=5bb105d2292ff43ec9c0f633fee9033045ed4643e9871b80ce586dc1bf945 &oauth_version=1.0 &userid=831

  4. これで、質問で前述のリクエストを実行するために必要なすべてのものと、ドキュメントから直接例を挙げたものがあります。

    http://wbsapi.withings.com/measure ? action=getmeas &oauth_consumer_key=c331c571585e7c518c78656f41582e96fc1c2b926cf77648223dd76424b52b &oauth_nonce=accbac1b7ee2b86b828e6dc4a5a539b2 &oauth_signature=XfobZMboIg2cRyNKAvyzONHHnKM%3D &oauth_signature_method=HMAC-SHA1 &oauth_timestamp=1311842514 &oauth_token=887557411788d5120537c6550fbf2df68921f8dd6f8c7e7f9b441941eb10 &oauth_version=1.0 &userid=831

繰り返しますが、メソッドの引数にフィードから構築されたクエリ文字列を使用oauthしてワークフローを終了できるため、明示的なライブラリがなくてもすべてを実行できます。requests.getdictparams

これがあなたの目標を達成するのに役立つことを心から願っています。

于 2013-07-22T13:30:55.967 に答える
0

rauth クライアント ライブラリを使用した実際の例を次に示します。完全な開示、私は元の rauth の作成者です。お役に立てれば:

from rauth import OAuth1Service

withings = OAuth1Service(
        name='withings',
        consumer_key='fd5fe4002db502983fbd056fdf416941d83e15ecb68ee9eeb4978cb2370c',
        consumer_secret='29dbc46056c530814c2debcf24c76ff42f6cc66d0e3e5cfdef1e166725c6f',
        base_url='http://wbsapi.withings.net/notify',
        request_token_url='https://oauth.withings.com/account/request_token',
        authorize_url='http://oauth.withings.com/account/authorize',
        access_token_url='https://oauth.withings.com/account/access_token')

request_token, request_token_secret = withings.get_request_token()

callback = 'https://github.com/litl/rauth'

authorize_url = withings.get_authorize_url(request_token,
                                           oauth_callback=callback)

print('Visit this URL in your browser: {url}'.format(url=authorize_url))
userid = raw_input('Enter userid from browser URL: ')

sess = withings.get_auth_session(request_token,
                                 request_token_secret,
                                 params={'userid': userid})

print sess.get('measure', params={'action': 'getmeas',
                                  'userid': userid}).json()
于 2013-07-22T23:59:57.517 に答える