6

我一直在苦苦思索如何使用 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,你是我唯一的希望!有人对如何使用我的访问令牌提交请求有建议吗?

谢谢!

4

2 回答 2

10

Twitter 的文档已经过时了——oauth2他们链接到的版本是一个 3 年前的分支。force_auth_header不再有关键字参数oauth2.Client.request

即使在删除有问题的行之后仍然会出现错误的原因是因为您的默认值post_bodyNone直接传递给oauth2.Client.request. 在实践中你将无法做到这一点。您要么必须要求该参数,选择一个有效的默认值(例如空字符串),要么在传递它之前检查以防止出现此错误。

于 2012-09-28T14:42:26.573 回答
4

只是为了扩展 Rafe 的评论......

Python 中的大部分 oAuth 库都严重损坏、过时且不再维护。他们中的大多数甚至没有通过自己的测试,更不用说格式规范了。Twitter 不应该引用任何这些东西,但他们确实这样做了。

Twython是一个包装 oAuth 的 Python twitter 客户端 - https://github.com/ryanmcgrath/twython - 它通过requestsrequests-oauth包包装 oAuth1 规范 - http://docs.python-requests.org/en/latest/http: //pypi.python.org/pypi/requests-oauth - 但 Twitter 的 API 接受这一点。

就 oAuth 2 而言,这个库最近有一些工作试图实现它(最后一次提交是在 2 个月前)——https: //github.com/idan/oauthlib 。我自己没试过,昨天才知道。

快速添加 - 即使您使用的是 etsy,如果它们支持 oauth1,您应该能够对 twython 进行逆向工程以使用 etsy 端点。

于 2012-09-28T14:59:41.320 回答