Files
LawBot/bot/create_bot.py
T

86 lines
2.3 KiB
Python
Raw Normal View History

2026-05-25 01:12:43 +03:00
# aiogram
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.enums import ParseMode
from aiogram.fsm.storage.redis import RedisStorage, DefaultKeyBuilder, StorageKey
from aiogram.types import BotCommand
# cfg
from decouple import config
# db
from shared import ORM
# another
import logging, pytz
from urllib.parse import quote
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
TELEGRAM_API_TIMEOUT = 120.0
def build_telegram_proxy_url(proxy_value: str | None) -> str | None:
if proxy_value is None:
return None
proxy_value = proxy_value.strip()
if not proxy_value:
return None
parts = proxy_value.split(":")
if len(parts) < 3:
raise ValueError(
"TELEGRAM_BOT_PROXY must be in format protocol(http/socks5):ip:port:user:pass"
)
protocol, host, port, *auth_parts = parts
if not protocol or not host or not port:
raise ValueError(
"TELEGRAM_BOT_PROXY must be in format protocol(http/socks5):ip:port:user:pass"
)
username = auth_parts[0] if len(auth_parts) > 0 else ""
password = ":".join(auth_parts[1:]) if len(auth_parts) > 1 else ""
if username or password:
auth = f"{quote(username, safe='')}:{quote(password, safe='')}@"
else:
auth = ""
return f"{protocol}://{auth}{host}:{port}"
telegram_proxy_url = build_telegram_proxy_url(
config("TELEGRAM_BOT_PROXY", default="")
)
bot_session = (
AiohttpSession(proxy=telegram_proxy_url, timeout=TELEGRAM_API_TIMEOUT)
if telegram_proxy_url
else AiohttpSession(timeout=TELEGRAM_API_TIMEOUT)
)
if telegram_proxy_url:
logger.info(
"Telegram Bot API proxy enabled for host %s",
telegram_proxy_url.rsplit("@", 1)[-1],
)
redis_url = config("REDIS_URL")
bot = Bot(
token=config("TOKEN"),
default=DefaultBotProperties(parse_mode=ParseMode.HTML),
session=bot_session,
)
storage = RedisStorage.from_url(redis_url)
storage.key_builder = DefaultKeyBuilder(with_bot_id=True)
dp = Dispatcher(storage=storage)
start_command = [BotCommand(command="/start", description="🔄 Перезапустить бота")]
tz = pytz.timezone(config("TIMEZONE"))
orm = ORM()