1

Invalid Signatureオンラインのいくつかの記事、StackOverflow、Yelp Google Group を見た後、Yelp API リクエストから生成されたエラーの問題を特定できませんでした。

正確なエラーは次のとおりです。

{'error': {'text': 'Signature was invalid', 'description': 'Invalid signature. Expected signature base string: [some text here with keys]}}

そして、それに合わせて私が書いたコード:

import rauth
import time

def get_results():

    #Obtain these from Yelp's manage access page
    consumer_key = ''
    consumer_secret = ''
    token = ''
    token_secret = ''

    session = rauth.OAuth1Session(
            consumer_key = consumer_key
            ,consumer_secret = consumer_secret
            ,access_token = token
            ,access_token_secret = token_secret)

    request = session.get("http://api.yelp.com/v2/search?location=Boston&term=food")

    #Transforms the JSON API response into a Python dictionary
    data = request.json()
    print(data)
    session.close()

    return data

if __name__=="__main__":
    print(get_results())

では、このエラーの原因は正確には何ですか? この試行の前にいくつかの変更を行いましたが、以前に行った試行でも同様のエラーが発生しました。「無効な署名」エラーのみが表示され、「署名ベース文字列を期待する」メッセージが表示されなかった場合を除いて

4

2 に答える 2

3

ドキュメントによると、認証にはさらに多くの手順があります

リクエストの作成

各リクエストには、次の OAuth プロトコル パラメータが含まれている必要があります。

OAuth Parameter Value
oauth_consumer_key  Your OAuth consumer key (from Manage API Access).
oauth_token The access token obtained (from Manage API Access).
oauth_signature_method  hmac-sha1
oauth_signature The generated request signature, signed with the oauth_token_secret obtained (from Manage API Access).
oauth_timestamp Timestamp for the request in seconds since the Unix epoch.
oauth_nonce A unique string randomly generated per request.

これらのパラメーターは、HTTP (Authorization) ヘッダーで URL クエリ キーとして、または POST データで渡すことができます。OAuth 署名の生成は、oauth_token_secret で HMAC-SHA1 を適用することによって行われます。OAuth コンシューマー キーは、Manage API Access で確認できます。これらのリクエストを生成するには、OAuth ライブラリを使用できます。

必要なものを渡しoauth_timestampていないか、HMAC-SHA1 を適用していないため、Invalid Signatureエラーが発生します。送信する必要があるものの上のドキュメントで明確に概説されています。

使用できる実際の python yelp APIもありますが、リクエストを行うには、サンプル コードrequestの関数 に基づいて以下の例を使用できます。oauth2requests

import requests
import oauth2

def request(url, url_params=None):
    consumer_key = ""
    consumer_secret = ""
    token = ""
    token_secret =""
    url_params = url_params or {}
    consumer = oauth2.Consumer(consumer_key, consumer_secret)
    oauth_request = oauth2.Request(method="GET", url=url, parameters=url_params)

    oauth_request.update(
        {
            'oauth_nonce': oauth2.generate_nonce(),
            'oauth_timestamp': oauth2.generate_timestamp(),
            'oauth_token': token,
            'oauth_consumer_key': consumer_key
        }
    )
    token = oauth2.Token(token, token_secret)
    oauth_request.sign_request(oauth2.SignatureMethod_HMAC_SHA1(), consumer, token)
    signed_url = oauth_request.to_url()

    print(u'Querying {0} ...'.format(url))

    return requests.get(signed_url).json()

あなたのURLを使用すると、jsonの全負荷が出力されます。その開始は次のとおりです。

Querying http://api.yelp.com/v2/search?location=Boston&term=food ...
{'region': {'center': {'longitude': -71.05460875, 'latitude': 42.35028894954365}, 'span': {'latitude_delta': 0.0325510910039668, 'longitude_delta': 0.04668455000000904}}, 'total': 8351, 'businesses': [{'name': "Giacomo's Ristorante", 'url': 'http://www.yelp.com/biz/giacomos-ristorante-boston', 'mobile_url': 'http://m.yelp.com/biz/giacomos-ristorante-boston', 'rating_img_url_large': 'http://s3-media2.fl.yelpcdn.com/assets/2/www/img/ccf2b76faa2c/ico/stars/v1/stars_large_4.png', 'phone': 
...............................................................
...............................................................

API が python 3 をサポートしているかどうかはわかりませんが、上記のコードは python3 と python2 でテストされており、問題なく動作します。インストールしていない場合は、リクエストと同じようにoauth2簡単にインストールできます。pip install oauth2

于 2015-10-21T17:33:49.897 に答える
0

もう 1 つの一般的な問題は、サーバーの時刻が同期していないことです。Linuxでは、実行できます

sudo ntpdate -s time.nist.gov
于 2016-04-24T03:46:02.930 に答える