Публічне сховище та інструменти для автоматичного збирання, парсингу, візуалізації (HTML) і автоматичної генерації PNG‑зображень графіків планових/аварійних відключень електроенергії в Україні.
Проєкт отримує дані з відкритих вебсторінок постачальників та зберігає їх у JSON «як є» у директорії data/. Далі ці дані відображаються у фіксованому шаблоні HTML і конвертуються у PNG‑зображення, які зберігаються у images/<region>/gpv-x-x.png.
Кожен регіон зберігається у файлі data/<region>.json. Базова структура (скорочено):
{
"regionId": "kyiv",
"regionAffiliation": "м. Київ",
"lastUpdated": "2025-11-06T11:41:56.430Z",
"fact": { "updateFact": "06.11.2025 09:09" },
"preset": { "updateFact": "04.11.2025 18:00" },
"lastUpdateStatus": { "status": "parsed", "ok": true, "code": 200, "message": null, "at": "2025-11-06T11:41:56.430Z", "attempt": 5 },
"meta": { "schemaVersion": "1.0.0", "contentHash": "..." }
}preset— планові відключення на тиждень для кожної групи (тижневий шаблон). Зберігається «як є», без нормалізації структури.fact— фактичні/аварійні відключення на сьогодні та завтра для кожної групи. Також зберігається «як є».- Кожен із об’єктів (
factіpreset) містить полеupdateFactтаupdate— дата й час, на які інформація актуальна (значення з джерела; парсер не змінює формат, зазвичайdd.MM.yyyy HH:mmу часовій зоні Europe/Kyiv). - Блок
metaмінімальний: тількиschemaVersionтаcontentHash(хеш вмістуfact+preset). - У разі помилки парсингу парсер оновлює лише
lastUpdateStatus(наприклад,status = "error", код 422), не стираючи попередніfact/preset. - Актуальний шаблон структури — у файлі
templates/json/data.json.
Детальні приклади полів preset і fact — у поточних JSON у data/.
- Згенеровані PNG зображення зберігаються у директоріях
images/<regionId>/. - Формат назв файлів:
gpv-x-x.png, наприклад:images/kyiv-region/gpv-1-2.pngвідповідає групіGPV1.2. - У репозиторії присутні актуальні зображення для доступних регіонів; вони оновлюються разом із даними.
- У CI тепер використовується безголовий браузер (Playwright, Chromium), який виконує JS і встановлює cookies — це допомагає коректно проходити антибот‑перевірки та отримувати «справжній» HTML.
- Якщо замість сторінки приходить WAF‑HTML, парсер виставляє код помилки (напр., 422) і зберігає наявні дані.
- Дані збираються з публічно доступних джерел. Дотримуйтеся умов використання сайтів.
- Репозиторій не претендує на право власності на первинні дані; див. LICENSE (MIT).