""" Глобальный экземпляр бота — доступен из любого процесса """ from aiogram import Bot from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode from aiogram.client.session.aiohttp import AiohttpSession from config import BOT_TOKEN, get_proxy_url, PROXY_TYPE, PROXY_HOST, PROXY_PORT import logging logger = logging.getLogger(__name__) # Глобальный синглтон bot: Bot | None = None def get_bot() -> Bot: """Получить экземпляр бота (создаёт если ещё не создан)""" global bot if bot is None: bot = _create_bot() return bot def _create_bot() -> Bot: """Создать бота с настройкой прокси""" proxy_url = get_proxy_url() if proxy_url: logger.info(f'🔒 Создание бота с прокси: {PROXY_TYPE}://{PROXY_HOST}:{PROXY_PORT}') aiogram_session = AiohttpSession(proxy=proxy_url) return Bot( token=BOT_TOKEN, session=aiogram_session, default=DefaultBotProperties(parse_mode=ParseMode.HTML) ) else: logger.info('🔓 Создание бота без прокси') return Bot( token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML) ) async def close_bot(): """Закрыть сессию бота""" global bot if bot and bot.session: await bot.session.close() logger.info('🔒 Сессия бота закрыта')