UnicodeDecodeError na importação (tweepy)
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 --
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 ...)