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:
+35
-20
@@ -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:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user