Я предполагаю, что filename
является строкой Юникода.К сожалению, Tweepy не поддерживает имена файлов Unicode.Это ошибка?Возможно.
Проблема в том, что он пытается создать данные HTTP POST, используя дословную строку Unicode, вместо того, чтобы кодировать их до байтовой строки:
body.append('Content-Disposition: form-data; name="image"; filename="%s"' % filename)
Это делает одну строку вbody
перечисляет строку Unicode, и когда одна строка в последовательности является строкой Unicode, и вы пытаетесь join()
их, в результате получается Unicode.Однако тело HTTP POST представляет собой байтовую строку с загрузкой двоичного ганка, поэтому оно не является ASCII-совместимым и поэтому делает попытку неявно принудительно привести его к Unicode.
(В любом случае имя файлав Content-Disposition
определенно не должен содержать полный путь, как в приведенном выше коде. Я бы предложил что-то вроде filename= os.path.basename(filename).encode('us-ascii', 'ignore')
в строке перед вышеупомянутым в качестве первого быстрого исправления. Я не уверен, что Twitter даже заботится о том, чтоимя файла, хотя ...)