/
pa1ch
/
FitAssistant
Обзор
Документация
Войти
/
pa1ch
/
FitAssistant
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/bot/utils.py
51 строка
2 KB
Pavel Chugaev
refactor(bot): свести бота к голосовому вводу и доставке (web-first)
19 июн 2026, 08:35
19 июн 2026, 08:35
a4ce963
Код
Авторство
О чём код?
"""Small shared helpers for bot handlers.""" from urllib.parse import urlparse from aiogram.client.session.aiohttp import AiohttpSession from aiogram.types import CallbackQuery, Message from app.config import settings def build_bot_session() -> AiohttpSession | None: """Telegram-сессия через ``settings.proxy_url`` либо ``None`` (прямое соединение). aiogram сам по себе умеет только HTTP-прокси, а у нас SOCKS5. Поэтому подменяем коннектор сессии на ``aiohttp_socks.ProxyConnector``. ``None`` возвращается, когда прокси не задан, — тогда ``Bot(...)`` создаёт свою обычную сессию без прокси (как локально в разработке). Замечание по поддержке: aiogram не даёт публичного способа задать свой коннектор, поэтому используем внутренние поля ``_connector_type`` и ``_connector_init`` AiohttpSession. При обновлении aiogram это место стоит перепроверить. """ if not settings.proxy_url.strip(): return None from aiohttp_socks import ProxyConnector, ProxyType parsed = urlparse(settings.proxy_url) session = AiohttpSession() session._connector_type = ProxyConnector session._connector_init = { **session._connector_init, # сохраняем ssl-контекст, limit, ttl_dns_cache "proxy_type": ProxyType.SOCKS5, "host": parsed.hostname, "port": parsed.port, "username": parsed.username, "password": parsed.password, "rdns": True, # разрешать имена на стороне прокси (а не в заблокированной сети) } return session def callback_message(callback: CallbackQuery) -> Message | None: """Return the callback's message if it's an editable ``Message``, else ``None``. aiogram types ``callback.message`` as ``Message | InaccessibleMessage | None``; only a real ``Message`` supports ``edit_text``/``answer_photo``/etc. Handlers use this to narrow the type and bail out early on inaccessible messages. """ return callback.message if isinstance(callback.message, Message) else None