返回首页

通过 Puppeteer 在 X 中验证 AI 帖子

文章分析了 AI 代理在 X 中的虚假成功问题:83 次 DOM 点击 vs 16 次真实帖子。描述了通过页面重新加载和 DOM 扫描提取 tweet ID 的验证实现。修复后,成功率达到 94%。该方法适用于任何具有静默过滤器的平台。

X 中 83 次虚假 AI 成功:我们如何通过验证修复
Advertisement 728x90

# X平台AI代理发帖验证:从83个假成功到94%真实成功率

一个用于X平台自动评论的AI代理报告了83个成功发帖,但实际只有16个真正显示出来。问题出在验证不彻底:点击回复按钮并不保证内容会在平台上出现。X的垃圾过滤器会悄无声息地丢弃帖子,没有任何提示。

通过浏览器发帖的机制

代理使用Puppeteer CDP控制真实浏览器。它打开话题线程,输入文本,然后点击回复。最初版本的函数仅检查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; // <-- 问题:过早判定成功  
  }
}
return false;

返回true就标记为DOM层面的成功,没有平台确认。数据库积累记录,仪表盘显示绿灯。

Google AdInline article slot

X不会提示拒绝:输入框清空,URL不变。速率限制或内容政策悄然生效,浏览器仍自以为成功。

帖子ID的问题

为了追踪,代理在点击后从page.url()提取ID:

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

X不会重定向到新帖——URL仍停留在父帖。83条记录全用同一个父帖ID,看似有效的数据掩盖了问题。

Google AdInline article slot

手动查看X分析才暴露真相:报告83个 vs. 实际16个回复。

根源:DOM与平台间的脱节

DOM: button.click() → 成功 ✓
浏览器: 事件触发 → 成功 ✓
X平台: 内容被丢弃 → ??? (无声)
数据库: 记录为“已发布” → 成功 ✓
仪表盘: 83个互动 → 棒极了 ✓
现实: 仅16个实际帖子

监控止步于浏览器。平台过滤器是黑盒子。

解决方案:发帖后验证+页面重载

verifyReplyPosted函数等待渲染、重载页面,并扫描DOM查找文本:

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}'; // 前30字符      
         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;
}
  • 重载确保获取无缓存的最新线程。
  • 通过article[data-testid="tweet"][data-testid="tweetText"]搜索。
  • ID从文章内的href链接提取。
  • verified: true才记录到数据库。

为什么此方法通用适用

这不限于X。各种平台(社交媒体、表单、支付、部署)都会悄然拒绝内容。

关键验证原则:

  • 模拟真人用户:重载+滚动触发懒加载。
  • 在目标DOM中搜寻标记(文本片段)。
  • 从真实元素提取ID,而非URL或事件。
  • 无确凿证据不记录。
  • 实时记录失败。

核心要点

  • DOM事件 ≠ 平台成功:点击不保证发帖。
  • 无声丢弃:垃圾过滤器无提示运行,防绕过。
  • DOM扫描验证:重载+文本/ID搜索。
  • 修复后指标:94%验证成功率,失败即时可见。
  • 广泛应用:任何自动化发帖/提交都需要模拟用户检查。

实施后,代理追踪真实帖子,仪表盘显示真相。该方法可扩展到其他类似过滤的平台。

— Editorial Team

Advertisement 728x90

继续阅读