ranczo-energy-price-scrapers/Scraper/PstrykScraper.py
2025-08-28 14:15:42 +02:00

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