50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
from __future__ import annotations
|
|
from datetime import datetime, timedelta, date
|
|
from typing import List, Tuple, Dict, Any, Optional
|
|
import os
|
|
import requests
|
|
from EnergyPriceScraper import EnergyPriceScraperBase, WAW
|
|
|
|
class PstrykScraper(EnergyPriceScraperBase):
|
|
"""
|
|
Szablon: ceny publikowane przez sprzedawcę (Pstryk).
|
|
Załóż: Bearer token w ENV PSTRYK_TOKEN, endpoint w ENV PSTRYK_API_BASE, np.:
|
|
PSTRYK_API_BASE=https://api.pstryk.example.com
|
|
Endpoint (przykład): GET /prices?date=YYYY-MM-DD
|
|
-> [{"ts":"2025-08-27T00:00:00+02:00","net_pln_kwh":0.44}, ...]
|
|
"""
|
|
PROVIDER = "PSTRYK"
|
|
KIND = "market_price"
|
|
SIDE = "buy"
|
|
BUYER = "end_user"
|
|
SELLER = "PSTRYK"
|
|
|
|
api_base: str
|
|
token: str
|
|
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
self.api_base = os.getenv("PSTRYK_API_BASE", "").rstrip("/")
|
|
self.token = os.getenv("PSTRYK_TOKEN", "")
|
|
if not self.api_base or not self.token:
|
|
raise RuntimeError("Ustaw PSTRYK_API_BASE i PSTRYK_TOKEN w środowisku.")
|
|
self.session = requests.Session()
|
|
self.session.headers.update({
|
|
"accept": "application/json",
|
|
"authorization": f"Bearer {self.token}",
|
|
"user-agent": "energy-scraper/1.0",
|
|
})
|
|
|
|
def fetch_day(self, business_day: date) -> List[Tuple[datetime, datetime, float, Dict[str, Any]]]:
|
|
url = f"{self.api_base}/prices"
|
|
r = self.session.get(url, params={"date": f"{business_day:%Y-%m-%d}"}, timeout=30)
|
|
r.raise_for_status()
|
|
data = r.json()
|
|
|
|
out: List[Tuple[datetime, datetime, float, Dict[str, Any]]] = []
|
|
for item in data:
|
|
ts = datetime.fromisoformat(item["ts"]).astimezone(WAW)
|
|
p = float(item["net_pln_kwh"])
|
|
out.append((ts, ts + self.period, p, {"source": "pstryk_api"}))
|
|
return out
|