diff --git a/letsencrypt_regru_api.py b/letsencrypt_regru_api.py index 625265e..ba2de49 100644 --- a/letsencrypt_regru_api.py +++ b/letsencrypt_regru_api.py @@ -348,10 +348,14 @@ class RegRuAPI: pass 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: True если API доступен """ @@ -360,25 +364,36 @@ class RegRuAPI: self.logger.info(f"Текущий IP адрес: {current_ip}") self.logger.info("Проверка доступности API reg.ru...") - 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 + last_error = None + for attempt in range(retries): + try: + # Небольшая задержка перед запросом (защита от rate limit) + time.sleep(1) - except Exception as e: - self.logger.error(f"❌ Не удалось подключиться к API reg.ru: {e}") - return False + # Простой запрос для проверки доступа + 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: + 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: """