diff --git a/api/.env.example b/api/.env.example index 7384fb9..6812288 100644 --- a/api/.env.example +++ b/api/.env.example @@ -14,3 +14,10 @@ GOOGLE_REDIRECT_URI=https://resetea.net/api/gmail/callback # Puerto del servidor (por defecto 8787) PORT=8787 + +# Google Custom Search (egosurfing — opcional, mejora la calidad de resultados) +# 1. Ve a https://programmablesearchengine.google.com/ → crear motor +# 2. Activa "Buscar en toda la web" y copia el ID (cx) +# 3. En https://console.cloud.google.com/ activa "Custom Search API" y crea una API Key +GOOGLE_API_KEY= +GOOGLE_CSE_ID= diff --git a/api/app.js b/api/app.js index ff8cc68..e7cf081 100644 --- a/api/app.js +++ b/api/app.js @@ -6,8 +6,9 @@ const express = require('express'); const helmet = require('helmet'); const rateLimit = require('express-rate-limit'); -const eraseRoute = require('./routes/erase'); -const gmailOAuth = require('./routes/gmail_oauth'); +const eraseRoute = require('./routes/erase'); +const gmailOAuth = require('./routes/gmail_oauth'); +const egosearch = require('./routes/egosearch'); const app = express(); @@ -30,10 +31,18 @@ const emailLimit = rateLimit({ message: { error: 'Demasiadas solicitudes de envío. Espera antes de reintentar.' } }); +// ── Rate limits específicos ─────────────────────────────────────── +const searchLimit = rateLimit({ + windowMs: 60 * 1000, // 1 minuto + max: 8, + message: { error: 'Demasiadas búsquedas. Espera un momento.' } +}); + // ── Rutas ──────────────────────────────────────────────────────── -app.post('/api/erase', emailLimit, eraseRoute); -app.get('/api/gmail/auth', emailLimit, gmailOAuth.authInit); -app.get('/api/gmail/callback', gmailOAuth.authCallback); +app.post('/api/erase', emailLimit, eraseRoute); +app.get('/api/egosearch', searchLimit, egosearch); +app.get('/api/gmail/auth', emailLimit, gmailOAuth.authInit); +app.get('/api/gmail/callback', gmailOAuth.authCallback); // Health check app.get('/api/health', (req, res) => res.json({ status: 'ok' })); diff --git a/api/routes/egosearch.js b/api/routes/egosearch.js new file mode 100644 index 0000000..848cedf --- /dev/null +++ b/api/routes/egosearch.js @@ -0,0 +1,107 @@ +'use strict'; + +/* ── Instancias públicas SearXNG con JSON API (fallback si no hay Google CSE) ── */ +const SEARX_INSTANCES = [ + 'https://searx.be', + 'https://priv.au', + 'https://search.mdosch.de', + 'https://searxng.site', +]; + +async function searchSearX(instance, query) { + const url = `${instance}/search?` + new URLSearchParams({ + q: query, + format: 'json', + categories: 'general', + language: 'es-ES', + }); + + const res = await fetch(url, { + headers: { + 'User-Agent': 'resetea.net/1.0 (egosurfing privacy tool)', + 'Accept': 'application/json', + }, + signal: AbortSignal.timeout(7000), + }); + + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + return (data.results || []).map(r => ({ + title: r.title || '', + url: r.url || '', + snippet: r.content || '', + engine: r.engine || 'web', + })); +} + +async function searchGoogle(query) { + const url = 'https://www.googleapis.com/customsearch/v1?' + new URLSearchParams({ + key: process.env.GOOGLE_API_KEY, + cx: process.env.GOOGLE_CSE_ID, + q: query, + num: 10, + hl: 'es', + }); + + const res = await fetch(url, { signal: AbortSignal.timeout(7000) }); + if (!res.ok) { + const err = await res.json().catch(() => ({})); + throw new Error(err.error?.message || `HTTP ${res.status}`); + } + const data = await res.json(); + return (data.items || []).map(item => ({ + title: item.title || '', + url: item.link || '', + snippet: item.snippet || '', + engine: 'google', + })); +} + +function domainOf(rawUrl) { + try { return new URL(rawUrl).hostname.replace(/^www\./, ''); } + catch { return ''; } +} + +module.exports = async (req, res) => { + const { q } = req.query; + + if (!q || q.trim().length < 2) + return res.status(400).json({ error: 'Introduce al menos 2 caracteres.' }); + + if (q.trim().length > 300) + return res.status(400).json({ error: 'Búsqueda demasiado larga.' }); + + /* Si la query no tiene operadores especiales la ponemos entre comillas + para forzar coincidencia exacta (ideal para nombre/email/alias). */ + const query = /[:"()]/.test(q) ? q.trim() : `"${q.trim()}"`; + + let raw = []; + + try { + if (process.env.GOOGLE_API_KEY && process.env.GOOGLE_CSE_ID) { + raw = await searchGoogle(query); + } else { + for (const inst of SEARX_INSTANCES) { + try { + raw = await searchSearX(inst, query); + if (raw.length) break; + } catch (e) { + console.warn(`[egosearch] ${inst} falló:`, e.message); + } + } + } + } catch (e) { + console.error('[egosearch] error final:', e.message); + return res.status(502).json({ error: 'El servicio de búsqueda no está disponible ahora. Inténtalo de nuevo.' }); + } + + const results = raw.slice(0, 5).map(r => ({ + title: r.title, + url: r.url, + snippet: r.snippet, + domain: domainOf(r.url), + engine: r.engine, + })); + + res.json({ results, query, total: raw.length }); +}; diff --git a/public/egosurfing.html b/public/egosurfing.html index 1949941..80da54c 100644 --- a/public/egosurfing.html +++ b/public/egosurfing.html @@ -4,9 +4,296 @@ RESETEA.NET · Egosurfing - + + @@ -20,11 +307,10 @@
Privacidad sin custodios
- @@ -32,415 +318,342 @@
-
-
-
-

