Для начала небольшой дисклеймер.
Эта статья вдохновлена моим обучением. Когда несколько лет назад я решил ознакомиться с созданием телеграм ботов, то обнаружил практически полное отсутствие информации (на русском языке, с примерами). Было пару статей на Хабре, но они были довольно короткие, с не информативными примерами, и грязным кодом (глобальные переменные, нейминг и пару других вещей). Из-за этого, изучение такой простой и понятной темы сильно затянулось на несколько долгих дней.
Сейчас я хочу облегчить жизнь новичкам, которые, как и когда то я захотели освоить написание ТГ ботов. Эта статья направлена именно на новичков, в ней я постараюсь объяснить тему на примере сбора обратной связи. Это будет цикл из нескольких статей (сейчас планируется около 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.