Pergunta

Estou tentando usar a função "update_profile_background_image" no tweepy e estou obtendo o erro:

Traceback (most recent call last):
  File "XXX.py", line 1401, in <module>
    psn_card.gen_twitter_bg(user_db)
  File "XXX.py", line 972, in gen_twitter_bg
    auth_api.update_profile_background_image(file)
  File "build/bdist.linux-x86_64/egg/tweepy/api.py", line 346, in update_profile_background_image
    headers, post_data = API._pack_image(filename, 800)
  File "build/bdist.linux-x86_64/egg/tweepy/api.py", line 729, in _pack_image
    body = '\r\n'.join(body)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal not in range(128)

o problema é: esta lib está dentro de um arquivo egg, como resolvo esse problema? Este é um bug no tweepy?

A função é ler um arquivo (imagem) e enviar via POST (http) para a API do Twitter.

O erro ocorre no ponto em que tento manipular a imagem carregada.

Todos os meus .py estão configurados para usar utf-8:

# -- coding: utf-8 --
Foi útil?

Solução

Meu palpite é que filename é uma string Unicode.Infelizmente, o Tweepy não oferece suporte a nomes de arquivo Unicode.Isso é um inseto?Indiscutivelmente.

O problema é que ele tenta criar os dados HTTP POST usando a string Unicode literalmente, em vez de codificá-los em uma string de bytes:

body.append('Content-Disposition: form-data; name="image"; filename="%s"' % filename)

Isso transforma uma string na lista body em uma string Unicode e, quando uma string em uma sequência é uma string Unicode e você tenta join(), o resultado acaba sendo Unicode.No entanto, um corpo HTTP POST é uma string de bytes com uma carga de sujeira binária, portanto, não é compatível com ASCII e, portanto, tenta forçá-lo implicitamente a uma falha Unicode.

(Em qualquer caso, o nome do arquivo fornecido em Content-Disposition definitivamente não deve conter um caminho completo, como o código acima faz. Eu sugeriria algo como filename= os.path.basename(filename).encode('us-ascii', 'ignore') na linha anterior como uma primeira solução rápida. Eu nãocertifique-se de que o Twitter se importe até mesmo com o nome do arquivo ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top