Egosurfing
Auditoría OSINT de tu huella.

-

- El objetivo no es “investigar a otros”, sino identificar tu exposición - (nombre, alias, email, teléfono, fotos, documentos, perfiles, directorios). - Con esto decides qué borrar, qué desindexar y qué blindar. -

+ +
+
+

Egosurfing

+

Descubre en qué páginas aparece tu información personal.

- - -
- Uso ético y seguro:
- Estas técnicas están pensadas para autocomprobación y - control de reputación. Evita búsquedas invasivas sobre terceros - y respeta términos de servicio y legislación. -
+
+ - -
-
-
-
4
-
Ejes
-
-
-
-
Pivotes
-
-
-
1
-
Meta
-
-
- -
    -
  • 1 Identificadores
  • -
  • 2 Perfiles
  • -
  • 3 Brokers/Indexadores
  • -
+
+ + + + +
+

Se busca entre comillas para coincidencia exacta.

-
+
+
-
-
-

Checklist de pivotes (tu “llavero” de búsqueda)

-

- Antes de buscar, define tus pivotes. Cada pivot debe probarse con y sin comillas, - con variantes y con contexto (ciudad, empresa, nickname, etc.). -

+ + -
-
-

Identificadores directos

-
-
-
-
-
+ +
+
+

Google dorking — haz clic para buscar

+

+ Introduce tus datos en el buscador de arriba y usa estas queries avanzadas. + Haz clic en "Buscar" para lanzarlas directamente. +

+ +
+ +
+

Nombre completo

+
+ "NOMBRE APELLIDOS" +
- -
-

Contexto útil

-
-
-
-
-
+
+ "NOMBRE" filetype:pdf +
- -
-

Metadatos y correlación

-
-
-
-
-
+
+ "NOMBRE" site:linkedin.com + +
+
+ "NOMBRE" site:facebook.com +
-
-
-
-
-

OSINT: buscadores, directorios y herramientas (orientado a autocomprobación)

-

- Lista práctica de recursos habituales. Algunas plataformas cambian o restringen acceso; - usa siempre canales oficiales y respeta ToS. -

- -
-
-

Directorios OSINT (curados)

-

- Catálogos amplios para navegar por categorías: redes, personas, imágenes, dominios, etc. -

-
-
- Abrir -
-
-
-
- Abrir -
-
-
-
- Abrir -
-
+
+

Email y teléfono

+
+ "EMAIL" +
- -
-

Enumeración de usernames

-

- Útil para saber si tu nick existe en otros sitios (reutilización de alias). -

-
-
- Abrir -
-
-
-
- Abrir -
-
-
-
- Abrir -
-
+
+ "EMAIL" -site:gmail.com +
- -
-

Emails, brechas y exposición

-

- Diagnóstico de filtraciones asociadas a tu email (si aplica, con cuidado). -

-
-
- Abrir -
-
-
-
- Abrir -
-
+
+ "TELEFONO" +
- -
-

Personas y perfiles públicos

-

- Búsqueda de perfiles públicos y menciones en la web abierta. -

