# 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.
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.
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 :
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
hrefdans l'article. - Seule
verified: trueest 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
Aucun commentaire pour le moment.