diff --git a/.env.example b/.env.example index 0de7d631..ba40a7cd 100644 --- a/.env.example +++ b/.env.example @@ -13,11 +13,15 @@ SUPPORT_USERNAME=@support # Имя пользователя бота (опционально, автоопределяется) # BOT_USERNAME= -# ===== SOCKS5 ПРОКСИ ===== +# ===== СЕТЬ И ПРОКСИ ===== # URL SOCKS5 прокси-сервера для маршрутизации трафика бота к Telegram API # Формат: socks5://user:password@host:port или socks5://host:port # PROXY_URL=socks5://127.0.0.1:1080 +# Альтернативный URL сервера Telegram Bot API (для регионов где api.telegram.org заблокирован) +# Примеры: Cloudflare Worker, self-hosted telegram-bot-api (tdlib), любой совместимый прокси +# TELEGRAM_API_URL=https://your-telegram-proxy.workers.dev + # ===== СИСТЕМА ПОДДЕРЖКИ ===== # Включить меню поддержки в интерфейсе SUPPORT_MENU_ENABLED=true diff --git a/app/bot_factory.py b/app/bot_factory.py index 89e6b5f6..08313ac1 100644 --- a/app/bot_factory.py +++ b/app/bot_factory.py @@ -1,4 +1,4 @@ -"""Factory for creating Bot instances with proxy support.""" +"""Factory for creating Bot instances with proxy and custom API server support.""" from aiogram import Bot from aiogram.client.default import DefaultBotProperties @@ -8,13 +8,21 @@ from app.config import settings def create_bot(token: str | None = None, **kwargs) -> Bot: - """Create a Bot instance with SOCKS5 proxy session if PROXY_URL is configured.""" + """Create a Bot instance with SOCKS5 proxy and/or custom Telegram API server.""" proxy_url = settings.get_proxy_url() + telegram_api_url = settings.get_telegram_api_url() session = None - if proxy_url: + if proxy_url or telegram_api_url: from aiogram.client.session.aiohttp import AiohttpSession + from aiogram.client.telegram import TelegramAPIServer - session = AiohttpSession(proxy=proxy_url) + session_kwargs: dict = {} + if proxy_url: + session_kwargs['proxy'] = proxy_url + if telegram_api_url: + session_kwargs['api'] = TelegramAPIServer.from_base(telegram_api_url) + + session = AiohttpSession(**session_kwargs) kwargs.setdefault('default', DefaultBotProperties(parse_mode=ParseMode.HTML)) return Bot(token=token or settings.BOT_TOKEN, session=session, **kwargs) diff --git a/app/config.py b/app/config.py index 7533222d..9f47272e 100644 --- a/app/config.py +++ b/app/config.py @@ -825,6 +825,10 @@ class Settings(BaseSettings): # Format: socks5://user:password@host:port or socks5://host:port PROXY_URL: str | None = None + # Custom Telegram Bot API server URL (for regions where api.telegram.org is blocked) + # Examples: Cloudflare Worker proxy, self-hosted telegram-bot-api (tdlib), nginx reverse proxy + TELEGRAM_API_URL: str | None = None + @field_validator('PROXY_URL', 'NALOGO_PROXY_URL', mode='before') @classmethod def validate_proxy_url(cls, value: str | None) -> str | None: @@ -972,6 +976,10 @@ class Settings(BaseSettings): """Return SOCKS5 proxy URL or None.""" return self.PROXY_URL if self.PROXY_URL else None + def get_telegram_api_url(self) -> str | None: + """Return custom Telegram Bot API server URL or None.""" + return self.TELEGRAM_API_URL if self.TELEGRAM_API_URL else None + def get_nalogo_proxy_url(self) -> str | None: """Return SOCKS proxy URL for nalogo or None.