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

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

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


Следующая часть >>>

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

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

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

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

  4. После написания текста у пользователя спрашивается, хочет ли он оставить отзыв анонимно или нет.

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

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

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

Для получения токена, зайдем в 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.

Комментарии (5)


  1. Nik2008
    17.11.2023 05:39
    +1

    Интересно было бы почитать развернутую статью о построении логики бота с точки зрения его функционала и полезности бизнесу к примеру)!

    Какие функции может на себя взять и тд? А то, что мы обычно видим в реализации всевозможных помощников, на всяких ресурсах, кроме раздражения и отъёма времени клиента(пользователя) никаких других функций не несет!


    1. Infinitive1 Автор
      17.11.2023 05:39

      Спасибо за идею, обязательно напишу статью с идеями проектов по разным тематикам. Я тоже считаю, что это было бы очень полезно


  1. Seruios
    17.11.2023 05:39
    +1

    Хорош


  1. Z55
    17.11.2023 05:39

    Почему выбор пал на telebot? Почему не популярный aiogram?


    1. Infinitive1 Автор
      17.11.2023 05:39

      Обычно на aiogram пишут более серьёзные и нагруженные решения. Новички же обычно учатся на более простых библиотеках, и уже потом идут дальше (имея какую-то базу). В aiogram, для примера, используется асинхронность, которую не все могут постичь на начальных этапах обучения