Интеграция Telegram ботов в Django приложениях

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

На эту тему создания ботов полноценных гайдов и материала не так много. Причина в том, что для опытного разработчика создание бота это нечто простое и само собой разумеющееся. А зря, ведь для начинающих любой пример может оказаться полезным потому что при создании первых проектов обычно в голове нет каких-либо четких инструкции и точных файловых структур.

Этой статьей я хотел сделать более доступной информацию которая явно бы пригодилась мне в далеком прошлом. Ну а для бывалых коллег это будет просто одна из реализаций на заметку. Статья не перевернет вас с ног наголову или что-то в этом роде. Я просто хочу чтобы после прочтения вы сказали "О, а можно ведь и так сделать".

Сегодня речь пойдет о соединения вашего серверного приложения на Django с Telegram ботом реализованным библиотекой pyTelegramBotApi на языке Python поэтому если вы уже знакомы с созданием ботов и знаете фреймворк то смело пропускайте начало.


Введем вас в курс дела

Эта статья больше ориентирована на новичков нежели на опытных разработчиков, поэтому небольшой экскурс и пара моментов после прочтения которого вы точно поймете дальнейшее содержание статьи.

  • pyTelegramBotApi - это лишь обертка вокруг Telegram API на языке Python, поэтому если перед вами стоит задача написать бота с использованием любой другой библиотеки, то вообще не беспокойтесь. Они все одинаковые... В прямом смысле, ведь их функционал не может выйти за рамки Telegram API.

  • API - это программный интерфейс предоставляющий доступ к данным или функционалу (вдруг кто не знает). В нашем случае это будут HTTP запросы в библиотеках Telegram ботов.

  • Python - язык программирования на котором написан Django.

  • Название нашей библиотеки может быть и pyTelegramBotApi, но в коде импортируется как import telebot. Не путайте ее с другой аналогичной библиотекой telebot которая тоже не плохая, но просто в этой статье речь пойдет не о ней.

Файловая структура проектов Django

Стандартная структура проекта Django в проводнике Visual Studio Code
Стандартная структура проекта Django в проводнике Visual Studio Code

В папке 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 уже так много уже написанного функционала что иногда, если уместно, можно воспользоваться и таким подходом.

А теперь хотелось бы поблагодарить вас за прочтение этой статьи. Я надеюсь, что она добавит вам еще одну карту в колоду решений.

Это моя первая статья поэтому если есть какие-либо пожелания или вопросы, то оставляйте их в комментариях. На вопросы постараюсь ответить, а предложения рассмотреть в следующих статьях.

Источник: https://habr.com/ru/articles/759784/


Интересные статьи

Интересные статьи

Итак, в предыдущих статьях (Введение, Командуем, Дратути) мы уже разобрали многие аспекты написания бота: как начать писать бота, как делать плагины-расширения и как работать с непосредственно пользов...
"Тачка на прокачку" уже давно не выходит. А вот "Django на прокачку" снова продолжает вас радовать. В сегодняшнем эпизоде мы:1.       Узнаем, что такое препроцессоры и че...
В предыдущей части были описаны подходы, примененные при написании парсера для схемы MTProto. Статья получилась чуть более общей, чем я рассчитывал, на этот раз я постараюсь рассказать бо...
Если вы не используете все возможности Django, то, очень вероятно, вы не пользуетесь SITE_ID. Этому способствуют как убогая официальная документация Sites framework, так и несогласова...
Есть такой продвинутый инструмент Scrutinizer CI.Для OpenSource он абсолютно бесплатный и платный для приватных репозиториев.Вы о нем слышали, наверное, а если нет, то ли...