195 lines
9.2 KiB
Python
195 lines
9.2 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Скрипт для проверки обоих API ключей (sandbox и production)
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import json
|
||
import requests
|
||
|
||
def test_api_key(api_key, is_sandbox=True):
|
||
"""Проверка API ключа"""
|
||
|
||
if is_sandbox:
|
||
base_url = "https://fr24api.flightradar24.com/api"
|
||
headers = {
|
||
"Authorization": f"Bearer {api_key}",
|
||
"Accept": "application/json",
|
||
"Accept-Version": "v1"
|
||
}
|
||
key_type = "sandbox"
|
||
else:
|
||
base_url = "https://api.flightradar24.com/common/v1"
|
||
headers = {
|
||
"Authorization": f"Bearer {api_key}",
|
||
"Content-Type": "application/json"
|
||
}
|
||
key_type = "production"
|
||
|
||
print(f"\n🔑 Тестирование {key_type} ключа...")
|
||
print(f" Ключ: {api_key[:15]}...{api_key[-10:] if len(api_key) > 25 else '***'}")
|
||
print(f" Base URL: {base_url}")
|
||
|
||
results = []
|
||
|
||
# Тестовые endpoints в зависимости от типа
|
||
if is_sandbox:
|
||
test_endpoints = [
|
||
("/static/airlines/AAL/light", "Авиакомпания American Airlines (light)"),
|
||
("/live/flight-positions/light?bounds=50.682,46.218,14.422,22.243", "Live позиции (test bounds)"),
|
||
]
|
||
else:
|
||
test_endpoints = [
|
||
("/airport/light/SVO", "Аэропорт Шереметьево (light)"),
|
||
("/usage", "Отчет об использовании API"),
|
||
]
|
||
|
||
for endpoint, description in test_endpoints:
|
||
try:
|
||
url = base_url + endpoint if not endpoint.startswith("http") else endpoint
|
||
print(f"\n🔍 Тест: {description}")
|
||
print(f" Endpoint: {endpoint.split('?')[0]}")
|
||
|
||
# Обработка параметров в URL
|
||
if "?" in endpoint:
|
||
url, query_string = url.split("?", 1)
|
||
from urllib.parse import parse_qs
|
||
params = parse_qs(query_string)
|
||
# Преобразуем списки в одиночные значения
|
||
params = {k: v[0] if len(v) == 1 else v for k, v in params.items()}
|
||
response = requests.get(url, headers=headers, params=params, timeout=10)
|
||
else:
|
||
response = requests.get(url, headers=headers, timeout=10)
|
||
|
||
print(f" Статус: {response.status_code}")
|
||
|
||
if response.status_code == 200:
|
||
try:
|
||
data = response.json()
|
||
print(f" ✅ Успешно")
|
||
|
||
# Вывод фрагмента данных
|
||
if "data" in data:
|
||
data_count = len(data.get("data", []))
|
||
print(f" 📊 Данных: {data_count} записей")
|
||
if data_count > 0:
|
||
first_item = data["data"][0]
|
||
print(f" 🎯 Пример: {json.dumps(first_item, ensure_ascii=False)[:100]}...")
|
||
elif "name" in data:
|
||
print(f" 📝 {data.get('name', 'N/A')} ({data.get('iata', 'N/A')}/{data.get('icao', 'N/A')})")
|
||
|
||
results.append((endpoint, True, response.status_code, None))
|
||
|
||
except json.JSONDecodeError:
|
||
print(f" ⚠️ Ответ не JSON: {response.text[:100]}")
|
||
results.append((endpoint, False, response.status_code, "Not JSON"))
|
||
|
||
elif response.status_code == 400:
|
||
print(f" ❌ Ошибка 400: Неверный запрос")
|
||
print(f" Детали: {response.text[:200]}")
|
||
results.append((endpoint, False, response.status_code, "Bad request"))
|
||
|
||
elif response.status_code == 401:
|
||
print(f" ❌ Ошибка 401: Неавторизован")
|
||
results.append((endpoint, False, response.status_code, "Unauthorized"))
|
||
|
||
elif response.status_code == 403:
|
||
print(f" ❌ Ошибка 403: Доступ запрещен")
|
||
print(f" Возможно: неверный ключ, нет прав, закончились кредиты")
|
||
results.append((endpoint, False, response.status_code, "Forbidden"))
|
||
|
||
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: Слишком много запросов")
|
||
results.append((endpoint, False, response.status_code, "Rate limited"))
|
||
|
||
else:
|
||
print(f" ❌ Ошибка {response.status_code}")
|
||
print(f" Ответ: {response.text[:200]}")
|
||
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)))
|
||
|
||
# Сводка
|
||
successful = sum(1 for _, success, _, _ in results if success)
|
||
total = len(results)
|
||
|
||
print(f"\n📊 Сводка {key_type}: {successful}/{total} успешных тестов")
|
||
|
||
if successful > 0:
|
||
print(f"🎉 {key_type.capitalize()} ключ работает!")
|
||
return True, key_type
|
||
else:
|
||
print(f"❌ {key_type.capitalize()} ключ не работает")
|
||
return False, key_type
|
||
|
||
def main():
|
||
print("=== Проверка API ключей Flightradar24 ===")
|
||
print("Тестирование sandbox и production ключей")
|
||
print("=" * 50)
|
||
|
||
# Ключи из сообщений
|
||
sandbox_key = "9d4d192b-8641-4420-b00e-09e3d935badf|fIMdnj8WixjDqyaUTHLKPlgHU9d5JiOZwJJWGiVHdcda602e"
|
||
production_key = "019d0c18-2d07-704c-9b3e-af32f2482f79|lDODG5lI4BuOGDaE24TPLqRANiuSLXudbC8VrbCgf351f19f"
|
||
|
||
# Тестируем sandbox
|
||
sandbox_ok, _ = test_api_key(sandbox_key, is_sandbox=True)
|
||
|
||
# Тестируем production
|
||
production_ok, _ = test_api_key(production_key, is_sandbox=False)
|
||
|
||
print("\n" + "=" * 50)
|
||
print("🎯 Итоговые результаты:")
|
||
print(f" Sandbox: {'✅ Работает' if sandbox_ok else '❌ Не работает'}")
|
||
print(f" Production: {'✅ Работает' if production_ok else '❌ Не работает'}")
|
||
|
||
if sandbox_ok and production_ok:
|
||
print("\n🎉 Оба ключа работают! Можно начинать разработку.")
|
||
print(" Этап 1: Прототип на sandbox данных")
|
||
print(" Этап 2: Переход на production данные после отмашки")
|
||
elif sandbox_ok and not production_ok:
|
||
print("\n⚠️ Sandbox работает, production нет.")
|
||
print(" Можно разрабатывать прототип на sandbox, но нужно проверить production ключ.")
|
||
print(" Возможные причины: неактивированная подписка, закончились кредиты.")
|
||
elif not sandbox_ok and production_ok:
|
||
print("\n⚠️ Production работает, sandbox нет.")
|
||
print(" Можно разрабатывать сразу на production (будет расходовать кредиты).")
|
||
else:
|
||
print("\n❌ Ни один ключ не работает.")
|
||
print(" Проверьте правильность ключей и статус подписки.")
|
||
|
||
# Сохраняем ключи в файл .env для удобства
|
||
with open(".env", "w") as f:
|
||
f.write(f"FLIGHTRADAR24_SANDBOX_KEY={sandbox_key}\n")
|
||
f.write(f"FLIGHTRADAR24_PRODUCTION_KEY={production_key}\n")
|
||
f.write(f"FLIGHTRADAR24_API_KEY={sandbox_key} # По умолчанию используем sandbox\n")
|
||
|
||
print(f"\n💾 Ключи сохранены в .env файл")
|
||
print(" Для использования в скриптах:")
|
||
print(" - Sandbox: FLIGHTRADAR24_SANDBOX_KEY")
|
||
print(" - Production: FLIGHTRADAR24_PRODUCTION_KEY")
|
||
print(" - По умолчанию: FLIGHTRADAR24_API_KEY (sandbox)")
|
||
|
||
return 0 if sandbox_ok else 1
|
||
|
||
if __name__ == "__main__":
|
||
try:
|
||
sys.exit(main())
|
||
except KeyboardInterrupt:
|
||
print("\n\n⏹ Проверка прервана")
|
||
sys.exit(1)
|
||
except Exception as e:
|
||
print(f"\n💥 Критическая ошибка: {e}")
|
||
sys.exit(2) |