86 lines
2.3 KiB
Python
86 lines
2.3 KiB
Python
|
|
# 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()
|