fix: add retry with exponential backoff for reg.ru API availability check

test_api_access() now retries 3 times with 10s/20s/40s backoff
instead of failing immediately on transient errors like 503
This commit is contained in:
Dmitriy Fofanov
2026-02-25 13:07:17 +03:00
parent 8c31201b51
commit c087c8abf2
+35 -20
View File
@@ -348,10 +348,14 @@ class RegRuAPI:
pass pass
return "Неизвестно" return "Неизвестно"
def test_api_access(self) -> bool: def test_api_access(self, retries: int = 3, initial_delay: int = 10) -> bool:
""" """
Проверка доступности API reg.ru Проверка доступности API reg.ru с повторными попытками
Args:
retries: Количество попыток (по умолчанию 3)
initial_delay: Начальная задержка между попытками в секундах
Returns: Returns:
True если API доступен True если API доступен
""" """
@@ -360,25 +364,36 @@ class RegRuAPI:
self.logger.info(f"Текущий IP адрес: {current_ip}") self.logger.info(f"Текущий IP адрес: {current_ip}")
self.logger.info("Проверка доступности API reg.ru...") self.logger.info("Проверка доступности API reg.ru...")
try: last_error = None
# Небольшая задержка перед запросом (защита от rate limit) for attempt in range(retries):
time.sleep(1) try:
# Небольшая задержка перед запросом (защита от rate limit)
# Простой запрос для проверки доступа time.sleep(1)
params = {}
result = self._make_request("user/get_balance", params)
if result and result.get("result") == "success":
balance = result.get("answer", {}).get("prepay", "Неизвестно")
self.logger.info(f"✅ API reg.ru доступен. Баланс: {balance} руб.")
return True
else:
self.logger.error("❌ API reg.ru недоступен")
return False
except Exception as e: # Простой запрос для проверки доступа
self.logger.error(f"Не удалось подключиться к API reg.ru: {e}") params = {}
return False result = self._make_request("user/get_balance", params)
if result and result.get("result") == "success":
balance = result.get("answer", {}).get("prepay", "Неизвестно")
self.logger.info(f"✅ API reg.ru доступен. Баланс: {balance} руб.")
return True
else:
last_error = "API вернул неуспешный результат"
except Exception as e:
last_error = str(e)
if attempt < retries - 1:
delay = initial_delay * (2 ** attempt) # 10s, 20s, 40s
self.logger.warning(
f"API reg.ru недоступен (попытка {attempt + 1}/{retries}): {last_error}. "
f"Повтор через {delay} сек..."
)
time.sleep(delay)
self.logger.error(f"Не удалось подключиться к API reg.ru после {retries} попыток: {last_error}")
return False
def remove_txt_record(self, domain: str, subdomain: str, txt_value: str) -> bool: def remove_txt_record(self, domain: str, subdomain: str, txt_value: str) -> bool:
""" """