Add full project structure: backend API + frontend
- Move repo to project root to include both public/ and api/ - Add .gitignore excluding node_modules and .env - Include API routes (erase, gmail_oauth), services (mailer), and config Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
36b918b95d
commit
614d5af397
20 changed files with 2419 additions and 0 deletions
210
context_puppeteer.txt
Normal file
210
context_puppeteer.txt
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
═══════════════════════════════════════════════════════════════════
|
||||
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
|
||||
═══════════════════════════════════════════════════════════════════
|
||||
Loading…
Add table
Add a link
Reference in a new issue