El problema
Ya sea que estés rebrandeando, limpiando una cuenta antigua o empezando de cero, eliminar miles de tweets uno por uno no es una opción. X no ofrece ninguna función de eliminación masiva. Servicios como TweetDelete funcionan — pero cobran €6–15 al mes por algo que debería ser gratuito.
La solución gratuita
Construimos un script JavaScript que se ejecuta directamente en la consola de tu navegador. Desplaza tu perfil automáticamente, identifica tus tweets y reposts, y los elimina uno por uno. Sin instalación, sin clave API, sin servicio externo — solo tu navegador.
Lo usamos nosotros mismos para limpiar una cuenta antigua de X antes de relanzar @Sublime_Arts_ — eliminó cientos de publicaciones sin un solo problema.
Cómo usarlo — 3 pasos
Qué hace
El progreso se registra en tiempo real en la consola. Se detiene automáticamente después de 8 scrolls vacíos. Vuelve a ejecutar si X carga más posts.
El script
const sleep = ms => new Promise(r => setTimeout(r, ms));
async function cleanupXProfile() {
let repostsRemoved = 0, tweetsDeleted = 0, emptyScrolls = 0;
const getCol = () =>
document.querySelector('[data-testid="primaryColumn"]') ||
document.querySelector('main') || document;
const closeMenu = async () => {
document.dispatchEvent(new KeyboardEvent('keydown',
{ key: 'Escape', keyCode: 27, bubbles: true }));
await sleep(250);
const h = getCol().querySelector('h1, h2');
if (h) h.click(); await sleep(200);
};
console.log('🧹 X Profile Cleanup started...');
while (emptyScrolls < 8) {
let actions = 0; const col = getCol();
for (const btn of [...col.querySelectorAll('button')]
.filter(b => b.innerHTML.includes('M4.75 3.79l4.603'))) {
try {
btn.click(); await sleep(700);
const c = document.querySelector('[data-testid="unretweetConfirm"]');
if (c) { c.click(); repostsRemoved++; actions++;
console.log(`↩️ Repost removed #${repostsRemoved}`); await sleep(900);
} else await closeMenu();
} catch { await closeMenu(); }
}
for (const btn of [...col.querySelectorAll('button')]
.filter(b => b.innerHTML.includes('M3 12c0-1.1.9-2 2-2s2'))) {
await closeMenu(); await sleep(300);
try {
btn.click(); await sleep(800);
const del = [...document.querySelectorAll('[role="menuitem"]')]
.find(i => i.textContent.trim()
.match(/^(Delete|Elimina|Supprimer|Löschen|Eliminar|Удалить|削除|삭제)$/));
if (del) {
del.click(); await sleep(700);
const ok = document.querySelector('[data-testid="confirmationSheetConfirm"]');
if (ok) { ok.click(); tweetsDeleted++; actions++;
console.log(`🗑️ Tweet deleted #${tweetsDeleted}`); await sleep(1200);
} else await closeMenu();
} else await closeMenu();
} catch { await closeMenu(); }
}
if (actions === 0) { emptyScrolls++;
console.log(`Scrolling... (${emptyScrolls}/8)`);
} else emptyScrolls = 0;
window.scrollBy(0, 900); await sleep(2000);
}
console.log(`\n✅ Done! Reposts: ${repostsRemoved} | Tweets: ${tweetsDeleted}`);
}
cleanupXProfile();About
Patrick Chen — desarrollador independiente detrás de Sublimearts.io. Lo construí mientras limpiaba mi propia cuenta de X antes del relanzamiento.