Для начала небольшой дисклеймер.

Эта статья вдохновлена моим обучением. Когда несколько лет назад я решил ознакомиться с созданием телеграм ботов, то обнаружил практически полное отсутствие информации (на русском языке, с примерами). Было пару статей на Хабре, но они были довольно короткие, с не информативными примерами, и грязным кодом (глобальные переменные, нейминг и пару других вещей). Из-за этого, изучение такой простой и понятной темы сильно затянулось на несколько долгих дней.

Сейчас я хочу облегчить жизнь новичкам, которые, как и когда то я захотели освоить написание ТГ ботов. Эта статья направлена именно на новичков, в ней я постараюсь объяснить тему на примере сбора обратной связи. Это будет цикл из нескольких статей (сейчас планируется около 5). В этом цикле я намерено буду упрощать некоторые моменты, для лучшего понимания материала.


Следующий урок >>>

Итак, начнем мы нашу разработку с небольшого ТЗ, в котором я перечислю основные требования к боту.

  1. Бот должен поприветствовать пользователя и попросить указать товар/услугу.

  2. Указанный пользователем товар/услуга сохраняется.

  3. Бот просит написать текст отзыва.

  4. Написанный отзыв отправляется в ЛС администраторам бота, если отзыв не анонимный, то будет указана ссылка на телеграм аккаунт клиента.

Такого бота мы и будем разрабатывать.

Начнем с получения токена. Кто не знает, токен нужен для идентификации нашего бота телеграмом. Проще говоря, это аналог авторизации, только не для пользователя, а для бота.

Для получения токена, зайдем в BotFather и нажмем кнопку Запустить или Начать.

Фото взято с интернета
Фото взято с интернета

Далее нажмем на /newbot

/newbot используется для создания нового бота
/newbot используется для создания нового бота

После этого укажем имя бота, как его будут звать (будет выводится при переписке), может быть любым.

Д��лее укажем username (аналог логина на сайтах). Будет использовать для указания ссылок (и не только). Должно быть уникальным и Обязательно оканчиваться словом Bot/bot/_bot

Находит и копируем токен
Находит и копируем токен

Отлично! Шаг первый пройден, с токеном разобрались. Теперь открываем нашу IDE, я буду использовать PyCharm.

Создаем проект и устанавливаем библиотеку PyTelegramBotAPI.

pip3 install PyTelegramBotAPI

Далее нужно сохранить ваш токен. Есть несколько способов это сделать, самый лучший - переменные окружения. Но в самом начале, я указал что намерено не буду использовать сложные для новичков конструкции. Так что воспользуемся другим способом, а именно: создадим новый файл, назовем его config.py и запишем туда токен как константу (Константа - не изменяемая переменная. В Python нет полноценных констант, так что мы воспользуемся официальной заменой, а именно напишем переменную TOKEN большими буквами)

Сохранение токена в файл config.py
Сохранение токена в файл config.py

Наш бот будет построен на функциях, у многих из которых будут декораторы. Если вы не знаете эти темы, советую ознакомиться, иначе вы многое не поймёте.

Перейдём к написанию самого бота. Откроем файл 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.