python - Yahoo BOSS V2授权麻烦

标签 python oauth yahoo

我在雅虎的身份验证/授权方面遇到了困难。我在我的帐户中启用了 BOSS,设置了付款方式,现在我正在尝试使用一些 python 代码运行搜索:

import urllib2
import oauth2 as oauth
import time

OAUTH_CONSUMER_KEY = "blahblahblah"
OAUTH_CONSUMER_SECRET = "blah"

def oauth_request(url, params, method="GET"):
    params['oauth_version'] = "1.0",
    params['oauth_nonce'] = oauth.generate_nonce(),
    params['oauth_timestamp'] = int(time.time())

    consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY,
                              secret=OAUTH_CONSUMER_SECRET)
    params['oauth_consumer_key'] = consumer.key
    req = oauth.Request(method=method, url=url, parameters=params)
    req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)

    return req


if __name__ == "__main__":
    url = "http://yboss.yahooapis.com/ysearch/web"

    req = oauth_request(url, params={"q": "cats dogs"})
    req_url = req.to_url()
    print req_url
    result = urllib2.urlopen(req_url)

我不断收到 urllib2.HTTPError: HTTP Error 401: Unauthorized 异常。我无法弄清楚我的 key 是否有问题,或者签名方法有问题,或者我是否在签名后以某种方式篡改了我的数据,或者交易是什么。有人有建议吗?

最佳答案

我做了一些小改动以使您的示例正常工作。请参阅代码以获取评论。

import urllib2
import oauth2 as oauth
import time

OAUTH_CONSUMER_KEY = "blahblahblah"
OAUTH_CONSUMER_SECRET = "blah"

def oauth_request(url, params, method="GET"):
    # Removed trailing commas here - they make a difference.
    params['oauth_version'] = "1.0" #,
    params['oauth_nonce'] = oauth.generate_nonce() #,
    params['oauth_timestamp'] = int(time.time())

    consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY,
                              secret=OAUTH_CONSUMER_SECRET)
    params['oauth_consumer_key'] = consumer.key
    req = oauth.Request(method=method, url=url, parameters=params)
    req.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, None)

    return req


if __name__ == "__main__":
    url = "http://yboss.yahooapis.com/ysearch/web"

    req = oauth_request(url, params={"q": "cats dogs"})
    # This one is a bit nasty. Apparently the BOSS API does not like
    # "+" in its URLs so you have to replace "%20" manually.
    # Not sure if the API should be expected to accept either.
    # Not sure why to_url does not just return %20 instead...
    # Also, oauth2.Request seems to store parameters as unicode and forget
    # to encode to utf8 prior to percentage encoding them in its to_url
    # method. However, it's handled correctly for generating signatures.
    # to_url fails when query parameters contain non-ASCII characters. To
    # work around, manually utf8 encode the request parameters.
    req['q'] = req['q'].encode('utf8')
    req_url = req.to_url().replace('+', '%20')
    print req_url
    result = urllib2.urlopen(req_url)

关于python - Yahoo BOSS V2授权麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796722/

相关文章:

python - pd.df.plot.box() 和 pd.df.boxplot() 之间的区别

asp.net - 利用Active Directory的REST API的授权方法

用于解析 Yahoo Weather Info 的 PHP 代码因负度数而失败

oauth - 在 StormPath 之上添加授权代码授予

oauth - 应用程序类型 (OpenID Connect) 是否对应于客户端类型 (OAuth 2.0)?

javascript - 在 YAP 中外部化 Javascript

python - Python 中滚动相关数据框的滚动平均值?

python - 在 linux 中导入错误,但在 windows 中导入成功

python - Django:尝试选择随机结果,但获取对象没有 len() 错误

python - 在 Python 中将集合作为参数传递