From 68387f89fd494cbb46ac7ae4c575e9f18972a624 Mon Sep 17 00:00:00 2001 From: Claude Dev Date: Tue, 24 Mar 2026 13:11:34 +0100 Subject: [PATCH] OSINT Monitor Layer + Erdbeben in Katastrophen zusammengefuehrt MONITOR LAYER (neu): - Neuer Top-Layer "OSINT Monitor" im Panel - Zeigt geoparsete Standorte aus Monitor-Lagen auf dem Globus - Farbkodiert: rot=Hauptgeschehen, orange=Reaktionen, blau=Beteiligte - Labels mit Ortsname + Artikelanzahl bei Zoom - 2min Refresh, GeoJSON vom Monitor Public API KATASTROPHEN (erweitert): - Erdbeben-Layer in Katastrophen integriert (kein separater Toggle mehr) - Laedt NASA EONET + USGS parallel - Erdbeben als farbige Punkte (rot=frisch, gelb=alt) mit M-Label - Katastrophen-Toggle zeigt jetzt alles: Waldbraende, Vulkane, Stuerme, Fluten UND Erdbeben --- src/data_monitor.py | 46 ++++++++++++++++ src/main.py | 2 + static/css/globe.css | 1 + static/index.html | 22 ++++---- static/js/app.js | 5 +- static/js/layers/disasters.js | 84 ++++++++++++++++++++++++---- static/js/layers/monitor.js | 100 ++++++++++++++++++++++++++++++++++ 7 files changed, 237 insertions(+), 23 deletions(-) create mode 100644 src/data_monitor.py create mode 100644 static/js/layers/monitor.js diff --git a/src/data_monitor.py b/src/data_monitor.py new file mode 100644 index 0000000..80df67f --- /dev/null +++ b/src/data_monitor.py @@ -0,0 +1,46 @@ +"""Monitor-Feed: OSINT-Daten aus dem AegisSight Monitor.""" +import logging +import os +import time + +import httpx +from fastapi import APIRouter, Query + +logger = logging.getLogger("globe.monitor") +router = APIRouter() + +_MONITOR_URL = os.getenv("MONITOR_API_URL", "https://monitor.aegis-sight.de/api/public") +_MONITOR_KEY = os.getenv("MONITOR_API_KEY", "") + +_cache: dict[str, tuple] = {} + + +@router.get("/monitor-feed") +async def get_monitor_feed(incident_id: int = Query(None)): + """Holt OSINT-Daten vom AegisSight Monitor.""" + cache_key = f"monitor:{incident_id or 'all'}" + if cache_key in _cache and time.time() - _cache[cache_key][0] < 120: + return _cache[cache_key][1] + + params = {} + if incident_id: + params["incident_id"] = incident_id + + try: + async with httpx.AsyncClient(timeout=15) as client: + r = await client.get( + f"{_MONITOR_URL}/globe-feed", + params=params, + headers={"X-API-Key": _MONITOR_KEY}, + ) + r.raise_for_status() + data = r.json() + _cache[cache_key] = (time.time(), data) + logger.info(f"Monitor-Feed: {len(data.get('features', []))} Locations, " + f"{len(data.get('incidents', []))} Lagen") + return data + except Exception as e: + logger.warning(f"Monitor-Feed Fehler: {e}") + if cache_key in _cache: + return _cache[cache_key][1] + return {"type": "FeatureCollection", "features": [], "incidents": []} diff --git a/src/main.py b/src/main.py index 7af32d3..7f26d5d 100644 --- a/src/main.py +++ b/src/main.py @@ -33,6 +33,7 @@ from data_quakes import router as quakes_router from data_gdelt import router as gdelt_router from data_satellites import router as satellites_router from data_disasters import router as disasters_router +from data_monitor import router as monitor_router # Alle Daten-APIs hinter Auth app.include_router(flights_router, prefix="/api", dependencies=[Depends(get_current_user)]) @@ -41,6 +42,7 @@ app.include_router(quakes_router, prefix="/api", dependencies=[Depends(get_curre app.include_router(gdelt_router, prefix="/api", dependencies=[Depends(get_current_user)]) app.include_router(satellites_router, prefix="/api", dependencies=[Depends(get_current_user)]) app.include_router(disasters_router, prefix="/api", dependencies=[Depends(get_current_user)]) +app.include_router(monitor_router, prefix="/api", dependencies=[Depends(get_current_user)]) # --- Static files --- static_dir = Path(__file__).parent.parent / "static" diff --git a/static/css/globe.css b/static/css/globe.css index a6247cf..a745abe 100644 --- a/static/css/globe.css +++ b/static/css/globe.css @@ -152,6 +152,7 @@ html, body { height: 100%; overflow: hidden; background: var(--bg-primary); colo /* === Neue Layer-Dots === */ +.dot-monitor { background: #ff2222; box-shadow: 0 0 4px rgba(255,34,34,0.5); } .dot-satellites { background: #ff4444; } .dot-disasters { background: #ff8800; } diff --git a/static/index.html b/static/index.html index ed7cb65..24b710a 100644 --- a/static/index.html +++ b/static/index.html @@ -46,6 +46,14 @@