На эту тему создания ботов полноценных гайдов и материала не так много. Причина в том, что для опытного разработчика создание бота это нечто простое и само собой разумеющееся. А зря, ведь для начинающих любой пример может оказаться полезным потому что при создании первых проектов обычно в голове нет каких-либо четких инструкции и точных файловых структур.
Этой статьей я хотел сделать более доступной информацию которая явно бы пригодилась мне в далеком прошлом. Ну а для бывалых коллег это будет просто одна из реализаций на заметку. Статья не перевернет вас с ног наголову или что-то в этом роде. Я просто хочу чтобы после прочтения вы сказали "О, а можно ведь и так сделать".
Сегодня речь пойдет о соединения вашего серверного приложения на Django с Telegram ботом реализованным библиотекой pyTelegramBotApi на языке Python поэтому если вы уже знакомы с созданием ботов и знаете фреймворк то смело пропускайте начало.
Введем вас в курс дела
Эта статья больше ориентирована на новичков нежели на опытных разработчиков, поэтому небольшой экскурс и пара моментов после прочтения которого вы точно поймете дальнейшее содержание статьи.
pyTelegramBotApi - это лишь обертка вокруг Telegram API на языке Python, поэтому если перед вами стоит задача написать бота с использованием любой другой библиотеки, то вообще не беспокойтесь. Они все одинаковые... В прямом смысле, ведь их функционал не может выйти за рамки Telegram API.
API - это программный интерфейс предоставляющий доступ к данным или функционалу (вдруг кто не знает). В нашем случае это будут HTTP запросы в библиотеках Telegram ботов.
Python - язык программирования на котором написан Django.
Название нашей библиотеки может быть и pyTelegramBotApi, но в коде импортируется как
import telebot
. Не путайте ее с другой аналогичной библиотекой telebot которая тоже не плохая, но просто в этой статье речь пойдет не о ней.
Файловая структура проектов Django

В папке project, обычно одноименной с названием проекта, хранятся настройки и пути на уровне всего проекта. В приложениях, то-есть в папке application, прописываются модели, представления, маршруты, тесты, настройки административного сайта и вся остальная логика приложения. Этот список дополняется и изменяется в зависимости от предназначения приложения, формата получаемых и возвращаемых данных.
Структура ботов
Здесь уже нет какой-то конкретной структуры, а просто следуют общим методологиям, архитектурам и шаблонам проектирования. Функционал ботов составляют обработчики событий, команд, сообщений и типов контента. Сам код запускает внутренний сервер который принимает запросы, и взаимодействуют с сервером с помощью специального API токена и запросов.
А теперь когда всем всё ясно можно начинать!
Использование BaseCommand в Django
В данной статье мы рассмотрим взаимодействие с телеграмм ботов в проекте через команды в Django. Да, это значит что данный подход можно использовать и в других фреймворках написанных на других языках программирования аналогичным способом. Например через scripts в фреймворках на Node Js в файле package.json.
А вот как в Django приложения встраивают команды:

В папке приложения необходимо создать модуль под названием management, то-есть создать папку и в ней создать файл __init__.py. Внутри папки management нужно таким же образом создать модуль commands и уже внутри commands создать файл для будущей команды. Команду вы будете вызывать передавая название файла в файл точки входа в приложение поэтому название файла должно описывать действие команды.
Пример использования команды: python manage.py bot
В файле команды, в нашем случае я назвал его это - bot.py, нужно создать класс который наследует от BaseCommand и обязательно классу дать название Command как показано ниже:
from django.core.management.base import BaseCommand
from django.conf import settings
from telebot import TeleBot
# Объявление переменной бота
bot = TeleBot(settings.TELEGRAM_BOT_API_KEY, threaded=False)
# Название класса обязательно - "Command"
class Command(BaseCommand):
# Используется как описание команды обычно
help = 'Just a command for launching a Telegram bot.'
def handle(self, *args, **kwargs):
bot.enable_save_next_step_handlers(delay=2) # Сохранение обработчиков
bot.load_next_step_handlers() # Загрузка обработчиков
bot.infinity_polling() # Бесконечный цикл бота
К слову не забываем что токен от бота это секретная информация, и ее стоит хранить в специальных файлах конфигурации вроде .env или settings.ini которые как правило скрыты от систем контроля версий. Объявить переменную можно в файле конфигурации проекта - settings.py, а чтобы достать токен можно воспользоваться импортом django.conf.settings. Дальше вы можете творить что угодно на свое усмотрение.
Что просто замечательно в таком подходе так это то, что вам не нужно подключаться к базе данных из вне или как-либо усложнять себе жизнь для соединения базы данных бота и вашего серверного приложения. Все данные вам будут доступны через импортирование моделей самого Django.
Конечно в данном подходе есть и свои минусы ведь всегда надежнее построить микросервисную архитектуру, хранить данные и давать к ним доступ через запросы REST API на том же Flask или FastAPI. Однако, в кодовой базе таких фреймворков как Django уже так много уже написанного функционала что иногда, если уместно, можно воспользоваться и таким подходом.
А теперь хотелось бы поблагодарить вас за прочтение этой статьи. Я надеюсь, что она добавит вам еще одну карту в колоду решений.
Это моя первая статья поэтому если есть какие-либо пожелания или вопросы, то оставляйте их в комментариях. На вопросы постараюсь ответить, а предложения рассмотреть в следующих статьях.