1

rauth OAuth1 の例に従ってアクセス トークンを取得し、fatsecret APIからデータを取得することに成功しました。access_token と access_token_secret をシェルブ データベースに保存します。私の問題は、保存したトークンを使用して後でさらにデータを取得しようとすると、「無効な署名」エラーが表示されることです。

トークンを取得してexercise_entries.getメソッドを取得するための元のスクリプトは次のとおりです。

from rauth.service import OAuth1Service
import shelve

api_url = 'http://platform.fatsecret.com/rest/server.api'
shelf = shelve.open('token_shelf.db')

fatsecret = OAuth1Service(
    consumer_key = 'xxxxxxxxxxxxx',
    consumer_secret = 'xxxxxxxxxxxxx',
    name = 'fatsecret',
    request_token_url = 'http://www.fatsecret.com/oauth/request_token',
    access_token_url = 'http://www.fatsecret.com/oauth/access_token',
    authorize_url = 'http://www.fatsecret.com/oauth/authorize')

request_token, request_token_secret = fatsecret.get_request_token(
                        method = 'GET',
                        params = {'oauth_callback':'oob'})

authorize_url = fatsecret.get_authorize_url(request_token)

print 'Visit this URL in your browser: ' + authorize_url
pin = raw_input('Enter PIN from browser: ')
shelf['fatsecret_request_token'] = request_token
shelf['fatsecret_request_token_secret'] = request_token_secret
shelf['fatsecret_pin'] = pin

session = fatsecret.get_auth_session(
                                     request_token, 
                                     request_token_secret, 
                                     params={'oauth_verifier': pin}
                                     )
shelf['fatsecret_access_token'] = session.access_token
shelf['fatsecret_access_token_secret'] = session.access_token_secret

my_params = {'method': 'exercise_entries.get', 'format': 'json'}
r = session.get(api_url, params=my_params)

print r.json()
print r.content
shelf.close()

次に、シェルフから access_token と access_token_secret を復元して新しいセッションを開こうとしましたが、無効な署名があると言われました。

from rauth.service import OAuth1Service
import shelve
api_url = 'http://platform.fatsecret.com/rest/server.api'
shelf = shelve.open('token_shelf.db')
fs_access_token = shelf['fatsecret_access_token']
fs_access_token_secret = shelf['fatsecret_access_token']

fatsecret = OAuth1Service(
    consumer_key = 'xxxxxxxxxxxxx',
    consumer_secret = 'xxxxxxxxxxxxx',
    name = 'fatsecret',
    request_token_url = 'http://www.fatsecret.com/oauth/request_token',
    access_token_url = 'http://www.fatsecret.com/oauth/access_token',
    authorize_url = 'http://www.fatsecret.com/oauth/authorize')

session = fatsecret.get_session((fs_access_token,fs_access_token_secret))

my_params = {'method': 'exercise_entries.get', 'format': 'json'}
r = session.get(api_url,params=my_params)
print r.content
print r.url
shelf.close()

これは次のように返さr.contentれます。

{ "error": {"code": 8, "message": "Invalid signature: oauth_signature 'ccZpSYAPSn+umkTxcAVH7EChVvw='" }}

そしてr.url次のとおりです。

http://platform.fatsecret.com/rest/server.api?oauth_nonce=604416f368159818e3ad8252a0da323be16319a3&format=json&oauth_consumer_key=xxxxxxxxxxxxx&oauth_timestamp=1390015877&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_token=xxxxxxxxxxxxx&oauth_signature=l4Ricqpbbwl%2BHPS2ItLLnvXQo%2FA%3D&method=exercise_entries.get

私の目を引く唯一のことは、r.url パラメーターが辞書順にソートされていないように見えることですが、それが fatsecret に送信されたものを正確に反映しているかどうかはわかりません。

の代わりにOAuth1Session を使用して同様のことを試しましたがOAuth1Service、まったく同じ結果が得られました。

これを機能させるための助けをいただければ幸いです。

4

1 に答える 1

1

このコードを何度もチェックしましたが、何も問題はありませんでした。デバッグのために余分な出力を追加したときに、再利用セッションの 6 行目で access_token を 2 回取得していることに気付きました。結局のところ、それは単なるタイプミスでした。

変化する:

fs_access_token = shelf['fatsecret_access_token']
fs_access_token_secret = shelf['fatsecret_access_token']

に:

fs_access_token = shelf['fatsecret_access_token']
fs_access_token_secret = shelf['fatsecret_access_token_secret']

したがって、上記のコードは実際には、python を使用して fatsecret api で認証する良い例です。

于 2014-01-28T02:08:01.277 に答える