Через бота телеграмм не могу получить фотографию PyTelegramBotAPI
Недавно начал писать код на пайтон с библиотекой PyTelegramBotAPI. Хочу получать любую фотографию, которую получает бот от других пользователей. Но в ответ я получаю только описание фотографии в таком виде:
{
'file_size': 19717,
'height': 320,
'width': 306,
'file_id': 'AgACAgIAAxkBAAIOr161x6GzsKbPoQd-mA4EY1jBXs0IAALLrzEbsfioSYNpKw51mD3XJxd0kS4AAwEAAwIAA20AAyX_AgABGQQ'
}
Я бы хотел получить полноценную фотографию что бы получить с него информацию.
Вот и собственно сам код:
@bot.message_handler(content_types=["photo"])
def send_help_text(message):
bot.send_message(message.chat.id, 'Хорошо, мы обработаем фотографию и обязательно отвечу!')
msg = bot.send_message(config, 'Подтвердите заявку')
bot.send_message(config, message.photo)
Ответы (3 шт):
Вы можете пересылать сообщение отправленное пользователем боту себе. в пересланном сообщении будет как само фото так и указание от кого оно получено ботом
@bot.message_handler(content_types=["photo"])
def send_help_text(message):
bot.send_message(message.chat.id, 'Хорошо')
bot.forward_message(config, message.chat.id, message.message_id)
Можно получить фотографию следующим образом
# Получаем id фотографии в Telegram
photo_id = message.photo[-1].file_id
# Достаём картинку
photo_file = bot.get_file(photo_id) # <class 'telebot.types.File'>
photo_bytes = bot.download_file(photo_file.file_path) # <class 'bytes'>
# Отправить в дальнейшем можно таким образом
bot.send_photo(message.chat.id, photo=photo_bytes)
В дальнейшем байты фотографии можно превратить в PIL.Image объект для удобства обработки ( если таковая требуется ):
from io import BytesIO
from PIL import Image
...
def get_image_from_bytes(b):
'''
Gets the PIL.Image object from the bytes of photo
:param b: Bytes of the photo
:type b: bytes
'''
stream = BytesIO(b)
image = Image.open(stream).convert("RGBA")
stream.close()
return image
@tb.message_handler(content_types=['photo'])
def handler_file(message):
import pathlib
from pathlib import Path
Path(f'files/{message.chat.id}/').mkdir(parents=True, exist_ok=True)
if message.content_type == 'photo':
file_info = tb.get_file(message.photo[len(message.photo) - 1].file_id)
downloaded_file = tb.download_file(file_info.file_path)
src = f'files/{message.chat.id}/' + file_info.file_path.replace('photos/', '')
with open(src, 'wb') as new_file:
new_file.write(downloaded_file)
Закачивает фотографию на Ваш пк, отправленную пользователем боту
Если хотите сразу потом ее переслать тому же пользователю, то добавьте еще 3 строчки
tb.send_photo(message.chat.id, open(src, 'rb'))
file = pathlib.Path(f'{src}')
file.unlink()