52 lines
1.9 KiB
Python
52 lines
1.9 KiB
Python
import requests
|
|
from urllib.parse import urlencode
|
|
from datetime import datetime
|
|
from typing import Any
|
|
from zoneinfo import ZoneInfo
|
|
from collections import OrderedDict
|
|
|
|
class TawhiriClient:
|
|
BASE_URL = "https://fly.stratonautica.ru/api/v2/"
|
|
TIMEOUT = 15
|
|
|
|
@staticmethod
|
|
def _convert_value(value: Any) -> Any:
|
|
if isinstance(value, datetime):
|
|
return value.isoformat().replace("+00:00", "Z")
|
|
return value
|
|
|
|
@classmethod
|
|
def get_prediction(cls, params: dict) -> dict:
|
|
url = cls.build_url(params)
|
|
print("🔍 URL:", url)
|
|
response = requests.get(url, timeout=cls.TIMEOUT)
|
|
response.raise_for_status()
|
|
return response.json()
|
|
|
|
@classmethod
|
|
def build_url(cls, params: dict) -> str:
|
|
query = OrderedDict()
|
|
|
|
query["profile"] = params.get("profile")
|
|
query["launch_datetime"] = cls._convert_value(params.get("launch_datetime"))
|
|
query["launch_latitude"] = params.get("launch_latitude")
|
|
query["launch_longitude"] = params.get("launch_longitude")
|
|
query["launch_altitude"] = params.get("launch_altitude", 0)
|
|
query["ascent_rate"] = params.get("ascent_rate")
|
|
query["burst_altitude"] = params.get("burst_altitude")
|
|
query["descent_rate"] = params.get("descent_rate")
|
|
query["interpolate"] = str(params.get("interpolate", False)).lower()
|
|
query["dataset"] = cls._convert_value(params.get("dataset"))
|
|
query["format"] = params.get("format", "json")
|
|
query["pred_type"] = "single" # <-- в конце
|
|
|
|
filtered = {k: v for k, v in query.items() if v is not None}
|
|
return f"{cls.BASE_URL}?{urlencode(filtered)}"
|
|
|
|
|
|
@classmethod
|
|
def get_prediction(cls, params: dict) -> dict:
|
|
url = cls.build_url(params)
|
|
response = requests.get(url, timeout=cls.TIMEOUT)
|
|
response.raise_for_status()
|
|
return response.json()
|