使用python-oauth2和Imgur的Authenticated API在Python 2.7中响应解包错误

时间:2011-08-16 13:51:54

标签: python oauth gzip imgur

拜!

我一直在研究一个多服务文件上传器,它过滤文件扩展名以决定应该将文件上传到哪个服务。我的主要目标是上传到Imgur用户帐户,因为与其他服务(即使用OAuth2进行身份验证)相比,其API最复杂。我以前遇到过通过SSL连接的问题,因为我的HTTPLib证书存储不会验证SSL握手,但我通过手动将Imgur的证书提供商的CA添加到证书列表来解决这个问题。

无论如何,我已经能够使用cookie“登录”到Imgur,但我更倾向于使用oauth - cookie方法仍然使用匿名API,它具有较低的上传限制。我正在尝试通过生成Oauth身份验证URL,并使用wxPython创建一个简单的文本输入对话框,询问用户提供其凭据时由该URL提供的PIN。问题是调用python-oauth2的身份验证器导致gzip解包错误,我不知道如何打击。这是错误:

Traceback (most recent call last):
  File "C:\Users\Austin\Programming\python\uploaderator\mk2\main.py", line 10, in <module>
    uploader = crumpet.Crumpet()
  File "C:\Users\Austin\Programming\python\uploaderator\mk2\crumpet.py", line 30, in __init__
    s.connect()
  File "C:\Users\Austin\Programming\python\uploaderator\mk2\imgurHandler.py", line 40, in connect
    self.authorize(pin)
  File "C:\Users\Austin\Programming\python\uploaderator\mk2\oauthHandler.py", line 28, in authorize
    resp, content = client.request(self.access_token_url, "POST")
  File "build\bdist.win32\egg\oauth2\__init__.py", line 682, in request
  File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1436, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1188, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 1174, in _conn_request
    content = _decompressContent(response, content)
  File "C:\Python27\lib\site-packages\httplib2-0.7.1-py2.7.egg\httplib2\__init__.py", line 384, in _decompressContent
    content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
  File "C:\Python27\lib\gzip.py", line 245, in read
    self._read(readsize)
  File "C:\Python27\lib\gzip.py", line 316, in _read
    self._read_eof()
  File "C:\Python27\lib\gzip.py", line 334, in _read_eof
    crc32 = read32(self.fileobj)
  File "C:\Python27\lib\gzip.py", line 25, in read32
    return struct.unpack("<I", input.read(4))[0]
struct.error: unpack requires a string argument of length 4

我的授权功能,在获取引脚后调用,是:

def authorize(self, pin):
    self.token_u.set_verifier(pin)
    client = oauth.Client(self.consumer, self.token_u)
    resp, content = client.request(self.access_token_url, "POST")
    access_token = dict(urlparse.parse_qsl(content))
    self.oauth_token = access_token['oauth_token']
    self.oauth_token_secret = access_token['oauth_token_secret']
    self.token = oauth.Token(self.oauth_token, self.oauth_token_secret)
    self.client = oauth.Client(self.consumer, self.token)
    if resp['status'] == '200':
            return True
    else:
            return False

self.access_token_url为https://api.imgur.com/oauth/access_token,由Imgur API身份验证资源提供。

我不确定这是否是我的代码的问题,或者Imgur返回的响应,因为有其他基于python的上传器似乎工作正常,使用非常类似的方法。就像我在标题中提到的那样,我使用的是Python 2.7和python-oauth2

我非常感谢任何意见。谢谢你的时间。

量角器忍者

1 个答案:

答案 0 :(得分:0)

我正在使用request-oauth for python,我认为我遇到的问题是,我的解析器将令牌作为一个项目的列表返回。所以我所做的只是获得tokenList[0],这解决了我的问题。

希望它有所帮助,一年之后。