如何使用python-oauth2发送oauth请求

如何使用python-oauth2发送oauth请求,python,oauth,Python,Oauth,我一直在绞尽脑汁想如何用oauth发送经过身份验证的请求 我能够获得访问令牌,但不完全确定如何使用它们提交请求。我在twitter的开发者信息中发现了这一点: 其中包含一些用于发送授权请求的示例代码: def oauth_req(url, key, secret, http_method="GET", post_body=None,http_headers=None): consumer = oauth.Consumer(key=consumerKey, secret=consumer

我一直在绞尽脑汁想如何用oauth发送经过身份验证的请求

我能够获得访问令牌,但不完全确定如何使用它们提交请求。我在twitter的开发者信息中发现了这一点:

其中包含一些用于发送授权请求的示例代码:

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'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/tmp/python-22060Umg.py”,第153行,在
事务=oauth_请求('http://openapi.etsy.com/v2/shops/:user/transactions'、令牌密钥、令牌密钥)
文件“/tmp/python-22060Umg.py”,第76行,在oauth_req中
force_auth_头=True
TypeError:request()获得意外的关键字参数“force\u auth\u 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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/tmp/python-22060hwm.py”,第153行,在
事务=oauth_请求('http://openapi.etsy.com/v2/shops/:user/transactions'、令牌密钥、令牌密钥)
文件“/tmp/python-22060hwm.py”,第75行,在oauth_req中
headers=http\u头
请求中的文件“/usr/lib/python2.7/dist packages/oauth2/_init__.py”,第662行
请求签名请求(self.method、self.consumer、self.token)
文件“/usr/lib/python2.7/dist packages/oauth2/_init__.py”,第493行,在签名请求中
self['oauth\u body\u hash']=base64.b64encode(sha(self.body.digest())
TypeError:必须是字符串或缓冲区,而不是无
现在,你是我唯一的希望!有人建议如何使用我的访问令牌提交请求吗


谢谢

Twitter的文档已经过时了——他们链接到的
oauth2
版本是一个3年前的fork。对于
oauth2.Client.request


即使删除了有问题的行,仍然会出现错误的原因是,
post\u body
的默认值为
None
,它直接传递到
oauth2.Client.request
。在实践中你不可能做到这一点。您要么需要该参数,要么选择一个有效的默认值(例如空字符串),要么在传递它之前进行检查以防止出现此错误。

只需在Rafe的注释上展开即可

Python中的大部分oAuth库都被破坏得令人难以置信,已经过时,并且不再维护。他们中的大多数人甚至没有通过自己的测试,更不用说格式规范了。推特不应该引用这些东西,但他们确实引用了

Twython
是一个包装oAuth的Python twitter客户端,它通过
requests
requests oAuth
包包装oAuth1规范,但twitter的API接受这一点

就OAuth2而言,这个库最近做了一些工作来实现它(上一次提交是在2个月前)。我自己没试过,昨天才发现


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

您可以发布代码吗?如果没有它,就不可能真正提供帮助。代码与原始帖子中的链接相同。我已经编辑了原始帖子以包含代码;谢谢如果您需要为OAuth 1.0/a和2.0提供一个全面的、可维护的客户端库,您可以尝试。