
Panel de fusión de inteligencia de múltiples fuentes: feeds de WiFi, redes celulares, CCTV, ADS-B, orbitales y SDR unificados en un único mapa táctico. Solo para investigación de seguridad.
Una plataforma de fusión de inteligencia de señales de espectro completo y de múltiples fuentes para la investigación y el entrenamiento en seguridad. Signal OPS integra docenas de fuentes de recopilación abiertas — bases de datos de WiFi/Bluetooth/torres de telefonía móvil, escáneres de exposición a Internet, índices de cámaras, fuentes de vuelos ADS-B, seguimiento de satélites TLE y redes SDR/APRS — en un único mapa táctico y una API Flask, correlacionando los dominios RF, celular, aeroespacial, orbital y de vigilancia en una única imagen operativa en tiempo real, con resúmenes de amenazas asistidos por IA opcionales superpuestos.
Casi todas las fuentes son opcionales. Si una clave no está configurada, ese buscador se omite de forma elegante — las fuentes gratuitas (OpenStreetMap, Insecam, ipinfo.io, ADS-B, CelesTrak, KiwiSDR) funcionan sin ninguna clave.
El mapa principal fusiona las capas de WiFi, Bluetooth, telefonía móvil, cámaras y aeronaves sobre la misma área, con superposiciones activables para cámaras OSM, redes ALPR/Flock y distritos policiales.