-
-
- Abrir -
-
-
-
- Abrir -
-
-
- -
+
+ "TELEFONO" filetype:pdf +
- -
-

Imágenes y “reverse image search”

-

- Encuentra reusos de tus fotos/avatares o imágenes asociadas. -

-
-
- Abrir -
-
-
-
- Abrir -
-
-
-
- Abrir -
-
-
-
- Abrir -
-
-
- -
-

Repositorios y dev

-

- Exposición por commits, issues, gists y perfiles de desarrollador. -

-
-
- Buscar -
-
-
-
- Buscar -
-
-
- -
-
-
- -
-
-

Google dorking (orientado a privacidad y autodiagnóstico)

-

- Aquí solo incluimos consultas útiles para encontrar tu propia exposición - (perfiles, documentos públicos, menciones, duplicados, indexación). Evitamos queries - orientadas a vulnerabilidades o intrusión. -

- -
-
-

Base

-

Sustituye: NOMBRE, ALIAS, EMAIL, TEL.

-
-
-
-
-
- -
-

Documentos públicos

-

Detecta PDFs/Docs con tu nombre, CVs, listados, actas, etc.

-
-
-
-
-
- -
-

Perfiles en redes

-

Localiza perfiles y menciones públicas por dominio.

-
-
-
-
-
- -
-

Menciones y citas

-

Ideal para entrevistas, notas de prensa, eventos, ponencias.

-
-
-
-
- -
-

Fotos

-

Encuentra páginas donde tu imagen o nombre se asocia.

-
-
-
- -
-

Operadores útiles (legibles)

-

Combinables para refinar sin “modo intrusión”.

-
-
-
-
-
- -
-
-
- -
-
-

Terceros por vertical (dónde se generan “copias” de ti)

-

- Muchas veces tu exposición no viene “solo” de redes sociales. Viene de - terceros (proveedores, socios, analítica, brokers, agregadores, - directorios sectoriales) que crean perfiles y vínculos. -

- -
-
-

Redes sociales & AdTech

-

- Pixel/tags, SDKs en apps, conversion APIs, audiencias, lookalikes, atribución. - El identificador suele ser email/teléfono “hasheado” + device ID. -

-
-
-
-
- -
-

Salud & fitness

-

- Apps de salud, wearables, gimnasios, seguros, farmacias, nutrición. - Suelen acumular hábitos, ubicación, rutinas, y “metas” personales. -

-
-
-
-
- -
-

Bancos & pagos

-

- Datos regulados, pero existen “capas” alrededor: fintechs, pasarelas, - scoring, antifraude, comercios y programas de fidelización. -

-
-
-
-
- -
-

Comercio & e-commerce

-

- Direcciones, teléfonos, preferencias, devoluciones, reseñas, tickets. - Mucho se replica a marketing, logística y atención al cliente. -

-
-
-
-
- -
-

Deporte & eventos

-

- Entradas, acreditaciones, listas de participantes, fotos oficiales, - redes del evento, sponsors, plataformas de registro. -

-
-
-
-
- -
-

Data brokers / people search

-

- Agregan datos y los re-venden. Si tu objetivo es “desaparecer”, esta capa - suele requerir opt-outs repetidos y verificación. -

-
-
-
- -
-
-
- Nota operativa:
- Muchos brokers esconden las páginas de opt-out o las entierran en políticas. - Cuando estés listo para “Resetea”, conviene mantener un catálogo propio - de enlaces oficiales y plantillas. +
+

Usuario / alias

+
+ "ALIAS" site:twitter.com + +
+
+ "ALIAS" site:instagram.com + +
+
+ "ALIAS" site:reddit.com + +
+
+ "ALIAS" site:github.com + +
-
-
-
-
-

Resultado esperado del egosurfing

-

- Al finalizar, deberías tener una lista simple: - (1) dónde apareces, (2) qué identificador lo vincula, - (3) si es origen o copia, (4) la acción - (borrar en origen, solicitar supresión, desindexar, o dejar). -

-

- Cuando quieras, convertimos este diagnóstico en un flujo “Resetea” por pasos - (sin automatización peligrosa, con seguridad por defecto). -

-
+
+
+ + +
+
+

Herramientas complementarias

+
+ +
+

Brechas y email

+
+ + +
+
+ + +
+
+ +
+

Usernames

+
+ + +
+
+ + +
+
+ +
+

Imágenes

+
+ + +
+
+ + +
+
+ +
+

Desindexación

+
+ + +
+
+ + +
+
+ +
+
+
+ +