Yelp API生成无效签名错误

时间:2015-10-16 23:59:37

标签: python yelp oauth-1.0a

在查看了几篇在线文章,StackOverflow和Yelp Google Group之后,我一直无法找出问题,因为我的Yelp API请求产生了Invalid Signature错误。

这是确切的错误:

{'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())

那究竟是什么导致了这个错误?我在尝试之前做了一些修改,之前的尝试我得到了类似的错误;除了一次我只有一个" 无效签名"错误,没有" 期望签名基本字符串"消息

2 个答案:

答案 0 :(得分:3)

根据docs

,还有更多步骤需要进行身份验证

提出请求

  

每个请求必须包含以下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.
  

这些参数可以作为URL查询键或POST数据在HTTP(授权)标头中传递。生成OAuth签名是通过将HMAC-SHA1与oauth_token_secret一起应用来完成的。您可以在Manage API Access中查看您的OAuth使用者密钥。 OAuth库可用于生成这些请求。

您没有传递所需的oauth_timestamp或应用HMAC-SHA1,因此您收到Invalid Signature错误,上面的文档中清楚地概述了您需要发送的内容。

您还可以使用实际的python yelp api但是要发出请求,您可以根据example code:中的request函数使用以下示例来使用{{{}进行请求1}}和oauth2

requests

使用你的url输出一整套json,其开头是:

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()

我不确定api是否支持python 3,但上面的代码是用python3和python2测试的,并且工作正常,安装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': ............................................................... ............................................................... 你可以简单oauth2和你的请求相同没有安装它。

答案 1 :(得分:0)

另一个常见问题是服务器时间不同步。在linux上,可以运行

sudo ntpdate -s time.nist.gov