Задача: работает малозагруженный бот и нужно придумать как его использовать в других скриптах.
По сути эта статья для себя - помнить про плюсы свойств объектов.
Прочитал много статей на эту тему, пытался нагуглить, но большинство ответов, если не все, сводились к использованию вебхуков (Webhook). Коротко - у нас есть свой сервер, мы на нём размещаем бота, значит есть ip, и отправляем сообщение в очередь, а наш бот оттуда берет эти сообщения(смотря как настроить) и отправляет "по адресу". Решение отличное, работает как нужно, но неэффективное в моём случае и требует много затрат(условно, смотря с чем сравнить). Были и другие варианты - создать ботов для каждого проекта - генерим десятки(в зависимости от доступных токенов ботов) малозагруженных ботов. Сомнительно. Что у меня есть:
- бот запущен локально на моём пк и хорошо если его загрузка составляет 0.001%;
- несколько прочих скриптов, в которых хорошо бы отправлять уведомления в tg при некоторых довольно редких ситуациях;
- возможна отправка сообщение другим пользователем для автоматизации формирования отчетов(но не обязательна).
Отсюда очевидно, что вебхуки не "путь джедая", множить ботов бессмысленно. В итоге решается очень просто - созданием класса-хранилища. Есть и свои минусы, поэтому я приведу реализацию для библиотеки pytelegrambotapi.
class BotInstance:
bot = telebot.TeleBot(token)
bot = BotInstance.bot
Реализация основана на принципах ООП, и мы с вами понимаем чем свойства объекта отличаются от атрибутов. Определения могут быть разные, поэтому так же подойдут атрибуты классов и атрибуты экземпляров. То есть свойства или атрибуты экземпляров мы определяем внутри класса, и они будут общими для всех экземпляров этого класса, в отличие от атрибутов экземпляров, которые создаются в конструкторе __init__. Отсюда вытекают плюсы и минусы.
Плюсы такого подхода:
- мы используем один экземпляр бота в разных скриптах и можем нагружать его сколько угодно;
- по необходимости можем в класс включать разные методы и при использовании наследования, это упростит нам жизнь для стандартных подходов(отправить сообщение, переслать сообщение и т.п.), чтобы каждый раз не реализовывать один и тот же метод(функцию) в зависимости от того, что мы используем.
Но и минусов хватает:
- бот должен быть запущен в основном скрипте - то есть, остальные скрипты с уведомляшками будут зависеть от, условного, главного скрипта с работающим ботом;
- так же будет и обратная зависимость - если бот упадет в каком-то скрипте с уведомляшками, то мы "похороним" и основного бота - чем вебхуки явно лучше;
- подразумевается, что скрипт с ботом находится рядом с директорией или в одной директории с другими скриптами, иначе мы рушим понятность иерархии каталогов и начинаем включать что-то типа:
project_directory = os.path.abspath(os.path.join(os.path.dirname(__file__), os.getenv("DIR_BOT")))
sys.path.append(project_directory)
То есть мы добавляем в пути, которые просматривает питон, дополнительный путь. Не есть хорошо, но в некотором случае вполне жизнеспособно.
ИТОГ:
Подобное помогло мне использовать одного бота в разных проектах. Мне приходя уведомляшки из разных скриптов, при этом команда из человек 10 спокойно пользуется ботом. Очень простая "стажерская"(можете заменить на любое понравившееся вам слово) реализация, что позволяет не множить кучу ботов, не создавать свой серв, и нагрузить больше то, что и так не особо загружено.