workspace: initial commit - MEMORY, tasks, skills, memory
This commit is contained in:
226
tasks/flightradar24/scripts/check_api.py
Normal file
226
tasks/flightradar24/scripts/check_api.py
Normal file
@@ -0,0 +1,226 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user