在查看了几篇在线文章,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())
那究竟是什么导致了这个错误?我在尝试之前做了一些修改,之前的尝试我得到了类似的错误;除了一次我只有一个" 无效签名"错误,没有" 期望签名基本字符串"消息
答案 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