diff --git a/tg_mainbot.py b/tg_mainbot.py index 1a8e83c..878f833 100644 --- a/tg_mainbot.py +++ b/tg_mainbot.py @@ -14,7 +14,7 @@ import requests from io import BytesIO from flask import Flask, request from formatter import get_post_text, get_event_text -from telegram_relay import configure_telebot_api, get_relay_url +from telegram_relay import configure_telebot_api, get_relay_url, bot_api_method_url # Создаем Flask app на верхнем уровне для экспорта app = Flask(__name__) @@ -28,6 +28,8 @@ CHANNEL_ID = os.getenv('CHANNEL_ID') WEBHOOK_URL = os.getenv('WEBHOOK_URL') WEBHOOK_PORT = int(os.getenv('WEBHOOK_PORT', '8443')) WEBHOOK_SECRET = os.getenv('WEBHOOK_SECRET') +if WEBHOOK_SECRET: + WEBHOOK_SECRET = WEBHOOK_SECRET.strip().strip('"').strip("'") LOG_FILE = os.getenv('LOG_FILE', 'bot.log') RELAY_URL = os.getenv('RELAY_URL') @@ -1436,14 +1438,28 @@ def setup_webhook(): """Настройка вебхука через ретранслятор (доставка на WEBHOOK_URL).""" logger.info("starting setup_webhook") last_error = None - # setWebhook сам заменяет предыдущий URL; deleteWebhook не нужен и удваивает нагрузку на API. + # Явный JSON POST: telebot часто шлёт form/query, и secret_token может не дойти + # до Telegram через перехватчик relay — тогда апдейты приходят без заголовка. + api_url = bot_api_method_url(RESPONDER_BOT_TOKEN, "setWebhook") + payload = { + "url": WEBHOOK_URL, + "max_connections": 40, + } + if WEBHOOK_SECRET: + payload["secret_token"] = WEBHOOK_SECRET + for attempt in range(1, 6): try: - bot.set_webhook( - url=WEBHOOK_URL, - secret_token=WEBHOOK_SECRET, - max_connections=40, - ) + resp = requests.post(api_url, json=payload, timeout=60) + try: + data = resp.json() + except Exception: + data = {"ok": False, "description": resp.text[:500]} + desc = str(data.get("description", "")) if isinstance(data, dict) else "" + if resp.status_code == 429 or "retry after" in desc.lower(): + raise RuntimeError(desc or f"HTTP {resp.status_code}") + if not (isinstance(data, dict) and data.get("ok")): + raise RuntimeError(f"setWebhook failed: HTTP {resp.status_code} {data}") logger.info( f"Вебхук установлен через ретранслятор {get_relay_url()}: " f"локальная доставка {WEBHOOK_URL}" @@ -1485,9 +1501,19 @@ def _webhook_retry_after(exc): # Используем путь из WEBHOOK_URL @app.route(WEBHOOK_PATH, methods=['POST']) def webhook(): - logger.info(f"starting webhook") - if request.headers.get('X-Telegram-Bot-Api-Secret-Token') != WEBHOOK_SECRET: - logger.warning("Неверный секретный токен!") + logger.info("starting webhook") + received_secret = request.headers.get("X-Telegram-Bot-Api-Secret-Token") + if received_secret != WEBHOOK_SECRET: + if not received_secret: + logger.warning( + "Секретный токен отсутствует в заголовке " + "(не зарегистрирован в Telegram или relay его не пробросил)" + ) + else: + logger.warning( + "Секретный токен не совпадает " + f"(получен len={len(received_secret)}, ожидается len={len(WEBHOOK_SECRET or '')})" + ) log_event("security", "system", message="Попытка доступа с неверным секретным токеном") return "Unauthorized", 401