Как сохранить фото, которое отправил пользователь в боте(Telebot)

Рейтинг: 2Ответов: 1Опубликовано: 13.06.2023

Не могу понять как сохранить фото, которое отправил пользователь в боте. Помогите, пожалуйста

Ответы

▲ 2

Есть два подхода которые можно применить к данной задаче.


Первый - сохранение объекта 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()

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