我一直在寻找一种在python 3中实现2腿oauth的方法来与brightcloud api一起工作。他们使用java,php,ruby,.NET C#提供了几个代码示例:https://bcws.brightcloud.com/code-samples.php。我尝试使用相同的逻辑将java示例转换为python,然而,我对python来说相对较新,我很快就崩溃了。
我尝试使用rauth实现,但是,基本设置使用了brightcloud不提供的request_token_url。我也尝试使用基于这个答案的以下代码实现 - How do I send a POST using 2-legged oauth2 in python?
import oauth2
import urllib #for url-encode
import urllib.request
import time #Unix timestamp import oauth2
# construct request url
base_url = "http://thor.brightcloud.com/rest"
uri_info_path = "/uris"
url = urllib.parse.quote_plus("http://www.booking.com")
# api key and secret
consumer_key = 'MY_CONSUMER_KEY'
consumer_secret = 'MY_CONSUMER_SECRET'
# contruct endpoint
endpoint = rest_endpoint + uri_info_path + '/' + url
# build request
def build_request(url, method):
params = {
'oauth_version': "1.0",
'oauth_nonce': oauth2.generate_nonce(),
'oauth_timestamp': int(time.time())
}
consumer = oauth2.Consumer(key=consumer_key, secret=consumer_secret)
params['oauth_consumer_key'] = consumer.key
req = oauth2.Request(method=method, url=url, parameters=params)
signature_method = oauth2.SignatureMethod_HMAC_SHA1()
req.sign_request(signature_method, consumer, None)
return req
# call
request = build_request(endpoint,'GET')
u = urllib.request.urlopen(request.to_url())
data = u.read()
print (data)
此行存在问题: u = urllib.request.urlopen(request.to_url())
生成以下追溯:
追踪(最近一次通话): 文件“bright.py”,第37行,in u = urllib.request.urlopen(request.to_url()) 文件“/usr/lib/python3.5/urllib/request.py”,第163行,在urlopen中 return opener.open(url,data,timeout) 文件“/usr/lib/python3.5/urllib/request.py”,第472行,打开 response = meth(req,response) 在http_response中输入文件“/usr/lib/python3.5/urllib/request.py”,第582行 'http',请求,响应,代码,消息,hdrs) 文件“/usr/lib/python3.5/urllib/request.py”,第510行,出错 return self._call_chain(* args) _call_chain中的文件“/usr/lib/python3.5/urllib/request.py”,第444行 result = func(* args) 在> http_error_default中输入文件“/usr/lib/python3.5/urllib/request.py”,第590行 引发HTTPError(req.full_url,code,msg,hdrs,fp) urllib.error.HTTPError:HTTP错误401:未经授权
非常感谢任何帮助。