═══════════════════════════════════════════════════════════════════
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
═══════════════════════════════════════════════════════════════════
