[ZILANT] убрать зацикливание запроса на вебхук
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
+45
-23
@@ -1434,32 +1434,53 @@ def handle_callback(call):
|
||||
|
||||
def setup_webhook():
|
||||
"""Настройка вебхука через ретранслятор (доставка на WEBHOOK_URL)."""
|
||||
logger.info(f"starting setup_webhook")
|
||||
try:
|
||||
# Удаляем предыдущий вебхук
|
||||
bot.remove_webhook()
|
||||
logger.info("starting setup_webhook")
|
||||
last_error = None
|
||||
# setWebhook сам заменяет предыдущий URL; deleteWebhook не нужен и удваивает нагрузку на API.
|
||||
for attempt in range(1, 6):
|
||||
try:
|
||||
bot.set_webhook(
|
||||
url=WEBHOOK_URL,
|
||||
secret_token=WEBHOOK_SECRET,
|
||||
max_connections=40,
|
||||
)
|
||||
logger.info(
|
||||
f"Вебхук установлен через ретранслятор {get_relay_url()}: "
|
||||
f"локальная доставка {WEBHOOK_URL}"
|
||||
)
|
||||
logger.info(f"Секретный токен: {'установлен' if WEBHOOK_SECRET else 'не установлен'}")
|
||||
logger.info(f"Прослушивание порта: {WEBHOOK_PORT}")
|
||||
logger.info(f"Путь вебхука: {WEBHOOK_PATH}")
|
||||
log_event("system", "system", message=f"Вебхук установлен на {WEBHOOK_URL}")
|
||||
return
|
||||
except Exception as e:
|
||||
last_error = e
|
||||
retry_after = _webhook_retry_after(e)
|
||||
if retry_after is not None and attempt < 5:
|
||||
logger.warning(
|
||||
f"setup_webhook: попытка {attempt}/5 — {e}; ждём {retry_after} с"
|
||||
)
|
||||
time.sleep(retry_after)
|
||||
continue
|
||||
break
|
||||
|
||||
# Устанавливаем новый вебхук:
|
||||
# relay сохранит WEBHOOK_URL как адрес локальной доставки и зарегистрирует
|
||||
# внешний URL на Telegram (external_relay).
|
||||
bot.set_webhook(
|
||||
url=WEBHOOK_URL,
|
||||
secret_token=WEBHOOK_SECRET,
|
||||
max_connections=40
|
||||
)
|
||||
logger.info(f"Вебхук установлен через ретранслятор {get_relay_url()}: локальная доставка {WEBHOOK_URL}")
|
||||
logger.info(f"Секретный токен: {'установлен' if WEBHOOK_SECRET else 'не установлен'}")
|
||||
logger.info(f"Прослушивание порта: {WEBHOOK_PORT}")
|
||||
logger.info(f"Путь вебхука: {WEBHOOK_PATH}")
|
||||
error_msg = f"Ошибка настройка вебхука: {last_error}"
|
||||
logger.error(error_msg)
|
||||
log_event("error", "system", message=error_msg)
|
||||
raise RuntimeError(error_msg) from last_error
|
||||
|
||||
# Логируем успешную настройку вебхука
|
||||
log_event("system", "system", message=f"Вебхук установлен на {WEBHOOK_URL}")
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Ошибка настройка вебхука: {e}"
|
||||
logger.error(error_msg)
|
||||
log_event("error", "system", message=error_msg)
|
||||
raise RuntimeError(error_msg) from e
|
||||
def _webhook_retry_after(exc):
|
||||
"""Извлекает секунды ожидания из 429 / 'retry after N', иначе None."""
|
||||
text = str(exc)
|
||||
if "429" not in text and "Too Many Requests" not in text and "retry after" not in text.lower():
|
||||
return None
|
||||
import re
|
||||
match = re.search(r"retry after (\d+)", text, re.IGNORECASE)
|
||||
if match:
|
||||
return max(int(match.group(1)), 1) + 1
|
||||
return 2
|
||||
|
||||
|
||||
# Используем путь из WEBHOOK_URL
|
||||
@app.route(WEBHOOK_PATH, methods=['POST'])
|
||||
@@ -1474,6 +1495,7 @@ def webhook():
|
||||
try:
|
||||
update = telebot.types.Update.de_json(json_data)
|
||||
bot.process_new_updates([update])
|
||||
|
||||
return "OK", 200
|
||||
except Exception as e:
|
||||
error_msg = f"Ошибка обработки вебхука: {e}"
|
||||
|
||||
Reference in New Issue
Block a user