我编写了一个Python程序来使用OAuth
。我在使用accesstoken访问服务资源时发现了一个问题(以Twitter为例)。在
我能够成功地检索access_token
,但是如果我试图在twitter中使用access_token
作为Authorization
头,那就行不通了。不过,如果我得到的是普通的url,那么我会得到想要的结果。在
parameters_access_resource = [
('oauth_consumer_key', self.consumerKey),
('oauth_signature_method', 'HMAC-SHA1'),
('oauth_timestamp', self._timestamp),
('oauth_nonce', self._nonce),
('oauth_version', '1.0'),
('oauth_token', self._accessToken),
('oauth_signature', self._signature)
]
以下方法有效:
^{pr2}$问题:
根据Twitter文档,access_token
应该作为Authorization
头传递,所以我修改了如下代码
headers = {
"Accept": "*/*",
"Connection": "close",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Content-Type" : "application/x-www-form-urlencoded",
"Host" : "api.twitter.com",
"Authorization" : self._getAuthorizationHeader(parameters_access_resource)
}
def _getAuthorizationHeader(self,params):
params = dict(params)
sortedParams = {}
sortedParams = collections.OrderedDict(sorted(params.items()))
authHeader = (
'%s="%s"' % (k, v) for k, v in sortedParams.iteritems())
retval = "OAuth " + ', '.join(authHeader)
return retval
url = "https://api.twitter.com/1.1/account/settings.json"
reqobj = urllib2.Request(url,data=[],headers=headers)
resp = urllib2.urlopen(reqobj)
print resp.read()
报告以下错误后,我尝试了不同的组合,包括使用requests
模块,但我无法解决问题。在
{"errors":[{"code":215,"message":"Bad Authentication data."}]}
有人能告诉我如何解决这个问题吗。在
附言:我知道已经有很多模块可以完成这个任务,但是我写这段代码是为了学习。在
找到了一个解决方案,在构建header时出现了一个问题,我不是
percent-encoding
header的值。下面的代码解决了这个问题相关问题 更多 >
编程相关推荐