Volver al inicio

Verificación de Publicaciones de IA en X vía Puppeteer

El artículo analiza el problema de los falsos éxitos del agente de IA en X: 83 clics DOM vs 16 publicaciones reales. Describe la implementación de la verificación vía recarga de página y escaneo DOM para extraer tweet ID. Después de la corrección, la tasa de éxito alcanzó el 94%. El enfoque es aplicable a cualquier plataforma con filtros silenciosos.

83 Éxitos Falsos de IA en X: Cómo Lo Arreglamos con Verificación
Advertisement 728x90

# Verificación de publicaciones de agente IA en X: de 83 falsos éxitos a 94% de aciertos reales

Un agente IA para comentarios automáticos en X reportó 83 publicaciones exitosas, pero solo 16 aparecieron de verdad. La brecha se debía a una verificación incompleta: hacer clic en Responder no garantiza que el contenido se muestre en la plataforma. Los filtros antispam de X eliminan las publicaciones en silencio, sin avisos.

Cómo funciona la publicación a través del navegador

El agente usa Puppeteer CDP para controlar un navegador real. Abre el hilo, introduce el texto y hace clic en Responder. La primera versión de la función solo comprobaba el evento del DOM:

const button = await page.$('[data-testid="tweetButton"]');
if (button) {  
  const disabled = await button.evaluate(el =>     
     el.getAttribute('aria-disabled') === 'true'  
  );  
  if (!disabled) {    
    await button.click();
    return true; // <-- problema: éxito prematuro  
  }
}
return false;

Devolver true lo marcaba como éxito a nivel de DOM, sin confirmación de la plataforma. La base de datos se llenaba de registros y el panel de control brillaba en verde.

Google AdInline article slot

X no avisa de rechazos: el campo se borra, la URL sigue igual. Los límites de tasa o políticas de contenido actúan en silencio, dejando al navegador con la ilusión de éxito.

Problemas con los ID de publicaciones

Para el seguimiento, el agente extraía el ID de page.url() tras el clic:

const tweetId = page.url().split('/status/')[1];

X no redirige al nuevo post: la URL sigue siendo la del padre. Todos los 83 registros tenían el mismo tweet_id del padre, ocultando el problema tras datos aparentemente válidos.

Google AdInline article slot

El fallo salió a la luz manualmente con las analíticas de X: 83 reportadas vs. 16 respuestas reales.

Causa raíz: Brecha entre DOM y plataforma

DOM: button.click() → éxito ✓
Navegador: evento disparado → éxito ✓
Plataforma X: contenido descartado → ??? (silencio)
Base de datos: registrado como "publicado" → éxito ✓
Panel de control: 83 interacciones → genial ✓
Realidad: 16 publicaciones reales

El monitoreo se detenía en el navegador. Los filtros de la plataforma son una caja negra.

Solución: Verificación post-publicación con recarga de página

La nueva función verifyReplyPosted espera el renderizado, recarga la página y escanea el DOM en busca del texto:

Google AdInline article slot
export async function verifyReplyPosted(  
  page: Page,  
  replyText: string,  
  parentTweetId: string,
): Promise<{ verified: boolean; replyTweetId: string | null }> {
  
  await new Promise(r => setTimeout(r, 3000));  
  await page.reload({ waitUntil: "domcontentloaded" });  
  await new Promise(r => setTimeout(r, 5000));
  
  await page.evaluate("window.scrollBy(0, 1000)");  
  await new Promise(r => setTimeout(r, 2000));
  
  const result = await page.evaluate(`    
     (function() {      
         var snippet = '${safe}'; // primeros 30 caracteres      
         var articles = document.querySelectorAll(        
           'article[data-testid="tweet"]'      
         );
         for (var i = 0; i < articles.length; i++) {        
             var textEl = articles[i].querySelector(          
                 '[data-testid="tweetText"]'        
             );    

             if (!textEl) continue;        
             var text = (textEl.innerText || '').slice(0, 60);

             if (text.indexOf(snippet.slice(0, 30)) !== -1) {

                 var links = articles[i].querySelectorAll(            
                   'a[href*="/status/"]'          
                 );          

                 return { verified: true, replyTweetId: realId };        
               }      
         }            

         return { verified: false, replyTweetId: null };    
     })()  
 `);    
  return result;
}
  • La recarga asegura un hilo fresco sin caché.
  • Busca mediante article[data-testid="tweet"] y [data-testid="tweetText"].
  • El ID se extrae de los enlaces href dentro del artículo.
  • Solo se registra en la base de datos si verified: true.

Por qué este enfoque funciona en cualquier plataforma

No es exclusivo de X. Las plataformas (redes sociales, formularios, pagos, despliegues) rechazan contenido en silencio.

Principios clave de verificación:

  • Imita a un usuario real: recarga + scroll para carga perezosa.
  • Busca un marcador (fragmento de texto) en el DOM objetivo.
  • Extrae ID de elementos reales, no de URLs o eventos.
  • No registrar sin prueba.
  • Registrar fallos en tiempo real.

Lecciones clave

  • Eventos DOM ≠ éxito en plataforma: Un clic no garantiza la publicación.
  • Descartes silenciosos: Los filtros antispam actúan sin alertas para evitar trucos.
  • Verificación por escaneo DOM: Recarga + búsqueda de texto/ID.
  • Métricas post-corrección: Tasa de éxito verificado del 94%, fallos visibles al instante.
  • Uso amplio: Cualquier publicación o envío automatizado necesita comprobaciones como las de un usuario.

Tras la implementación, el agente rastrea publicaciones reales y el panel muestra la verdad. El método escala a otras plataformas con filtros similares.

— Editorial Team

Advertisement 728x90

Leer después