masterAAA123's picture
Space deploy v5: orphan snapshot of main, zero binary files
b81a86b
Raw
History Blame Contribute Delete
2.7 kB
"""
Data Source: BNPB DIBI (Data Informasi Bencana Indonesia)
==========================================================
Untuk skenario D5 (banjir multi-kab) — kabupaten dengan bencana aktif.
URL: https://dibi.bnpb.go.id/
API: https://dibi.bnpb.go.id/dibi3/api/...
Frekuensi update: realtime (saat ada laporan bencana).
Authentication: tidak required untuk read public.
Author: AgriFlow Team
"""
from __future__ import annotations
from datetime import datetime, timedelta
from typing import Dict, List, Set
try:
import requests
HAS_REQUESTS = True
except ImportError:
HAS_REQUESTS = False
# Tipe bencana yang menyebabkan kab unreachable untuk distribusi
DISRUPTIVE_DISASTERS = {
"BANJIR", # banjir besar — rute terputus
"TANAH LONGSOR",
"GEMPA BUMI",
"GUNUNG MELETUS",
"TSUNAMI",
}
class BNPBConnector:
"""
BNPB DIBI connector untuk fetch bencana aktif Jawa Timur.
"""
BASE_URL = "https://dibi.bnpb.go.id"
DEFAULT_TIMEOUT = 15
def __init__(self, timeout: int = DEFAULT_TIMEOUT):
self.timeout = timeout
def fetch_active_disasters_jatim(
self,
days_back: int = 7,
) -> List[Dict]:
"""
Fetch bencana aktif di Jatim dalam N hari terakhir.
DIBI tidak ada API publik formal — pendekatan production:
1. Scrape https://dibi.bnpb.go.id/dibi3/peta_bencana
2. Parse table bencana per provinsi
3. Filter Jatim (kode 35)
Untuk hackathon ini, return list manual dari news monitoring + BNPB feed.
"""
if not HAS_REQUESTS:
return []
# Production: scrape DIBI
# Development/hackathon: return empty atau hardcoded sample
return []
def get_affected_kabupaten(self, days_back: int = 7) -> Set[str]:
"""
Return set kabupaten ID Jatim yang sedang ada bencana disruptif aktif.
"""
disasters = self.fetch_active_disasters_jatim(days_back=days_back)
affected: Set[str] = set()
for d in disasters:
tipe = d.get("tipe_bencana", "").upper()
if tipe in DISRUPTIVE_DISASTERS:
kab_id = d.get("kabupaten_id")
if kab_id and kab_id.startswith("35"): # Jatim
affected.add(kab_id)
return affected
def get_disaster_affected_kabupaten(days_back: int = 7) -> Set[str]:
"""Helper: kabupaten dengan bencana aktif."""
return BNPBConnector().get_affected_kabupaten(days_back=days_back)
if __name__ == "__main__":
print("Testing BNPB connector...")
affected = get_disaster_affected_kabupaten()
print(f"Kabupaten dengan bencana aktif: {affected}")