Этой статьей я хотел дополнить тот маленький клочок информации доступный в интернете по теме создания ботов который мне явно бы пригодился в прошлом. Сегодня речь пойдет о соединения вашего серверного приложения с Telegram ботом на примере языка Python, его фреймворка для разработки серверных приложений - Django и библиотеки для создания Telegram ботов - pyTelegramBotApi.
Введем вас в курс дела
Я хочу чтобы информация в этой статье была доступна как для продвинутых пользователей так и для новичков, поэтому небольшой экскурс после прочтения которого вы точно поймете содержание статьи.
pyTelegramBotApi - это лишь библиотека, своего рода обертка вокруг Telegram Api, поэтому если перед вами стоит задача написать бота с использованием любой другой библиотеки, то не отчаивайтесь. Они все одинаковые... В прямом смысле, ведь их функционал не может выйти за рамки Telegram Api и Telegram Bot Api. Почитайте документации библиотек и поймете что это так.
API - это программный интерфейс предоставляющий информацию с сервера через запросы.
Python - тоже является лишь языком программирования и если вам нужно написать бота на JavaScript или даже Dart, то не бойтесь ведь основные моменты как и в случае с библиотеками никак отличаться не будут.
Пусть библиотека pyTelegramBotApi и называется так, но в коде импортируется как telebot. Не путайте ее с telebot которая тоже не плохая и очень похожа на нее, но в этой статье речь пойдет не о ней.
Файловая структура проектов Django
В папке project которая создается самим фреймворком хранятся настройки и пути уровня проекта. Как вы уже могли понять проект называется project. А папка application - это уже приложение проекта в котором прописываются модели, представления, маршруты, тесты, настройки административного сайта и так далее. Этот список дополняется и изменяется в зависимости от предназначения приложения, формата получаемых и возвращаемых данных.
Структура Telegram ботов
Здесь уже нет какой-то конкретной структуры. Обычно пишут обработчики событий, команд, сообщений и типов контента. Запускают бесконечный цикл, передают туда токен и радуются жизни. Так мы и поступим)
А теперь когда всем всё ясно можно начинать!
Использование BaseCommand в Django
Чтобы использовать телеграмм бота в проекте можно запускать его через команды. Это то, что вы передаете в manage.py. Это делается вот так:
Необходимо в приложении создать папку под названием management и в ней создать файл __init__.py. Внутри management нужно создать папку commands и уже в ней вместе с __init__.py создать файл который будет называться так же как и ваша будущая команда.
В файле команды, в нашем случае это - bot.py вам нужно создать класс который наследует от BaseCommand как показано ниже:
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 = 'Implemented to Django application telegram bot setup command'
def handle(self, *args, **kwargs):
bot.enable_save_next_step_handlers(delay=2) # Сохранение обработчиков
bot.load_next_step_handlers() # Загрузка обработчиков
bot.infinity_polling() # Бесконечный цикл бота
К слову токен от бота это секретная информация и его стоит объявить в конфигурации проекта - settings.py, а указать его вообще в файле переменных сред вроде .env, settings.ini и тому подобные. Конечно же если вы собираетесь публиковать свой код где-нибудь на просторах интернета, то файлы содержащие опасную информацию лучше скрывать или добавлять в игнор лист. Как в примере с Git это будет .gitignore.
Вот и всё! Теперь вы можете запускать своего бота через команду: python manage.py bot
Что просто замечательно в таком подходе что вам не нужно подключаться к базе данных из вне или как-либо усложнять себе жизнь для соединения базы данных для бота и серверного приложения. Все данные вам будут доступны через модели самого Django.
А теперь хотелось бы поблагодарить вас за прочтение этой статьи. Я надеюсь, что она сохранит вам пару часов а-то и дней поисков и напрасных стараний. Если есть какие-либо пожелания или вопросы, то оставляйте их в комментариях. Постараюсь в следующих статьях покрыть это полностью.