UI: panel horizontal con tabs + OSINT dorking profesional (95 dorks)
- index.html: sustituye grid de bloques por 6 tabs horizontales (Cuentas base / Redes sociales / Mensajería / Streaming / Buscadores / Data brokers) con items como tarjetas en grid responsive - egosurfing.html: dorking expandido de 12 dorks a ~95 organizados en 10 categorías OSINT profesionales (nombre, email, teléfono, alias, data brokers, pastes/brechas, registros oficiales, perfil profesional, geolocalización, archivo histórico) con sistema de tabs dinámico - erase.js: límites de longitud en campos opcionales (nickname 100, phone 30, address 300, extra 500) + type-check explícito en email Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
0ca9203522
commit
b5ae0ceb29
4 changed files with 479 additions and 166 deletions
|
|
@ -12,6 +12,7 @@ const egosearch = require('./routes/egosearch');
|
|||
|
||||
const app = express();
|
||||
|
||||
app.set('trust proxy', 1); // confía en nginx para obtener la IP real del cliente
|
||||
app.disable('x-powered-by');
|
||||
app.use(helmet());
|
||||
app.use(express.json({ limit: '10kb' }));
|
||||
|
|
|
|||
|
|
@ -7,7 +7,9 @@ const ALLOWED_PROVIDERS = new Set(Object.keys(PROVIDER_DATA));
|
|||
|
||||
module.exports = async (req, res) => {
|
||||
try {
|
||||
const { provider, email, nickname, phone, address, extra } = req.body;
|
||||
const { provider, email,
|
||||
nickname: rawNick, phone: rawPhone,
|
||||
address: rawAddr, extra: rawExtra } = req.body;
|
||||
|
||||
// Validación mínima
|
||||
if (!provider || !email) {
|
||||
|
|
@ -20,10 +22,16 @@ module.exports = async (req, res) => {
|
|||
}
|
||||
|
||||
// Validación básica de email
|
||||
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
||||
if (typeof email !== 'string' || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
||||
return res.status(400).json({ error: 'Email inválido' });
|
||||
}
|
||||
|
||||
// Límites de longitud en campos opcionales (defensa en profundidad)
|
||||
const nickname = String(rawNick || '').slice(0, 100).trim();
|
||||
const phone = String(rawPhone || '').slice(0, 30).trim();
|
||||
const address = String(rawAddr || '').slice(0, 300).trim();
|
||||
const extra = String(rawExtra || '').slice(0, 500).trim();
|
||||
|
||||
// Hash irreversible para referencia (auditoría sin almacenar PII)
|
||||
const hash = crypto
|
||||
.createHash('sha256')
|
||||
|
|
|
|||
|
|
@ -240,54 +240,119 @@
|
|||
}
|
||||
@keyframes spin { to { transform: rotate(360deg); } }
|
||||
|
||||
/* ── Modos de búsqueda predefinidos ── */
|
||||
.dork-section { padding: 2.5rem 0; }
|
||||
.dork-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; margin-top: 1.5rem; }
|
||||
.dork-card {
|
||||
/* ── OSINT Dorking panel ── */
|
||||
.dork-section { padding: 2.5rem 0 3rem; }
|
||||
.dork-tip {
|
||||
font-size: 0.82rem;
|
||||
color: var(--muted);
|
||||
background: var(--caoba-lt);
|
||||
border-left: 3px solid var(--caoba);
|
||||
padding: 0.55rem 1rem;
|
||||
border-radius: 0 8px 8px 0;
|
||||
margin-top: 0.9rem;
|
||||
}
|
||||
/* Tabs de categoría */
|
||||
.dork-tabs {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.3rem;
|
||||
border-bottom: 2px solid var(--border);
|
||||
padding-bottom: 0;
|
||||
margin: 1.2rem 0 0;
|
||||
}
|
||||
.dtab {
|
||||
padding: 0.45rem 0.85rem;
|
||||
border: 1px solid transparent;
|
||||
border-bottom: none;
|
||||
border-radius: 7px 7px 0 0;
|
||||
background: none;
|
||||
color: var(--muted);
|
||||
font-size: 0.75rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 120ms ease;
|
||||
font-family: system-ui, sans-serif;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
bottom: -2px;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
.dtab:hover { background: var(--surface2); color: var(--text); }
|
||||
.dtab.active {
|
||||
background: var(--surface2);
|
||||
border-color: var(--border);
|
||||
border-bottom-color: var(--surface2);
|
||||
color: var(--caoba);
|
||||
}
|
||||
/* Grid de dorks */
|
||||
.dork-pane { display: none; padding-top: 1.1rem; }
|
||||
.dork-pane.active { display: block; }
|
||||
.dork-items {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(310px, 1fr));
|
||||
gap: 0.55rem;
|
||||
}
|
||||
.dork-item {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr auto;
|
||||
grid-template-rows: auto auto;
|
||||
gap: 0.2rem 0.5rem;
|
||||
padding: 0.6rem 0.8rem;
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
padding: 1.1rem 1.2rem;
|
||||
border-radius: 9px;
|
||||
box-shadow: var(--shadow-sm);
|
||||
transition: box-shadow 150ms ease, border-color 150ms ease;
|
||||
}
|
||||
.dork-card h3 { font-size: 1rem; margin-bottom: 0.6rem; }
|
||||
.dork-query {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 0.5rem;
|
||||
padding: 0.35rem 0;
|
||||
border-bottom: 1px solid var(--surface2);
|
||||
font-size: 0.82rem;
|
||||
.dork-item:hover { box-shadow: var(--shadow-md); border-color: var(--border-dark); }
|
||||
.dork-item-desc {
|
||||
font-size: 0.76rem;
|
||||
color: var(--text);
|
||||
font-weight: 600;
|
||||
grid-column: 1;
|
||||
grid-row: 1;
|
||||
align-self: center;
|
||||
}
|
||||
.dork-query:last-child { border-bottom: none; }
|
||||
.dork-query code {
|
||||
.dork-item-query {
|
||||
font-family: 'Courier New', monospace;
|
||||
font-size: 0.78rem;
|
||||
font-size: 0.72rem;
|
||||
color: var(--caoba);
|
||||
background: var(--caoba-lt);
|
||||
padding: 0.1rem 0.35rem;
|
||||
padding: 0.12rem 0.4rem;
|
||||
border-radius: 4px;
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
grid-column: 1;
|
||||
grid-row: 2;
|
||||
display: block;
|
||||
}
|
||||
.dork-run {
|
||||
.dork-run-btn {
|
||||
grid-column: 2;
|
||||
grid-row: 1 / 3;
|
||||
align-self: center;
|
||||
padding: 0.3rem 0.7rem;
|
||||
border-radius: 6px;
|
||||
border: 1px solid var(--border);
|
||||
background: var(--surface2);
|
||||
color: var(--muted);
|
||||
font-size: 0.72rem;
|
||||
font-weight: 600;
|
||||
color: var(--muted);
|
||||
cursor: pointer;
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0.2rem 0.4rem;
|
||||
border-radius: 4px;
|
||||
white-space: nowrap;
|
||||
transition: all 120ms ease;
|
||||
flex-shrink: 0;
|
||||
font-family: system-ui, sans-serif;
|
||||
}
|
||||
.dork-run:hover { background: var(--surface2); color: var(--text); }
|
||||
.dork-run-btn:hover {
|
||||
background: var(--caoba-lt);
|
||||
border-color: var(--caoba);
|
||||
color: var(--caoba);
|
||||
}
|
||||
|
||||
@media (max-width: 720px) {
|
||||
.dork-grid { grid-template-columns: 1fr; }
|
||||
.dork-items { grid-template-columns: 1fr; }
|
||||
.dork-tabs { gap: 0.2rem; }
|
||||
.dtab { font-size: 0.68rem; padding: 0.35rem 0.6rem; }
|
||||
.results-header { flex-direction: column; gap: 0.4rem; }
|
||||
}
|
||||
@media (max-width: 540px) {
|
||||
|
|
@ -354,78 +419,20 @@
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ══ GOOGLE DORKING RÁPIDO ════════════════════════════════════ -->
|
||||
<!-- ══ OSINT DORKING PROFESIONAL ════════════════════════════════ -->
|
||||
<section class="dork-section info" id="dorking">
|
||||
<div class="container">
|
||||
<h2>Google dorking — haz clic para buscar</h2>
|
||||
<h2>OSINT dorking avanzado</h2>
|
||||
<p class="section-desc">
|
||||
Introduce tus datos en el buscador de arriba y usa estas queries avanzadas.
|
||||
Haz clic en "Buscar" para lanzarlas directamente.
|
||||
Queries profesionales organizadas por categoría. Escribe tu dato en el buscador
|
||||
y lanza cualquier query directamente. Los placeholders se sustituyen con tu input.
|
||||
</p>
|
||||
|
||||
<div class="dork-grid">
|
||||
|
||||
<div class="dork-card">
|
||||
<h3>Nombre completo</h3>
|
||||
<div class="dork-query">
|
||||
<code>"NOMBRE APELLIDOS"</code>
|
||||
<button class="dork-run" data-template='"NOMBRE APELLIDOS"'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"NOMBRE" filetype:pdf</code>
|
||||
<button class="dork-run" data-template='"NOMBRE" filetype:pdf'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"NOMBRE" site:linkedin.com</code>
|
||||
<button class="dork-run" data-template='"NOMBRE" site:linkedin.com'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"NOMBRE" site:facebook.com</code>
|
||||
<button class="dork-run" data-template='"NOMBRE" site:facebook.com'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-tip">
|
||||
Escribe tu nombre, email, alias o teléfono en el buscador de arriba antes de lanzar un dork.
|
||||
</div>
|
||||
|
||||
<div class="dork-card">
|
||||
<h3>Email y teléfono</h3>
|
||||
<div class="dork-query">
|
||||
<code>"EMAIL"</code>
|
||||
<button class="dork-run" data-template='"EMAIL"'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"EMAIL" -site:gmail.com</code>
|
||||
<button class="dork-run" data-template='"EMAIL" -site:gmail.com'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"TELEFONO"</code>
|
||||
<button class="dork-run" data-template='"TELEFONO"'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"TELEFONO" filetype:pdf</code>
|
||||
<button class="dork-run" data-template='"TELEFONO" filetype:pdf'>Buscar</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dork-card">
|
||||
<h3>Usuario / alias</h3>
|
||||
<div class="dork-query">
|
||||
<code>"ALIAS" site:twitter.com</code>
|
||||
<button class="dork-run" data-template='"ALIAS" site:twitter.com'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"ALIAS" site:instagram.com</code>
|
||||
<button class="dork-run" data-template='"ALIAS" site:instagram.com'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"ALIAS" site:reddit.com</code>
|
||||
<button class="dork-run" data-template='"ALIAS" site:reddit.com'>Buscar</button>
|
||||
</div>
|
||||
<div class="dork-query">
|
||||
<code>"ALIAS" site:github.com</code>
|
||||
<button class="dork-run" data-template='"ALIAS" site:github.com'>Buscar</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="dork-tabs" id="dork-tabs"></div>
|
||||
<div id="dork-panes"></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
|
@ -530,28 +537,215 @@ modeBtns.forEach(btn => {
|
|||
egoInput.addEventListener('keydown', e => { if (e.key === 'Enter') doSearch(); });
|
||||
egoBtn.addEventListener('click', doSearch);
|
||||
|
||||
/* ── Dorking rápido ─────────────────────────────────────────── */
|
||||
document.querySelectorAll('.dork-run').forEach(btn => {
|
||||
btn.addEventListener('click', () => {
|
||||
/* ── OSINT Dorking — categorías ──────────────────────────────── */
|
||||
const DORK_CATEGORIES = [
|
||||
{
|
||||
id: 'nombre', label: 'Nombre',
|
||||
dorks: [
|
||||
{ desc: 'Coincidencia exacta', tpl: '"NOMBRE APELLIDOS"' },
|
||||
{ desc: 'Documentos PDF', tpl: '"NOMBRE APELLIDOS" filetype:pdf' },
|
||||
{ desc: 'Documentos Word', tpl: '"NOMBRE APELLIDOS" filetype:doc OR filetype:docx' },
|
||||
{ desc: 'Hojas de cálculo', tpl: '"NOMBRE APELLIDOS" filetype:xls OR filetype:xlsx OR filetype:csv' },
|
||||
{ desc: 'Currículum / CV', tpl: '"NOMBRE APELLIDOS" (curriculum OR resume OR CV) filetype:pdf' },
|
||||
{ desc: 'LinkedIn', tpl: '"NOMBRE APELLIDOS" site:linkedin.com' },
|
||||
{ desc: 'Facebook', tpl: '"NOMBRE APELLIDOS" site:facebook.com' },
|
||||
{ desc: 'Instagram', tpl: '"NOMBRE APELLIDOS" site:instagram.com' },
|
||||
{ desc: 'X / Twitter', tpl: '"NOMBRE APELLIDOS" site:x.com OR site:twitter.com' },
|
||||
{ desc: 'Actas y registros públicos', tpl: '"NOMBRE APELLIDOS" (acta OR padrón OR registro OR certificado)' },
|
||||
{ desc: 'Noticias y prensa', tpl: '"NOMBRE APELLIDOS" (noticia OR periódico OR diario OR prensa)' },
|
||||
{ desc: 'Foros y comunidades', tpl: '"NOMBRE APELLIDOS" (foro OR opinión OR comentario OR review)' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'email', label: 'Email',
|
||||
dorks: [
|
||||
{ desc: 'Exposición directa', tpl: '"EMAIL"' },
|
||||
{ desc: 'Excluir webmail oficial', tpl: '"EMAIL" -site:gmail.com -site:outlook.com -site:yahoo.com' },
|
||||
{ desc: 'En documentos PDF', tpl: '"EMAIL" filetype:pdf' },
|
||||
{ desc: 'En bases de datos expuestas', tpl: '"EMAIL" filetype:sql OR filetype:txt OR filetype:log' },
|
||||
{ desc: 'En Pastebin', tpl: '"EMAIL" site:pastebin.com' },
|
||||
{ desc: 'En código fuente (GitHub)', tpl: '"EMAIL" site:github.com' },
|
||||
{ desc: 'En Reddit / foros', tpl: '"EMAIL" site:reddit.com OR site:forocoches.com' },
|
||||
{ desc: 'Brechas y filtraciones', tpl: '"EMAIL" (breach OR leak OR dump OR filtración OR hack)' },
|
||||
{ desc: 'Registros corporativos', tpl: '"EMAIL" (empresa OR DPO OR privacidad OR contacto OR directorio)' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'telefono', label: 'Teléfono',
|
||||
dorks: [
|
||||
{ desc: 'Número exacto', tpl: '"TELEFONO"' },
|
||||
{ desc: 'Directorios españoles', tpl: '"TELEFONO" site:paginas-amarillas.es OR site:11888.es OR site:axesor.es' },
|
||||
{ desc: 'En documentos PDF', tpl: '"TELEFONO" filetype:pdf' },
|
||||
{ desc: 'Vinculado a WhatsApp', tpl: '"TELEFONO" (WhatsApp OR wa.me OR chat)' },
|
||||
{ desc: 'Vinculado a Telegram', tpl: '"TELEFONO" (Telegram OR t.me)' },
|
||||
{ desc: 'Anuncios y clasificados', tpl: '"TELEFONO" site:milanuncios.com OR site:wallapop.com OR site:vibbo.com' },
|
||||
{ desc: 'Registros de empresa', tpl: '"TELEFONO" (empresa OR autónomo OR contacto OR DPO)' },
|
||||
{ desc: 'Reportes de fraude', tpl: '"TELEFONO" (fraude OR estafa OR scam OR spam OR phishing)' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'alias', label: 'Usuario / Alias',
|
||||
dorks: [
|
||||
{ desc: 'X / Twitter', tpl: '"ALIAS" site:x.com OR site:twitter.com' },
|
||||
{ desc: 'Instagram', tpl: '"ALIAS" site:instagram.com' },
|
||||
{ desc: 'Reddit', tpl: '"ALIAS" site:reddit.com' },
|
||||
{ desc: 'GitHub', tpl: '"ALIAS" site:github.com' },
|
||||
{ desc: 'Twitch', tpl: '"ALIAS" site:twitch.tv' },
|
||||
{ desc: 'YouTube', tpl: '"ALIAS" site:youtube.com' },
|
||||
{ desc: 'TikTok', tpl: '"ALIAS" site:tiktok.com' },
|
||||
{ desc: 'Discord (servidores públicos)',tpl: '"ALIAS" site:discord.com OR site:discord.gg' },
|
||||
{ desc: 'Steam', tpl: '"ALIAS" site:steamcommunity.com' },
|
||||
{ desc: 'Mastodon / Fediverse', tpl: '"ALIAS" site:mastodon.social OR inurl:"/@ALIAS"' },
|
||||
{ desc: 'Foros y comunidades', tpl: '"ALIAS" (foro OR forum OR usuario OR member OR miembro)' },
|
||||
{ desc: 'LinkedIn', tpl: '"ALIAS" site:linkedin.com' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'brokers', label: 'Data brokers',
|
||||
dorks: [
|
||||
{ desc: 'Spokeo', tpl: '"NOMBRE APELLIDOS" site:spokeo.com' },
|
||||
{ desc: 'Whitepages', tpl: '"NOMBRE APELLIDOS" site:whitepages.com' },
|
||||
{ desc: 'Pipl', tpl: '"NOMBRE APELLIDOS" site:pipl.com' },
|
||||
{ desc: '192.com', tpl: '"NOMBRE APELLIDOS" site:192.com' },
|
||||
{ desc: 'Intelius', tpl: '"NOMBRE APELLIDOS" site:intelius.com' },
|
||||
{ desc: 'Radaris', tpl: '"NOMBRE APELLIDOS" site:radaris.com' },
|
||||
{ desc: 'PeekYou', tpl: '"NOMBRE APELLIDOS" site:peekyou.com' },
|
||||
{ desc: 'BeenVerified', tpl: '"NOMBRE APELLIDOS" site:beenverified.com' },
|
||||
{ desc: 'TruthFinder', tpl: '"NOMBRE APELLIDOS" site:truthfinder.com' },
|
||||
{ desc: 'Directorios españoles', tpl: '"NOMBRE APELLIDOS" site:paginas-blancas.es OR site:11811.es' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'pastes', label: 'Pastes / Brechas',
|
||||
dorks: [
|
||||
{ desc: 'Email en Pastebin', tpl: '"EMAIL" site:pastebin.com' },
|
||||
{ desc: 'Nombre en Pastebin', tpl: '"NOMBRE APELLIDOS" site:pastebin.com' },
|
||||
{ desc: 'Servicios de paste alt.', tpl: '"EMAIL" site:justpaste.it OR site:rentry.co OR site:ghostbin.com' },
|
||||
{ desc: 'SQL dumps expuestos', tpl: '"EMAIL" filetype:sql (INSERT OR dump OR database OR table)' },
|
||||
{ desc: 'Credenciales expuestas', tpl: '"EMAIL" (password OR passwd OR contraseña OR hash OR credential)' },
|
||||
{ desc: 'Logs de acceso expuestos', tpl: '"EMAIL" filetype:log (login OR access OR auth OR failed)' },
|
||||
{ desc: 'Ficheros de texto con datos', tpl: '"EMAIL" filetype:txt (username OR user OR email OR password)' },
|
||||
{ desc: 'Nombre en filtraciones', tpl: '"NOMBRE APELLIDOS" (filtración OR brecha OR RGPD OR datos personales)' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'registros', label: 'Registros oficiales',
|
||||
dorks: [
|
||||
{ desc: 'BOE (España)', tpl: '"NOMBRE APELLIDOS" site:boe.es' },
|
||||
{ desc: 'BORME — Registro Mercantil', tpl: '"NOMBRE APELLIDOS" site:boe.es/borme' },
|
||||
{ desc: 'Registradores.org', tpl: '"NOMBRE APELLIDOS" site:registradores.org' },
|
||||
{ desc: 'AEAT — Agencia Tributaria', tpl: '"NOMBRE APELLIDOS" site:agenciatributaria.gob.es' },
|
||||
{ desc: 'Actos administrativos', tpl: '"NOMBRE APELLIDOS" (acto administrativo OR notificación OR resolución OR sanción)' },
|
||||
{ desc: 'Organismos públicos', tpl: '"NOMBRE APELLIDOS" site:.gob.es OR site:.gov.es' },
|
||||
{ desc: 'Donaciones y financiación', tpl: '"NOMBRE APELLIDOS" (donante OR donación OR financiación OR partido político)' },
|
||||
{ desc: 'Catastro y propiedades', tpl: '"NOMBRE APELLIDOS" (catastro OR propiedad OR inmueble OR hipoteca OR finca)' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'profesional', label: 'Perfil profesional',
|
||||
dorks: [
|
||||
{ desc: 'LinkedIn — perfil', tpl: '"NOMBRE APELLIDOS" site:linkedin.com/in' },
|
||||
{ desc: 'CV y portfolio online', tpl: '"NOMBRE APELLIDOS" (curriculum OR CV OR portfolio OR resume) site:.es' },
|
||||
{ desc: 'Publicaciones académicas', tpl: '"NOMBRE APELLIDOS" site:researchgate.net OR site:academia.edu' },
|
||||
{ desc: 'Google Scholar', tpl: '"NOMBRE APELLIDOS" site:scholar.google.com' },
|
||||
{ desc: 'Ponencias y conferencias', tpl: '"NOMBRE APELLIDOS" (ponencia OR conferencia OR speaker OR charla)' },
|
||||
{ desc: 'Cargo directivo', tpl: '"NOMBRE APELLIDOS" (CEO OR director OR administrador OR socio OR gerente)' },
|
||||
{ desc: 'Menciones en medios', tpl: '"NOMBRE APELLIDOS" (entrevista OR declaraciones OR portavoz)' },
|
||||
{ desc: 'GitHub / proyectos técnicos', tpl: '"NOMBRE APELLIDOS" site:github.com OR site:gitlab.com' },
|
||||
{ desc: 'Stack Overflow', tpl: '"NOMBRE APELLIDOS" site:stackoverflow.com OR site:stackexchange.com' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'geo', label: 'Geolocalización',
|
||||
dorks: [
|
||||
{ desc: 'Check-ins y ubicaciones', tpl: '"ALIAS" (check-in OR checkin OR ubicación OR location OR foursquare)' },
|
||||
{ desc: 'Dirección en documentos', tpl: '"NOMBRE APELLIDOS" (calle OR dirección OR address OR código postal)' },
|
||||
{ desc: 'Reseñas en Google Maps', tpl: '"NOMBRE APELLIDOS" (reseña OR review) site:maps.google.com' },
|
||||
{ desc: 'Airbnb / alojamiento', tpl: '"NOMBRE APELLIDOS" site:airbnb.es OR (anfitrión OR host "NOMBRE APELLIDOS")' },
|
||||
{ desc: 'Inmuebles y propiedades', tpl: '"NOMBRE APELLIDOS" (venta OR alquiler OR inmueble OR piso OR local)' },
|
||||
{ desc: 'Fotos con geotag (Flickr)', tpl: '"ALIAS" site:flickr.com (geo OR location OR map OR GPS)' },
|
||||
{ desc: 'Marcadores sociales', tpl: '"ALIAS" (foursquare OR swarm OR yelp OR tripadvisor)' },
|
||||
]
|
||||
},
|
||||
{
|
||||
id: 'archivo', label: 'Archivo histórico',
|
||||
dorks: [
|
||||
{ desc: 'Wayback Machine — nombre', tpl: 'site:web.archive.org "NOMBRE APELLIDOS"' },
|
||||
{ desc: 'Wayback Machine — email', tpl: 'site:web.archive.org "EMAIL"' },
|
||||
{ desc: 'Caché de buscadores', tpl: 'cache:"NOMBRE APELLIDOS"' },
|
||||
{ desc: 'Contenido eliminado', tpl: '"NOMBRE APELLIDOS" (eliminado OR borrado OR deactivated OR removed)' },
|
||||
{ desc: 'Menciones anteriores a 2020', tpl: '"NOMBRE APELLIDOS" before:2020-01-01' },
|
||||
{ desc: 'Alias en URL de perfil', tpl: 'inurl:"ALIAS" (about OR bio OR perfil OR contacto OR me)' },
|
||||
{ desc: 'Página personal / about', tpl: '"NOMBRE APELLIDOS" inurl:about OR inurl:bio OR inurl:me' },
|
||||
{ desc: 'Dominio propio', tpl: 'site:"ALIAS".com OR site:"ALIAS".es OR site:"ALIAS".net' },
|
||||
]
|
||||
},
|
||||
];
|
||||
|
||||
/* ── Renderizar tabs y panes ─────────────────────────────────── */
|
||||
(function initDorks() {
|
||||
const tabsEl = document.getElementById('dork-tabs');
|
||||
const panesEl = document.getElementById('dork-panes');
|
||||
|
||||
DORK_CATEGORIES.forEach((cat, i) => {
|
||||
/* Tab */
|
||||
const tab = document.createElement('button');
|
||||
tab.className = 'dtab' + (i === 0 ? ' active' : '');
|
||||
tab.textContent = cat.label;
|
||||
tab.dataset.cat = i;
|
||||
tabsEl.appendChild(tab);
|
||||
|
||||
/* Pane */
|
||||
const pane = document.createElement('div');
|
||||
pane.className = 'dork-pane' + (i === 0 ? ' active' : '');
|
||||
pane.id = 'dpane-' + i;
|
||||
|
||||
const grid = document.createElement('div');
|
||||
grid.className = 'dork-items';
|
||||
|
||||
cat.dorks.forEach(d => {
|
||||
const item = document.createElement('div');
|
||||
item.className = 'dork-item';
|
||||
item.innerHTML = `
|
||||
<span class="dork-item-desc">${esc(d.desc)}</span>
|
||||
<code class="dork-item-query">${esc(d.tpl)}</code>
|
||||
<button class="dork-run-btn" data-template="${esc(d.tpl)}">Buscar</button>`;
|
||||
grid.appendChild(item);
|
||||
});
|
||||
|
||||
pane.appendChild(grid);
|
||||
panesEl.appendChild(pane);
|
||||
});
|
||||
|
||||
/* Tab switching */
|
||||
tabsEl.addEventListener('click', e => {
|
||||
const tab = e.target.closest('.dtab');
|
||||
if (!tab) return;
|
||||
document.querySelectorAll('.dtab').forEach(t => t.classList.remove('active'));
|
||||
document.querySelectorAll('.dork-pane').forEach(p => p.classList.remove('active'));
|
||||
tab.classList.add('active');
|
||||
document.getElementById('dpane-' + tab.dataset.cat).classList.add('active');
|
||||
});
|
||||
|
||||
/* Lanzar dork al hacer clic en Buscar */
|
||||
panesEl.addEventListener('click', e => {
|
||||
const btn = e.target.closest('.dork-run-btn');
|
||||
if (!btn) return;
|
||||
const val = egoInput.value.trim();
|
||||
if (!val) { egoInput.focus(); egoInput.placeholder = '← Primero introduce tu dato aquí'; return; }
|
||||
|
||||
/* Rellena el template con el valor del input */
|
||||
const template = btn.dataset.template;
|
||||
const query = template
|
||||
.replace('NOMBRE APELLIDOS', val)
|
||||
.replace('NOMBRE', val)
|
||||
.replace('ALIAS', val)
|
||||
.replace('EMAIL', val)
|
||||
.replace('TELEFONO', val);
|
||||
|
||||
if (!val) { egoInput.focus(); egoInput.setAttribute('placeholder', '← Introduce tu dato primero'); return; }
|
||||
const query = btn.dataset.template
|
||||
.replace(/NOMBRE APELLIDOS/g, val)
|
||||
.replace(/NOMBRE/g, val)
|
||||
.replace(/ALIAS/g, val)
|
||||
.replace(/EMAIL/g, val)
|
||||
.replace(/TELEFONO/g, val);
|
||||
egoInput.value = query;
|
||||
currentMode = 'libre';
|
||||
modeBtns.forEach(b => b.classList.toggle('active', b.dataset.mode === 'libre'));
|
||||
modeHint.textContent = MODES.libre.hint;
|
||||
doSearch();
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
||||
/* ── Búsqueda ───────────────────────────────────────────────── */
|
||||
async function doSearch() {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,92 @@
|
|||
<meta name="description"
|
||||
content="Envía cartas GDPR y elimina tus datos de redes sociales, buscadores y data brokers. Sin guardar información. Enlace oficiales y textos RGPD.">
|
||||
<link rel="stylesheet" href="index.css">
|
||||
<style>
|
||||
/* ── Panel tabs ── */
|
||||
.ptabs-nav {
|
||||
display: flex;
|
||||
gap: 0.3rem;
|
||||
border-bottom: 2px solid var(--border);
|
||||
padding-bottom: 0;
|
||||
flex-wrap: wrap;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.ptab {
|
||||
padding: 0.5rem 1.05rem;
|
||||
border: 1px solid transparent;
|
||||
border-bottom: none;
|
||||
border-radius: 8px 8px 0 0;
|
||||
background: none;
|
||||
color: var(--muted);
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 120ms ease;
|
||||
font-family: system-ui, sans-serif;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
bottom: -2px;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
.ptab:hover { background: var(--surface2); color: var(--text); }
|
||||
.ptab.active {
|
||||
background: var(--bg);
|
||||
border-color: var(--border);
|
||||
border-bottom-color: var(--bg);
|
||||
color: var(--caoba);
|
||||
}
|
||||
.ptab-pane { display: none; padding-top: 1.4rem; }
|
||||
.ptab-pane.active { display: block; }
|
||||
|
||||
/* ── Items como grid horizontal de tarjetas ── */
|
||||
.pitem-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(235px, 1fr));
|
||||
gap: 0.85rem;
|
||||
}
|
||||
.pitem-card {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
padding: 0.9rem 1rem;
|
||||
box-shadow: var(--shadow-sm);
|
||||
transition: box-shadow 180ms ease, transform 180ms ease;
|
||||
}
|
||||
.pitem-card:hover {
|
||||
box-shadow: var(--shadow-md);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.pitem-card label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.45rem;
|
||||
cursor: pointer;
|
||||
font-size: 0.88rem;
|
||||
font-weight: 600;
|
||||
color: var(--text);
|
||||
margin-bottom: 0.55rem;
|
||||
}
|
||||
.pitem-card label input[type="checkbox"] {
|
||||
accent-color: var(--caoba);
|
||||
width: 15px; height: 15px;
|
||||
flex-shrink: 0; cursor: pointer;
|
||||
}
|
||||
.pitem-card label:has(input:checked) {
|
||||
text-decoration: line-through;
|
||||
color: var(--subtle);
|
||||
}
|
||||
.pitem-card .actions {
|
||||
margin-left: 1.4rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.pitem-grid { grid-template-columns: 1fr 1fr; }
|
||||
}
|
||||
@media (max-width: 420px) {
|
||||
.pitem-grid { grid-template-columns: 1fr; }
|
||||
.ptab { font-size: 0.72rem; padding: 0.4rem 0.7rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
|
@ -119,13 +205,21 @@
|
|||
<div class="progress-bar"><div class="progress-fill" id="progress-fill" style="width:0%"></div></div>
|
||||
<div class="progress-label" style="margin-bottom:2rem"><span id="progress-text">0 acciones completadas</span></div>
|
||||
|
||||
<div class="grid">
|
||||
<!-- ── Navegación por tabs ── -->
|
||||
<div class="ptabs-nav">
|
||||
<button class="ptab active" data-tab="cuentas">Cuentas base</button>
|
||||
<button class="ptab" data-tab="redes">Redes sociales</button>
|
||||
<button class="ptab" data-tab="mensajeria">Mensajería</button>
|
||||
<button class="ptab" data-tab="streaming">Streaming</button>
|
||||
<button class="ptab" data-tab="buscadores">Buscadores</button>
|
||||
<button class="ptab" data-tab="brokers">Data brokers</button>
|
||||
</div>
|
||||
|
||||
<!-- ── CUENTAS BASE ── -->
|
||||
<div class="group">
|
||||
<h3>Cuentas base</h3>
|
||||
<!-- ── Contenido de cada tab ── -->
|
||||
<div id="ptab-cuentas" class="ptab-pane active">
|
||||
<div class="pitem-grid">
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Google</label>
|
||||
<div class="actions">
|
||||
<a href="https://myaccount.google.com/data-and-privacy" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -134,7 +228,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Microsoft / Outlook</label>
|
||||
<div class="actions">
|
||||
<a href="https://account.microsoft.com/account/privacy" target="_blank" rel="noopener">Privacidad</a>
|
||||
|
|
@ -143,7 +237,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Apple ID</label>
|
||||
<div class="actions">
|
||||
<a href="https://privacy.apple.com/" target="_blank" rel="noopener">Portal privacidad</a>
|
||||
|
|
@ -152,7 +246,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Amazon</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.amazon.es/gp/help/customer/display.html?nodeId=GX7NJQ4ZB8MHFRNJ" target="_blank" rel="noopener">Política privacidad</a>
|
||||
|
|
@ -160,13 +254,14 @@
|
|||
<a href="plantillas.html" target="_blank">Carta GDPR</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── REDES SOCIALES ── -->
|
||||
<div class="group">
|
||||
<h3>Redes sociales</h3>
|
||||
<div id="ptab-redes" class="ptab-pane">
|
||||
<div class="pitem-grid">
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Instagram</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.instagram.com/download/request/" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -175,7 +270,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Facebook</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.facebook.com/dyi/" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -184,7 +279,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> X / Twitter</label>
|
||||
<div class="actions">
|
||||
<a href="https://x.com/settings/download_your_data" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -193,7 +288,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> LinkedIn</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.linkedin.com/mypreferences/d/data-export" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -202,7 +297,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> TikTok</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.tiktok.com/setting/privacy?settingPage=privacy" target="_blank" rel="noopener">Privacidad</a>
|
||||
|
|
@ -211,7 +306,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Snapchat</label>
|
||||
<div class="actions">
|
||||
<a href="https://accounts.snapchat.com/accounts/downloadmydata" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -220,7 +315,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Pinterest</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.pinterest.es/settings/privacy/" target="_blank" rel="noopener">Privacidad</a>
|
||||
|
|
@ -228,7 +323,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Reddit</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.reddit.com/settings/data-request" target="_blank" rel="noopener">Descarga datos</a>
|
||||
|
|
@ -237,7 +332,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Discord</label>
|
||||
<div class="actions">
|
||||
<a href="https://discord.com/privacy" target="_blank" rel="noopener">Privacidad</a>
|
||||
|
|
@ -245,13 +340,14 @@
|
|||
<a href="plantillas.html" target="_blank">Carta GDPR</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── MENSAJERÍA ── -->
|
||||
<div class="group">
|
||||
<h3>Mensajería</h3>
|
||||
<div id="ptab-mensajeria" class="ptab-pane">
|
||||
<div class="pitem-grid">
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> WhatsApp</label>
|
||||
<div class="actions">
|
||||
<a href="https://faq.whatsapp.com/1180414079177245" target="_blank" rel="noopener">Solicitar datos</a>
|
||||
|
|
@ -259,7 +355,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Telegram</label>
|
||||
<div class="actions">
|
||||
<a href="https://my.telegram.org/auth" target="_blank" rel="noopener">Eliminar cuenta</a>
|
||||
|
|
@ -267,19 +363,20 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Gmail (correo)</label>
|
||||
<div class="actions">
|
||||
<a href="https://myaccount.google.com/deleteaccount" target="_blank" rel="noopener">Gestionar</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── ENTRETENIMIENTO ── -->
|
||||
<div class="group">
|
||||
<h3>Entretenimiento y streaming</h3>
|
||||
<div id="ptab-streaming" class="ptab-pane">
|
||||
<div class="pitem-grid">
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Spotify</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.spotify.com/es/account/privacy/" target="_blank" rel="noopener">Privacidad</a>
|
||||
|
|
@ -287,7 +384,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Netflix</label>
|
||||
<div class="actions">
|
||||
<a href="https://help.netflix.com/es/node/407" target="_blank" rel="noopener">Cancelar suscripción</a>
|
||||
|
|
@ -295,7 +392,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Twitch</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.twitch.tv/user/delete-account" target="_blank" rel="noopener">Eliminar cuenta</a>
|
||||
|
|
@ -303,20 +400,21 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> YouTube</label>
|
||||
<div class="actions">
|
||||
<a href="https://myaccount.google.com/data-and-privacy" target="_blank" rel="noopener">Gestionar datos</a>
|
||||
<a href="https://support.google.com/youtube/answer/55759" target="_blank" rel="noopener">Cerrar canal</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── BUSCADORES ── -->
|
||||
<div class="group">
|
||||
<h3>Buscadores e indexadores</h3>
|
||||
<div id="ptab-buscadores" class="ptab-pane">
|
||||
<div class="pitem-grid">
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Google — Derecho al olvido (UE)</label>
|
||||
<div class="actions">
|
||||
<a href="https://reportcontent.google.com/forms/rtbf" target="_blank" rel="noopener">Formulario RTBF</a>
|
||||
|
|
@ -324,77 +422,78 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Google — Contenido obsoleto</label>
|
||||
<div class="actions">
|
||||
<a href="https://search.google.com/search-console/remove-outdated-content" target="_blank" rel="noopener">Herramienta de eliminación</a>
|
||||
<a href="https://search.google.com/search-console/remove-outdated-content" target="_blank" rel="noopener">Herramienta eliminación</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<label><input type="checkbox" class="progress-cb"> Google — Info personal en búsqueda</label>
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Google — Info personal</label>
|
||||
<div class="actions">
|
||||
<a href="https://support.google.com/websearch/troubleshooter/9685456" target="_blank" rel="noopener">Solicitar eliminación</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Bing — Eliminación de contenido</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.bing.com/webmasters/tools/content-removal" target="_blank" rel="noopener">Formulario Bing</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Bing — Derecho al olvido</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.microsoft.com/es-es/concern/bing" target="_blank" rel="noopener">Solicitud Bing</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── DATA BROKERS ── -->
|
||||
<div class="group">
|
||||
<h3>Data brokers y directorios</h3>
|
||||
<div id="ptab-brokers" class="ptab-pane">
|
||||
<div class="pitem-grid">
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Acxiom — Opt-out</label>
|
||||
<div class="actions">
|
||||
<a href="https://isapps.acxiom.com/optout/optout.aspx" target="_blank" rel="noopener">Opt-out oficial</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Epsilon — Opt-out</label>
|
||||
<div class="actions">
|
||||
<a href="https://www.epsilon.com/us/privacy-policy" target="_blank" rel="noopener">Política y opt-out</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> Have I Been Pwned</label>
|
||||
<div class="actions">
|
||||
<a href="https://haveibeenpwned.com/" target="_blank" rel="noopener">Verificar email</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> DeleteMe (referencia)</label>
|
||||
<div class="actions">
|
||||
<a href="https://joindeleteme.com/sites-we-remove-from/" target="_blank" rel="noopener">Lista de brokers cubiertos</a>
|
||||
<a href="https://joindeleteme.com/sites-we-remove-from/" target="_blank" rel="noopener">Lista de brokers</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item">
|
||||
<div class="pitem-card">
|
||||
<label><input type="checkbox" class="progress-cb"> AEPD — Reclamación</label>
|
||||
<div class="actions">
|
||||
<a href="https://sedeagpd.gob.es/sede-electronica-web/" target="_blank" rel="noopener">Sede AEPD</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ══════════════════════════════════════════
|
||||
|
|
@ -564,6 +663,17 @@ function addResult(name, type, msg) {
|
|||
results.appendChild(div);
|
||||
}
|
||||
|
||||
/* ── Panel tabs ────────────────────────────── */
|
||||
document.querySelectorAll('.ptab').forEach(tab => {
|
||||
tab.addEventListener('click', () => {
|
||||
document.querySelectorAll('.ptab').forEach(t => t.classList.remove('active'));
|
||||
document.querySelectorAll('.ptab-pane').forEach(p => p.classList.remove('active'));
|
||||
tab.classList.add('active');
|
||||
const pane = document.getElementById('ptab-' + tab.dataset.tab);
|
||||
if (pane) pane.classList.add('active');
|
||||
});
|
||||
});
|
||||
|
||||
/* ── Progreso checklist ─────────────────────── */
|
||||
const cbs = document.querySelectorAll('.progress-cb');
|
||||
const fill = document.getElementById('progress-fill');
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue