#!/usr/bin/env python3 """ Скрипт для проверки API ключа и доступности Flightradar24 API """ import os import sys import json import requests from datetime import datetime def check_api_key(api_key): """Проверка валидности API ключа""" print("🔑 Проверка API ключа Flightradar24...") print(f" Ключ: {api_key[:10]}...{api_key[-4:] if len(api_key) > 14 else '***'}") print() # Базовый URL API base_url = "https://api.flightradar24.com/common/v1" # Подготовка заголовков headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } # Тестовые запросы (минимальные по кредитам) test_endpoints = [ ("/airport/light/SVO", "Аэропорт Шереметьево (light)"), ("/airline/light/AFL", "Авиакомпания Аэрофлот (light)"), ("/usage", "Отчет об использовании API"), ] results = [] total_credits_used = 0 for endpoint, description in test_endpoints: try: url = base_url + endpoint print(f"🔍 Тест: {description}") print(f" Endpoint: {endpoint}") response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: data = response.json() # Проверка структуры ответа if endpoint == "/usage": credits_used = data.get("credits_used", 0) credits_total = data.get("credits_total", 60000) total_credits_used = credits_used print(f" ✅ Успешно (кредитов использовано: {credits_used:,}/{credits_total:,})") # Определение типа подписки if credits_total >= 1000000: subscription = "Advanced или выше" elif credits_total >= 100000: subscription = "Essential" elif credits_total >= 60000: subscription = "Explorer (промо до 120k)" else: subscription = "Неизвестный тариф" print(f" 💳 Тариф: {subscription} ({credits_total:,} кредитов/месяц)") else: # Для других endpoints проверяем наличие данных if data.get("data") or "name" in data: print(f" ✅ Успешно (данные получены)") else: print(f" ⚠️ Ответ получен, но данных нет") results.append((endpoint, True, response.status_code, None)) elif response.status_code == 401: print(f" ❌ Ошибка 401: Неавторизован (неверный API ключ)") results.append((endpoint, False, response.status_code, "Invalid API key")) break elif response.status_code == 403: print(f" ❌ Ошибка 403: Доступ запрещен (недостаточно прав или кредитов)") results.append((endpoint, False, response.status_code, "Access denied")) elif response.status_code == 404: print(f" ⚠️ Ошибка 404: Endpoint не найден (возможно устаревший)") results.append((endpoint, False, response.status_code, "Not found")) elif response.status_code == 429: print(f" ⚠️ Ошибка 429: Слишком много запросов (лимит rate limiting)") results.append((endpoint, False, response.status_code, "Rate limited")) else: print(f" ❌ Ошибка {response.status_code}: {response.text[:100]}") results.append((endpoint, False, response.status_code, response.text[:100])) except requests.exceptions.Timeout: print(f" ❌ Таймаут соединения") results.append((endpoint, False, "Timeout", "Connection timeout")) except requests.exceptions.ConnectionError: print(f" ❌ Ошибка соединения") results.append((endpoint, False, "ConnectionError", "Network error")) except Exception as e: print(f" ❌ Неожиданная ошибка: {e}") results.append((endpoint, False, "Exception", str(e))) print() # Сводка результатов print("=" * 60) print("📊 Сводка проверки API:") print() successful_tests = sum(1 for _, success, _, _ in results if success) total_tests = len(results) print(f"✅ Успешных тестов: {successful_tests}/{total_tests}") if successful_tests > 0: print("🎉 API ключ валиден и работает!") # Дополнительная информация print() print("📈 Информация о подписке:") # Проверка типа подписки через usage endpoint try: response = requests.get(base_url + "/usage", headers=headers, timeout=5) if response.status_code == 200: usage_data = response.json() credits_total = usage_data.get("credits_total", 0) # Определение тарифа if credits_total >= 1000000: tariff = "Advanced или Business" features = "Полный доступ ко всем endpoints" elif credits_total >= 100000: tariff = "Essential" features = "Расширенный доступ, но без некоторых count endpoints" elif credits_total >= 60000: tariff = "Explorer" features = "Базовый доступ (60k кредитов/мес)" if credits_total >= 120000: tariff += " (промо до 120k)" else: tariff = "Неизвестный тариф" features = "Проверьте документацию" print(f" 💳 Тариф: {tariff}") print(f" 🎯 Кредитов в месяц: {credits_total:,}") print(f" 📋 Возможности: {features}") # Рекомендации по использованию кредитов print() print("💡 Рекомендации по использованию:") print(f" - Средний запрос: 5-50 кредитов") print(f" - Примерное количество запросов: {credits_total // 50:,} в месяц") print(f" - Экономьте кредиты: используйте light endpoints и кэширование") except: print(" ⚠️ Не удалось получить детальную информацию о тарифе") else: print("❌ API ключ не работает. Возможные причины:") print(" - Неверный API ключ") print(" - Подписка не активирована") print(" - Закончились кредиты") print(" - Проблемы с сетью") print() print("🔧 Решение:") print(" 1. Проверьте правильность API ключа") print(" 2. Убедитесь, что подписка Explorer активна") print(" 3. Проверьте баланс кредитов в личном кабинете") print() print("🔗 Полезные ссылки:") print(" - Документация API: https://fr24api.flightradar24.com/") print(" - Подписки и кредиты: https://fr24api.flightradar24.com/subscriptions-and-credits") print(" - Поддержка: https://support.fr24.com/") return successful_tests > 0 def main(): print("=== Flightradar24 API Validator ===") print("Проверка валидности API ключа и доступности сервиса") print() # Получение API ключа api_key = os.getenv("FLIGHTRADAR24_API_KEY") if not api_key: print("❌ Переменная окружения FLIGHTRADAR24_API_KEY не установлена") print() print("Установите API ключ командой:") print(" export FLIGHTRADAR24_API_KEY='your_api_key_here'") print() print("Или запустите скрипт с ключом:") print(" FLIGHTRADAR24_API_KEY='your_key' python3 check_api.py") sys.exit(1) # Проверка формата ключа (базовая) if len(api_key) < 20: print("⚠️ API ключ слишком короткий. Убедитесь в правильности.") # Выполнение проверки is_valid = check_api_key(api_key) # Возвращаем соответствующий код выхода if is_valid: print("\n✅ Проверка завершена успешно") sys.exit(0) else: print("\n❌ Проверка не пройдена") sys.exit(1) if __name__ == "__main__": try: main() except KeyboardInterrupt: print("\n\n⏹ Проверка прервана пользователем") sys.exit(1) except Exception as e: print(f"\n❌ Неожиданная ошибка: {e}") sys.exit(2)