Для начала небольшой дисклеймер.
Эта статья вдохновлена моим обучением. Когда несколько лет назад я решил ознакомиться с созданием телеграм ботов, то обнаружил практически полное отсутствие информации (на русском языке, с примерами). Было пару статей на Хабре, но они были довольно короткие, с не информативными примерами, и грязным кодом (глобальные переменные, нейминг и пару других вещей). Из-за этого, изучение такой простой и понятной темы сильно затянулось на несколько долгих дней.
Сейчас я хочу облегчить жизнь новичкам, которые, как и когда то я захотели освоить написание ТГ ботов. Эта статья направлена именно на новичков, в ней я постараюсь объяснить тему на примере сбора обратной связи. Это будет цикл из нескольких статей (сейчас планируется около 5). В этом цикле я намерено буду упрощать некоторые моменты, для лучшего понимания материала.
Итак, начнем мы нашу разработку с небольшого ТЗ, в котором я перечислю основные требования к боту.
Бот должен поприветствовать пользователя и попросить указать товар/услугу.
Указанный пользователем товар/услуга сохраняется.
Бот просит написать текст отзыва.
После написания текста у пользователя спрашивается, хочет ли он оставить отзыв анонимно или нет.
Написанный отзыв отправляется в ЛС администраторам бота, если отзыв не анонимный, то будет указана ссылка на телеграм аккаунт клиента.
Такого бота мы и будем разрабатывать.
Начнем с получения токена. Кто не знает, токен нужен для идентификации нашего бота телеграмом. Проще говоря, это аналог авторизации, только не для пользователя, а для бота.
Для получения токена, зайдем в BotFather и нажмем кнопку Запустить или Начать.
Далее нажмем на /newbot
После этого укажем имя бота, как его будут звать (будет выводится при переписке), может быть любым.
Далее укажем username (аналог логина на сайтах). Будет использовать для указания ссылок (и не только). Должно быть уникальным и Обязательно оканчиваться словом Bot/bot/_bot
Отлично! Шаг первый пройден, с токеном разобрались. Теперь открываем нашу IDE, я буду использовать PyCharm.
Создаем проект и устанавливаем библиотеку PyTelegramBotAPI.
pip3 install PyTelegramBotAPI
Далее нужно сохранить ваш токен. Есть несколько способов это сделать, самый лучший - переменные окружения. Но в самом начале, я указал что намерено не буду использовать сложные для новичков конструкции. Так что воспользуемся другим способом, а именно: создадим новый файл, назовем его config.py и запишем туда токен как константу (Константа - не изменяемая переменная. В Python нет полноценных констант, так что мы воспользуемся официальной заменой, а именно напишем переменную TOKEN большими буквами)
Наш бот будет построен на функциях, у многих из которых будут декораторы. Если вы не знаете эти темы, советую ознакомиться, иначе вы многое не поймёте.
Перейдём к написанию самого бота. Откроем файл main.py и создадим объект bot, с которым мы и будем в дальнейшем работать. Также сразу запустим бота.
import telebot
from config import TOKEN
bot = telebot.TeleBot(TOKEN)
if __name__ == '__main__':
print('Бот запущен!')
bot.infinity_polling()
Тут используется конструкция __name__ == '__main__', ознакомьтесь, если не знаете зачем она.
Разберём код. В первой строчке мы импортировали библиотеку telebot, с которой мы и будем работать. Вас может удивить название библиотеки, ведь скачивали PyTelegramBotAPI, а импортируем telebot. Это нормально, telebot - это название модуля, который мы импортируем из библиотеки PyTelegramBotAPI. Этот модуль содержит основные классы и функции для работы с ботами в Telegram.
Во второй строке мы импортировали токен, полученный ранее. В 4 получили объект класса TeleBot, с переменной bot мы будем далее часто работать (например, именно с её помощью мы будем отправлять сообщения).
Далее мы запускаем нашего бота.
Теперь добавим нашему боту немного функциональности. Пусть при отправке команды /start, наш бот будет приветствовать пользователя.
Для этого создадим функцию welcome
и обрамим её декоратором @bot.message_handler
import telebot
from config import TOKEN
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(commands=['start'])
def welcome(message):
chat_id = message.chat.id
bot.send_message(chat_id,
'Привет! Добро пожаловать в бота сбора обратной связи!')
if __name__ == '__main__':
print('Бот запущен!')
bot.infinity_polling()
Разберём код. Первую и последнюю часть мы уже рассматривали, нас интересует только функция.
Используется декоратор message_handler
, он позволяет сообщить телеграму какую команду мы отслеживаем (сама команда передаётся в списке commands
). Очень удобно, что функция welcome будет вызываться только тогда, когда пользователь напишет /start, при других сообщениях функция не будет вызвана.
Далее мы получаем id чата, из которого нам пришло сообщение, и сохраняем этот id в переменную chat_id. Следом отправляем сообщение, с помощью функции bot.send_message, функция принимает в качестве первого параметра id чата, а вторым само сообщение.
Ну вот и всё, первая статья цикла «PyTelegramBotAPI на примере проекта сбора обратной связи» готова. Следующая часть будет через 3 дня.
Надеюсь вам было всё понятно и интересно, в случае если вам что-то не понятно, вы хотите дополнить или поправить меня - прошу в комментарии, постараюсь прочитать и учесть каждый.
Исходный код текущего бота выложен в репозитории на GitHub.
Комментарии (5)
Z55
17.11.2023 05:39Почему выбор пал на telebot? Почему не популярный aiogram?
Infinitive1 Автор
17.11.2023 05:39Обычно на aiogram пишут более серьёзные и нагруженные решения. Новички же обычно учатся на более простых библиотеках, и уже потом идут дальше (имея какую-то базу). В aiogram, для примера, используется асинхронность, которую не все могут постичь на начальных этапах обучения
Nik2008
Интересно было бы почитать развернутую статью о построении логики бота с точки зрения его функционала и полезности бизнесу к примеру)!
Какие функции может на себя взять и тд? А то, что мы обычно видим в реализации всевозможных помощников, на всяких ресурсах, кроме раздражения и отъёма времени клиента(пользователя) никаких других функций не несет!
Infinitive1 Автор
Спасибо за идею, обязательно напишу статью с идеями проектов по разным тематикам. Я тоже считаю, что это было бы очень полезно