Как сохранить фото, которое отправил пользователь в боте(Telebot)
Не могу понять как сохранить фото, которое отправил пользователь в боте. Помогите, пожалуйста
Не могу понять как сохранить фото, которое отправил пользователь в боте. Помогите, пожалуйста
Есть два подхода которые можно применить к данной задаче.
Первый - сохранение объекта photo
из message
В хандлере мы должны указать на принадлежность content_type
к 'photo'
, а далее, используя следующий код, сохранять фотографию:
import telebot
TOKEN = 'ваш токен'
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(content_types=['photo'])
def handle_photo(message):
photo = message.photo[-1]
file_info = bot.get_file(photo.file_id)
downloaded_file = bot.download_file(file_info.file_path)
save_path = 'photo.jpg'
with open(save_path, 'wb') as new_file:
new_file.write(downloaded_file)
bot.reply_to(message, 'Фотография сохранена.')
bot.polling()
При данном подходе фотография будет сохранена как photo.jpg
, при этом, если исходное изображение, скажем, было 1920x1080
, то выходное будет вдвое меньше, из-за алгоритмов сжатия изображения, по сути мы скачиваем уже сжатое изображение, отправленное через быструю отправку
.
Второй - сохранение файла
Мы можем реализовать такой метод, который будет сохранять непосредственно изображение отправленное как файл-документ, помимо этого можно сохранить таким же образом видео, аудио, голосовое сообщение, а так же стикер. Прикладываю вам собственный код для этого:
import telebot
TOKEN = 'ваш токен'
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(content_types=['document', 'video', 'audio', 'voice', 'sticker'])
def handle_file(message):
file_info = bot.get_file(message.document.file_id)
downloaded_file = bot.download_file(file_info.file_path)
save_path = 'file' + message.document.file_name # сохраняем файл с его исходным именем
with open(save_path, 'wb') as new_file:
new_file.write(downloaded_file)
bot.reply_to(message, 'Файл сохранен.')
bot.polling()
В результате отправки файла данному боту через телеграмм, он сохранит его с исходным именем без сжатия.