我一直在撞墙,试图找出如何用oauth发送经过验证的请求。
我能够访问令牌,但不完全确定如何向他们提交请求。我在twitter的开发者信息中找到了这个:
https://dev.twitter.com/docs/auth/oauth/single-user-with-examples#python 它有一些用于发送授权请求的示例代码:
def oauth_req(url, key, secret, http_method="GET", post_body=None,http_headers=None):
consumer = oauth.Consumer(key=consumerKey, secret=consumerSecret)
token = oauth.Token(key=tokenKey, secret=tokenSecret)
client = oauth.Client(consumer, token)
resp, content = client.request(
url,
method=http_method,
body=post_body,
headers=http_headers,
#force_auth_header=True
)
return resp,content
oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret)
但是,当我收录所有信息时,我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/tmp/python-22060Umg.py", line 153, in <module>
transactions = oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret)
File "/tmp/python-22060Umg.py", line 76, in oauth_req
force_auth_header=True
TypeError: request() got an unexpected keyword argument 'force_auth_header'
其中:user是实际用户(我已将其从帖子中删除),tokenKey / tokenSecret是访问令牌。
我想也许这就像评论违规行一样简单,但没有这样的运气:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/tmp/python-22060hwm.py", line 153, in <module>
transactions = oauth_req('http://openapi.etsy.com/v2/shops/:user/transactions',tokenKey,tokenSecret)
File "/tmp/python-22060hwm.py", line 75, in oauth_req
headers=http_headers
File "/usr/lib/python2.7/dist-packages/oauth2/__init__.py", line 662, in request
req.sign_request(self.method, self.consumer, self.token)
File "/usr/lib/python2.7/dist-packages/oauth2/__init__.py", line 493, in sign_request
self['oauth_body_hash'] = base64.b64encode(sha(self.body).digest())
TypeError: must be string or buffer, not None
所以现在,stackoverflow,你是我唯一的希望!有人建议如何使用我的访问令牌提交请求吗?
谢谢!
答案 0 :(得分:10)
Twitter的文档已经过时 - 他们链接到的oauth2
版本是一个3年前的版本。 force_auth_header
oauth2.Client.request
即使在删除有问题的行后仍然出现错误的原因是因为post_body
的默认值为None
,它会直接传递到oauth2.Client.request
。你在实践中无法做到这一点。您必须要求该参数,选择一个有效的默认值(例如空字符串),或者在传递之前进行检查以防止此错误。
答案 1 :(得分:4)
只是为了扩展Rafe的评论......
Python中的大量oAuth库非常破碎,已过时且不再维护。他们中的大多数甚至没有通过他们自己的测试,更不用说格式规范了。 Twitter不应该引用任何这些东西,但他们确实如此。
Twython
是一个包含oAuth的Python Twitter客户端 - https://github.com/ryanmcgrath/twython - 它通过requests
和requests-oauth
包 - http://docs.python-requests.org/en/latest/包装oAuth1规范,{ {3}} - 但Twitter的API接受了这一点。
就oAuth 2而言,这个库最近有一些尝试实现它的工作(最后一次提交2个月前) - http://pypi.python.org/pypi/requests-oauth。我自己没试过,昨天就发现了。
快速添加 - 即使您正在使用etsy,如果他们支持oauth1,您应该能够对twython进行逆向工程以使用etsy端点。