82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
from dataclasses import dataclass
|
|
import datetime
|
|
import json
|
|
import os
|
|
from typing import Dict
|
|
|
|
import requests
|
|
|
|
|
|
class PriceException(Exception): pass
|
|
class PriceNotFound(Exception): pass
|
|
|
|
|
|
url_energy = "https://www.ote-cr.cz/cs/kratkodobe-trhy/elektrina/denni-trh/@@chart-data?report_date={}"
|
|
url_currency = "https://data.kurzy.cz/json/meny/b[1].json"
|
|
url_currency2 = "https://www.cnb.cz/cs/financni-trhy/devizovy-trh/kurzy-devizoveho-trhu/kurzy-devizoveho-trhu/denni_kurz.txt?date={day}.{month}.{year}"
|
|
CACHE_PATH = "./cache"
|
|
|
|
|
|
def get_energy_prices(d: datetime.date=datetime.date.today(), no_cache:bool=False) -> Dict[str, float]:
|
|
"""
|
|
|
|
"""
|
|
date_str = d.strftime("%Y-%m-%d")
|
|
|
|
hours = {}
|
|
|
|
cache_file = os.path.join(CACHE_PATH, "hours-{}.json".format(date_str))
|
|
|
|
if os.path.isfile(cache_file) and not no_cache:
|
|
with open(cache_file, "r") as f:
|
|
hours = json.load(f)
|
|
|
|
if not hours or no_cache:
|
|
r = requests.get(url_energy.format(date_str))
|
|
|
|
try:
|
|
for raw in r.json()["data"]["dataLine"][1]["point"]:
|
|
hours[str(int(raw["x"])-1)] = raw["y"]
|
|
except IndexError:
|
|
raise PriceNotFound()
|
|
|
|
with open(cache_file, "w") as f:
|
|
f.write(json.dumps(hours))
|
|
|
|
return hours
|
|
|
|
#def get_currency_ratio(currency):
|
|
# r = requests.get(url_currency)
|
|
# return r.json()["kurzy"][currency]["dev_stred"]
|
|
|
|
def get_eur_czk_ratio(d: datetime.date=datetime.date.today(), no_cache:bool=False) -> float:
|
|
ratio = 0
|
|
|
|
cache_file = os.path.join(CACHE_PATH, "eur-czk-{}.json".format(d.strftime("%Y-%m-%d")))
|
|
|
|
if os.path.isfile(cache_file):
|
|
with open(cache_file, "r") as f:
|
|
ratio = float(f.read())
|
|
|
|
if not ratio or no_cache:
|
|
url = url_currency2.format(day=d.day,month=d.month,year=d.year)
|
|
r = requests.get(url)
|
|
for row in [x.split("|") for x in r.text.split("\n") if x and "|" in x]:
|
|
if row[3] == "EUR":
|
|
ratio = float(row[4].replace(",", "."))
|
|
break
|
|
|
|
if not ratio:
|
|
raise PriceException("EUR not found")
|
|
|
|
with open(cache_file, "w") as f:
|
|
f.write(str(ratio))
|
|
|
|
return ratio
|
|
|
|
|
|
|
|
|
|
|
|
|