Как создать телеграмм бота? (часть 2)
Берлога Программистов👨💻Продолжим создавать нашего первого телеграмм бота на Python и добавим ему новых функций.
В прошлой части мы создали первого бота и научили его отправлять сообщение при команде /start
Сегодня мы добавим фунционала, научим его отвечать на голосовые сообщения, фотографии и поработаем с этими типами. Вот такой в конце получим результат:

Ну что, приступим!
Шаг 1: Обрабатываем голосовое сообщение
Мы уже умеем обрабатывать команду /start, для отслеживания голосового сообщения мы будем использовать похожий принцип. Пишем такой код:
@bot.message_handler(content_types=['voice'])
В content_types мы передаем тип 'voice', что означает голосове сообщение. Подробнее про типы можете прочитать в документации, а мы переходим к написанию функции.
def send_audio_duration(message):
voice_duration = "Аудио длится: " + str(message.voice.duration) + " сек."
bot.reply_to(message, voice_duration)
Разберем каждую строчку.
- Определяем функцию и называем ее как хотим, в это случае send_audio_duration
- Записвыаем длину сообщения, к строке "Аудио длится: " мы добавляем длину аудио и тут чуть чуть по подробнее. Сначало мы обращаемся к отправленному сообщению message, после в документации видим, что у message есть атрибут voice, а у самого voice есть атрибут duration, которое возвращает продолжительность голосового сообщения в секундах
- в последней строчке используем метод reply_to, который очень похож на ранее изученный send_message, но вместо простой отправки, отвечает на полученное сообщение.
Вот что получилось в итоге:
@bot.message_handler(content_types=['voice'])
def send_audio_duration(message):
voice_duration = "Аудио длится: " + str(message.voice.duration) + " сек."
bot.reply_to(message, voice_duration)
Шаг 2: Обрабатываем полученное фото
Начинаем так же как и в шаге №1, но вместо типа 'voice' передаем 'photo'.
@bot.message_handler(content_types=['photo'])
После приступаем к написанию функции, сначала просто определяем ее.
def send_photo(message):
Теперь нам нужно получить само фото, для этого обратимся к нему через атрибут photo, но в документации мы уже увидели, что атрибут photo возвращает список версий фотографии (разных размеров), [-1] используется для выбора самой большой (наиболее высокого разрешения) версии.
photo = message.photo[-1]
В следующих строках нужно будет загрузить само изображение, что бы в будущем его отправить:
file_info = bot.get_file(photo.file_id) downloaded_file = bot.download_file(file_info.file_path)
В первой строке получается дополнительная информация о фотографии с использованием ее file_id.
Во второй эта строка загружает сам файл фотографии, используя путь к файлу, полученный ранее. Полученный файл представляется в виде байтового объекта.
Как все загружено мы уже просто отправляем фото и текст:
bot.reply_to(message, "Вы прислали фото:") bot.send_photo(message.chat.id, downloaded_file)
Первая строчка нам уже знакома, а во втрой все тоже самое что и в send_message, но вместо текста изображение
Шаг 3: Тестируем

Как видите все прекрасно получилось и мы уже имеем бота с хорошим функционалом.
Подписывайтесь на телеграмм канал Берлога Программистов👨💻, что бы не пропустить следующие части!
Полный код:
import telebot
token = 'ваш токен'
bot = telebot.TeleBot(token)
@bot.message_handler(commands=['start'])
def say_hi(message):
text = 'Привет, Мир!'
bot.send_message(message.chat.id, text)
@bot.message_handler(content_types=['voice'])
def send_audio_duration(message):
voice_duration = "Аудио длится: " + str(message.voice.duration) + " сек."
bot.reply_to(message, voice_duration)
@bot.message_handler(content_types=['photo'])
def send_photo(message):
photo = message.photo[-1]
file_info = bot.get_file(photo.file_id)
downloaded_file = bot.download_file(file_info.file_path)
bot.reply_to(message, "Вы прислали фото:")
bot.send_photo(message.chat.id, downloaded_file)
bot.polling()
