Retour à l'accueil

Vérification des Publications AI sur X via Puppeteer

L'article analyse le problème des faux succès de l'agent AI sur X : 83 clics DOM vs 16 publications réelles. Décrit l'implémentation de la vérification via rechargement de page et scan DOM pour extraire l'ID de tweet. Après la correction, le taux de succès a atteint 94 %. L'approche est applicable à toute plateforme avec filtres silencieux.

83 Succès AI Faux sur X : Comment Nous Réparons avec Vérification
Advertisement 728x90

# Vérification des publications d'agent IA sur X : de 83 faux succès à 94 % de vrais résultats

Un agent IA pour des commentaires automatisés sur X a signalé 83 publications réussies, mais seules 16 sont réellement apparues. L'écart provenait d'une vérification incomplète : cliquer sur Répondre ne garantit pas que le contenu s'affiche sur la plateforme. Les filtres anti-spam de X suppriment discrètement les publications sans aucun avertissement.

Comment fonctionne la publication via un navigateur

L'agent utilise Puppeteer CDP pour contrôler un vrai navigateur. Il ouvre le fil, saisit le texte et clique sur Répondre. La première version de la fonction ne vérifiait que l'événement 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; // <-- problème : succès prématuré  
  }
}
return false;

Retourner true marquait le succès au niveau DOM, sans confirmation de la plateforme. La base de données s'accumulait de records, et le tableau de bord virait au vert.

Google AdInline article slot

X ne signale pas les refus : le champ se vide, l'URL reste identique. Les limites de taux ou politiques de contenu s'appliquent en silence, laissant le navigateur dans l'illusion du succès.

Problèmes avec les ID de publication

Pour le suivi, l'agent extrayait l'ID de page.url() après clic :

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

X ne redirige pas vers la nouvelle publication — l'URL reste celle du parent. Tous les 83 records recevaient le même tweet_id parent, masquant le problème derrière des données apparemment valides.

Google AdInline article slot

Le souci a émergé manuellement via les analytics de X : 83 signalées contre 16 vraies réponses.

Cause profonde : Écart entre DOM et plateforme

DOM : button.click() → succès ✓
Navigateur : événement déclenché → succès ✓
Plateforme X : contenu supprimé → ??? (silence)
Base de données : enregistré comme "publié" → succès ✓
Tableau de bord : 83 engagements → super ✓
Réalité : 16 publications réelles

La surveillance s'arrêtait au navigateur. Les filtres de plateforme sont une boîte noire.

Solution : Vérification post-publication avec rechargement de page

La nouvelle fonction verifyReplyPosted attend le rendu, recharge la page et scanne le DOM pour le texte :

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}'; // premiers 30 caractères      
         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;
}
  • Le rechargement assure un fil frais sans cache.
  • Recherche via article[data-testid="tweet"] et [data-testid="tweetText"].
  • ID extrait des liens href dans l'article.
  • Seule verified: true est enregistrée en base.

Pourquoi cette approche fonctionne partout

Ce n'est pas spécifique à X. Les plateformes (réseaux sociaux, formulaires, paiements, déploiements) rejettent discrètement le contenu.

Principes clés de vérification :

  • Imiter un vrai utilisateur : rechargement + défilement pour lazy loading.
  • Chercher un marqueur (extrait de texte) dans le DOM cible.
  • Extraire les ID d'éléments réels, pas d'URL ou événements.
  • Éviter l'enregistrement sans preuve.
  • Journaliser les échecs en temps réel.

Enseignements clés

  • Événements DOM ≠ succès plateforme : Un clic ne garantit pas la publication.
  • Suppressions silencieuses : Filtres anti-spam sans alerte pour contrer les contournements.
  • Vérification par scan DOM : Rechargement + recherche texte/ID.
  • Métriques post-correction : 94 % de succès vérifiés, échecs visibles instantanément.
  • Utilisation large : Toute publication/soumission automatisée nécessite des checks user-like.

Après implémentation, l'agent suit les vraies publications, le tableau de bord affiche la réalité. La méthode s'adapte à d'autres plateformes avec filtres similaires.

— Editorial Team

Advertisement 728x90

Lire ensuite