| Fuente de vigilancia | Descubrimiento CCTV |
|---|---|
![]() | ![]() |
La lista de vigilancia puntúa cada dispositivo (p. ej. "Sospecha 35/100: Cámara no autenticada") y fusiona routers, televisores y cámaras expuestas de WiGLE, Insecam y OSM. La vista CCTV agrupa las cámaras descubiertas por fuente con riesgo por cámara y estado en vivo/metadatos.
| Mapa de calor de torres de telefonía móvil | Red SDR / APRS |
|---|---|
![]() | ![]() |
Dependencias principales:
flask
requests
python-dotenv
Recomendadas (habilita la funcionalidad completa — caché, limitación de velocidad, propagación satelital):
cachetools # geo-caché acotado (usa un dict sin límite si falta)
flask-limiter # limitación de velocidad de solicitudes
sgp4 # propagación de posición satelital para /api/satellites
google-genai # análisis IA Gemini (solo si usas GEMINI_API_KEY)
Instala todo:
pip install flask requests python-dotenv cachetools flask-limiter sgp4 google-genai
git https://github.com/emrekybs/signalops.git
unzip signalops-v1.zip
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
Si no tienes un requirements.txt, usa la línea de pip install de la sección de Requisitos anterior.
Copia el archivo de ejemplo y completa las claves que tengas:
cp .env.example .env
Luego abre .env y pega tus claves API. Cada clave es opcional — deja cualquier línea en blanco (o elimínala) para deshabilitar esa fuente. Consulta la siguiente sección para saber qué hace cada una y dónde obtenerla.
Para consultas instantáneas y offline de cámaras y distritos policiales, coloca estos archivos en un directorio data/ (o apunta DATA_DIR a otra ubicación):
data/CAMERAS_WITH_NETWORK_DATA.geojson # Características de puntos (cámaras)
data/police_precincts_usa.geojson # Características de polígonos (distritos de EE. UU.)
data/camera_networks.json # metadatos de redes compartidas
data/tiles/{z}/{x}/{y}.json # conjunto de datos de cámaras en teselas opcional
Si estos archivos están ausentes, la aplicación recurre automáticamente a consultas en vivo de OpenStreetMap Overpass.
python app_v2.py
El servidor se inicia en http://0.0.0.0:8080. Abre http://localhost:8080 en tu navegador.
Verifica qué proveedores se cargaron correctamente en cualquier momento:
GET /api/status # claves activas vs. faltantes
GET /api/debug # booleano por clave + prueba de autenticación WiGLE en vivo
Crea un archivo .env en la raíz del proyecto. A continuación se muestra la lista completa que lee la aplicación.
Estas no necesitan configuración: OpenStreetMap Overpass, Insecam, EarthCam, ipinfo.io, ADS-B (adsb.fi / OpenSky), CelesTrak TLE, SatNOGS y KiwiSDR.
.env.exampleGuarda esto como .env.example en tu repositorio para que otros conozcan el formato:
# ── Entorno de Signal OPS ──
# Cada clave es opcional. Deja en blanco para deshabilitar esa fuente.
# WiFi / Bluetooth / Celular
WIGLE_API_NAME=
WIGLE_API_TOKEN=
OPENCELLID_API_KEY=
# Escáneres de exposición a Internet
SHODAN_API_KEY=
CENSYS_API_ID=
CENSYS_API_SECRET=
ZOOMEYE_API_KEY=
FOFA_EMAIL=
FOFA_API_KEY=
HUNTERHOW_API_KEY=
NETLAS_API_KEY=
LEAKIX_API_KEY=
CRIMINALIP_API_KEY=
BINARYEDGE_API_KEY=
# Cámaras y reputación IP
WINDY_API_KEY=
ABUSEIPDB_API_KEY=
# Aeronaves y radioaficionados
ADSB_API_KEY=
APRS_FI_KEY=
# Análisis IA
GEMINI_API_KEY=
GEMINI_MODEL=gemini-2.0-flash
# Configuración de la aplicación
DATA_DIR=./data
FLASK_SECRET_KEY=
Una selección de los endpoints expuestos (consulta el código fuente para el conjunto completo):
| Variable | Proveedor | Obtén una clave en |
|---|
WIGLE_API_NAME | WiGLE (WiFi/BT/celular) — nombre de usuario | https://wigle.net/account |
WIGLE_API_TOKEN | WiGLE — token API | https://wigle.net/account |
OPENCELLID_API_KEY | OpenCellID (torres de telefonía móvil) | https://opencellid.org |
SHODAN_API_KEY | Shodan (exposición / cámaras) | https://account.shodan.io |
CENSYS_API_ID | Censys — ID API | https://search.censys.io/account/api |
CENSYS_API_SECRET | Censys — secreto API | https://search.censys.io/account/api |
ZOOMEYE_API_KEY | ZoomEye | https://www.zoomeye.org/profile |
FOFA_EMAIL | FOFA — correo de la cuenta | https://fofa.info |
FOFA_API_KEY | FOFA — clave API | https://fofa.info |
HUNTERHOW_API_KEY | Hunter.how | https://hunter.how |
NETLAS_API_KEY | Netlas | https://netlas.io |
LEAKIX_API_KEY | LeakIX | https://leakix.net |
CRIMINALIP_API_KEY | CriminalIP | https://www.criminalip.io |
BINARYEDGE_API_KEY | BinaryEdge | https://www.binaryedge.io |
WINDY_API_KEY | Windy Webcams | https://api.windy.com/keys |
ABUSEIPDB_API_KEY | AbuseIPDB (reputación IP) | https://www.abuseipdb.com/account/api |
ADSB_API_KEY | adsb.fi (opcional; funciona sin ella) | https://adsb.fi |
APRS_FI_KEY | APRS.fi (estaciones de radioaficionados) | https://aprs.fi/page/api_key |
GEMINI_API_KEY | Google Gemini (análisis IA) | https://aistudio.google.com/apikey |
| Variable | Predeterminado | Descripción |
|---|
GEMINI_MODEL | gemini-2.0-flash | Modelo Gemini usado para el análisis |
DATA_DIR | ./data | Directorio para conjuntos de datos GeoJSON/JSON locales |
FLASK_SECRET_KEY | aleatorio por ejecución | Secreto de sesión Flask; establece un valor fijo en producción |
| Endpoint | Propósito |
|---|
GET /nearby?lat=&lon=&mode= | Escaneo unificado RF/OSINT alrededor de un punto |
GET /api/cctv?lat=&lon= o ?country= | Descubrimiento de cámaras por ubicación o país |
GET /api/search?type=&query= | Búsqueda por SSID, IP, ubicación o país |
POST /api/analyze | Resumen IA de una lista de dispositivos |
GET /api/ip-intel?ip= | Inteligencia de amenazas IP de múltiples fuentes |
GET /api/adsb?lat=&lon=&radius= | Aeronaves en vivo + detección de emergencias |
GET /api/satellites?categories= | Posiciones satelitales (TLE + SGP4) |
GET /api/gps-jamming?lat=&lon= | Mapa de calor de interferencia GPS desde ADS-B |
GET /api/sdr/kiwisdr | Lista pública de receptores KiwiSDR |
GET /api/aprs/stations?lat=&lon= | Estaciones APRS cercanas |
GET/POST /api/watchlist | Gestionar identificadores rastreados |
POST /api/watchlist/check | Verificar una lista de dispositivos contra la lista de vigilancia |
GET /api/status · GET /api/debug | Salud de proveedores / diagnóstico de claves |