226 lines
10 KiB
Python
226 lines
10 KiB
Python
#!/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) |