Как мне загрузить изображение BytesIO в Telegram через телепорт Bot.sendPhoto(uid, фото)?

Итак, я хочу иметь возможность загружать фотографию, которую я создал с помощью класса qrcode, в Telegram через телепот. Это код, который я изначально пробовал!

img = qrcode.make(totp.provisioning_uri(settings.OTPNAME)) # This creates the raw image (of the qr code)
output = BytesIO() # This is a "file" written into memory
img.save(output, format="PNG") # This is saving the raw image (of the qr code) into the "file" in memory
bot.sendPhoto(uid, output) # This is sending the image file (in memory) to telegram!

Если бы я собирался принять решение сохранить фотографию на жесткий диск, а затем загрузить ее, я мог бы загрузить ее с помощью этого кода!

imgTwo = open("image.png", 'rb') # So this works when combined with bot.sendPhoto(uid, imgTwo) # 'rb' means read + binary
bot.sendPhoto(uid, imgTwo)

Я попытался обернуть изображение BytesIO в BufferedReader и даже дать ему поддельное имя.

#output2 = BufferedReader(output)
#output.name = "fake.png"
#bot.sendPhoto(uid, ("fake.png", output))

Я провел последние несколько дней, пытаясь понять, почему я не могу загрузить фотографию из памяти. Я просмотрел различные решения, такие как поддельное имя решение!

Telegram продолжает выдавать ошибку: файл не должен быть пустым. Сохранение на жестком диске показывает, что он не пустой, а сканирование qr-кода с помощью моего приложения для аутентификации показывает, что qr-код не поврежден! Спасибо!

telepot.exception.TelegramError: ('Bad Request: file must be non-empty', 400, {'error_code': 400, 'ok': False, 'description': 'Bad Request: file must be non-empty'})

person Alexis Evelyn    schedule 16.05.2017    source источник


Ответы (1)


Вы должны вернуть указатель потока на ноль перед отправкой:

img.save(output, format='PNG')
output.seek(0)     # IMPORTANT!!!!!!!!!!!
bot.sendPhoto(uid, ('z.png', output))

Каждый раз, когда вы хотите перечитать поток байтов, не забудьте указать его на начало.

person Nick Lee    schedule 17.05.2017
comment
Спасибо @Ник Ли! Оглядываясь назад, это кажется очевидным, но я не мог понять это, пока вы не указали на это. Я ценю вашу помощь! - person Alexis Evelyn; 17.05.2017