Ошибка распаковки ответа в Python 2.7 с python-oauth2 и Аутентифицированным API Imgur - PullRequest
0 голосов
/ 16 августа 2011

Приветы!

Я работал над загрузчиком файлов с несколькими службами, который фильтрует расширения файлов, чтобы решить, к какой службе следует загружать файл. Моя основная цель - загрузка в учетную запись пользователя Imgur, поскольку его API является наиболее сложным в отличие от других служб (то есть аутентификация с помощью OAuth2). Ранее у меня были проблемы с подключением через SSL, поскольку мое хранилище сертификатов HTTPLib не проверяло SSL Handshake, но я исправил это, вручную добавив ЦС поставщика сертификатов Imgur в список сертификатов.

В любом случае, мне удалось «войти» в Imgur с помощью файлов cookie, но я бы предпочел использовать oauth - метод cookie по-прежнему использует анонимный API, который имеет более низкий предел загрузки. Я пытаюсь сделать это, сгенерировав URL-адрес для аутентификации Oauth и используя wxPython, чтобы создать простое диалоговое окно ввода текста, запрашивающее PIN-код, указанный указанным URL-адресом, когда пользователь предоставляет свои учетные данные. Проблема в том, что вызов средства проверки подлинности для 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 голосов
/ 20 апреля 2012

Я использую для запроса python oauthТак что я просто получил tokenList[0], что решило мою проблему.

Надеюсь, это поможет через год.

...