═══════════════════════════════════════════════════════════════════ RESETEA.NET — CONTEXTO PARA AUTOMATIZACIÓN CON PUPPETEER (LOCAL) Creado: 2026-04 | Estado: pendiente de implementar ═══════════════════════════════════════════════════════════════════ OBJETIVO ──────── Permitir que el propio usuario ejecute una automatización local (Puppeteer corriendo en su máquina) para completar flujos de eliminación de cuentas y envío de solicitudes GDPR sin ceder credenciales a ningún servidor externo. El servidor de resetea.net solo entrega el script. La ejecución ocurre 100 % en el dispositivo del usuario. ───────────────────────────────────────────────────────────────── ARQUITECTURA PROPUESTA ───────────────────────────────────────────────────────────────── resetea.net (servidor) └── Entrega scripts Puppeteer por plataforma vía descarga directa scripts/puppeteer/instagram_delete.js scripts/puppeteer/facebook_delete.js scripts/puppeteer/twitter_deactivate.js scripts/puppeteer/google_delete.js scripts/puppeteer/linkedin_close.js scripts/puppeteer/gdpr_email_sender.js ← usa Gmail local Usuario (local) ├── Instala Node.js + Puppeteer (npx puppeteer) ├── Descarga el script de resetea.net ├── Ejecuta: node instagram_delete.js └── El script abre Chromium, el usuario introduce credenciales manualmente en la ventana del navegador (headful, no headless) y el script guía los clics del flujo de eliminación. ───────────────────────────────────────────────────────────────── DECISIONES DE DISEÑO IMPORTANTES ───────────────────────────────────────────────────────────────── 1. SIEMPRE headful (con ventana visible) - El usuario ve exactamente qué está pasando. - Las credenciales las teclea el usuario, no el script. - Reduce enormemente el riesgo de bloqueo por parte de las plataformas (2FA, detección de bots, etc.). 2. NUNCA enviar credenciales al servidor - El script no hace fetch() con passwords. - No hay logging de sesiones en el servidor. 3. Consentimiento explícito - El script muestra en terminal qué va a hacer antes de cada acción. - Requiere confirmación (Y/n) para pasos destructivos. 4. Pausa antes de acciones irreversibles - Antes de confirmar la eliminación: pausa de 10 segundos con mensaje claro en terminal. 5. Modo "dry-run" - node instagram_delete.js --dry-run - Navega y muestra qué haría pero no hace clic en "Confirmar". ───────────────────────────────────────────────────────────────── LEGALIDAD Y TÉRMINOS DE SERVICIO ───────────────────────────────────────────────────────────────── ZONA GRIS LEGAL: - La mayoría de ToS prohíben acceso automatizado. Sin embargo, cuando el objetivo es ejercer un derecho legal (RGPD Art. 17) y el usuario opera desde su propio dispositivo con sus propias credenciales, la práctica es equiparable a usar un gestor de contraseñas o un asistente de accesibilidad. - El Tribunal de Justicia de la UE (sentencia hiQ vs LinkedIn, 2022) ha matizado que bloquear el ejercicio de derechos mediante medidas técnicas puede ser contrario al RGPD. - Riesgo real: la plataforma puede detectar el bot y bloquear la cuenta antes de completar la eliminación. Mitigación: modo headful + pasos con delays humanos (randomDelay helper). - Recomendación: incluir en cada script un aviso legal y que el usuario acepte explícitamente antes de ejecutar. ACCIONES SEGURAS (bajo riesgo de detección): ✓ Navegar a la URL de eliminación y hacer click en botones del flujo oficial. ✓ Rellenar el formulario de supresión GDPR que la plataforma ya ofrece públicamente. ✗ Scraping masivo de datos de la plataforma. ✗ Publicar, enviar mensajes o modificar contenido. ───────────────────────────────────────────────────────────────── STACK TÉCNICO ───────────────────────────────────────────────────────────────── Dependencias del script de usuario: node >= 18 puppeteer >= 22 (incluye Chromium) inquirer >= 9 (prompts en terminal) chalk >= 5 (colores en terminal) Instalación rápida: npm init -y && npm install puppeteer inquirer chalk ───────────────────────────────────────────────────────────────── ESTRUCTURA DE SCRIPT TIPO (Instagram) ───────────────────────────────────────────────────────────────── // instagram_delete.js import puppeteer from 'puppeteer'; import inquirer from 'inquirer'; import chalk from 'chalk'; const STEPS = [ { url: 'https://www.instagram.com/accounts/login/', action: 'LOGIN' }, { url: 'https://www.instagram.com/accounts/remove/request/permanent/', action: 'DELETE' }, ]; async function run() { console.log(chalk.yellow('⚠ RESETEA.NET — Eliminación de cuenta Instagram')); console.log(chalk.gray('Este script navega por los pasos oficiales de Instagram.')); console.log(chalk.gray('Tus credenciales NUNCA salen de tu dispositivo.\n')); const { confirmed } = await inquirer.prompt([{ type: 'confirm', name: 'confirmed', message: '¿Confirmas que quieres iniciar el proceso de eliminación de tu cuenta Instagram?', default: false, }]); if (!confirmed) process.exit(0); const browser = await puppeteer.launch({ headless: false, defaultViewport: null }); const page = await browser.newPage(); // Paso 1: Login manual console.log(chalk.cyan('\n→ Abriendo Instagram. Introduce tus credenciales en la ventana del navegador.')); await page.goto(STEPS[0].url, { waitUntil: 'networkidle2' }); // Espera a que el usuario haga login manualmente await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 120000 }); // Paso 2: Navegar a eliminación console.log(chalk.cyan('\n→ Navegando a la página de eliminación de cuenta...')); await page.goto(STEPS[1].url, { waitUntil: 'networkidle2' }); console.log(chalk.red('\n⚠ ATENCIÓN: Tienes 10 segundos para cancelar (Ctrl+C)')); await new Promise(r => setTimeout(r, 10000)); // TODO: Localizar y hacer clic en el botón de confirmación // (los selectores cambian con las actualizaciones de Instagram) // await page.click('button[data-testid="delete-account-confirm"]'); console.log(chalk.green('\n✓ Proceso completado. Cierra el navegador cuando hayas terminado.')); } run().catch(console.error); ───────────────────────────────────────────────────────────────── HELPER: DELAYS HUMANOS (anti-detección) ───────────────────────────────────────────────────────────────── function randomDelay(min = 800, max = 2400) { return new Promise(r => setTimeout(r, min + Math.random() * (max - min))); } // Uso: await randomDelay(); entre cada acción ───────────────────────────────────────────────────────────────── ROADMAP DE IMPLEMENTACIÓN ───────────────────────────────────────────────────────────────── Fase 1 (MVP): [ ] Script Instagram (ruta más común) [ ] Script Facebook [ ] Script X/Twitter [ ] Página de descarga en resetea.net con instrucciones claras [ ] Aviso legal que el usuario acepta antes de descargar Fase 2: [ ] Script LinkedIn [ ] Script TikTok (solo app móvil — requiere ADB o alternativa) [ ] Script Google (flujo myaccount) [ ] Auto-update de selectores (GitHub Actions que verifica mensualmente) Fase 3: [ ] Modo monitor: re-ejecuta opt-outs de data brokers cada 90 días [ ] Script para AEPD (rellenar formulario de reclamación si no responden) ───────────────────────────────────────────────────────────────── NOTAS OPERATIVAS ───────────────────────────────────────────────────────────────── - Los selectores CSS de las plataformas cambian con frecuencia. Hay que mantener los scripts actualizados (punto de fricción principal). - Instagram y Facebook detectan Puppeteer por el user-agent y ciertas propiedades de navigator. Usar puppeteer-extra + stealth plugin para mitigarlo: npm install puppeteer-extra puppeteer-extra-plugin-stealth - TikTok solo permite eliminar cuenta desde la app móvil. Alternativa: ADB (Android Debug Bridge) + UI Automator, o instrucciones manuales muy detalladas con screenshots. - Guardar los selectores en un fichero JSON separado (selectors.json) para que sea fácil actualizarlos sin tocar la lógica del script. ═══════════════════════════════════════════════════════════════════ FIN DEL CONTEXTO — resetea.net/context_puppeteer.txt ═══════════════════════════════════════════════════════════════════