34 lines
1.0 KiB
Python
34 lines
1.0 KiB
Python
from datetime import date
|
|
|
|
import requests
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class CurrencyService:
|
|
BASE_URL = "https://cbu.uz/oz/arkhiv-kursov-valyut/json"
|
|
CODES = ("USD", "EUR", "RUB")
|
|
TIMEOUT_SECONDS = 5
|
|
|
|
@classmethod
|
|
def get_rates(cls, target_date=None) -> dict:
|
|
if target_date is None:
|
|
target_date = date.today()
|
|
date_str = target_date.strftime("%Y-%m-%d")
|
|
|
|
rates = {}
|
|
for code in cls.CODES:
|
|
url = f"{cls.BASE_URL}/{code}/{date_str}/"
|
|
try:
|
|
response = requests.get(url, timeout=cls.TIMEOUT_SECONDS)
|
|
response.raise_for_status()
|
|
payload = response.json()
|
|
if isinstance(payload, list) and payload:
|
|
rate_value = payload[0].get("Rate")
|
|
if rate_value:
|
|
rates[code] = rate_value
|
|
except (requests.RequestException, ValueError) as e:
|
|
logger.exception(f"CBU API error for {code}: {e}")
|
|
return rates
|