AI Developer Blog

Human-in-the-Loop:AI Agent遇到验证码怎么办

May 1, 2026

那天凌晨2点,我盯着屏幕上的极验滑块验证码发呆。

我的AI Agent已经尝试了47次滑动,每一次都被识别为机器操作。轨迹生成器、滑块缺口识别、打码平台API......所有能想到的办法都试过了。

凌晨2:47,我终于承认了一个事实:有些验证码,只能靠人

但我不能让AI Agent就这么卡住等待。那晚,我设计了一套Human-in-the-Loop方案。

问题分析:为什么AI过不了验证码

让我先解释一下验证码的反自动化机制:

1. 轨迹检测

极验第三代会分析鼠标滑动轨迹的:

AI生成的轨迹过于"完美",被机器学习模型轻松识别。

2. 行为分析

现代验证码会追踪整个浏览会话:

AI Agent的操作行为模式与人类差异明显。

3. 设备指纹

浏览器Canvas指纹、WebGL指纹、字体列表......这些也会被用于判断是否为真实用户。

方案设计:智能暂停+人工介入+自动恢复

我设计的Human-in-the-Loop架构:


// HumanInTheLoop.ts
class HumanInTheLoopController {
  private pauseQueue: PauseRequest[] = [];
  private isPaused = false;
  
  async execute(task: AutomatedTask): Promise {
    try {
      await task.execute();
    } catch (error) {
      if (this.isHumanRequiredError(error)) {
        await this.handleHumanIntervention(task, error);
      } else {
        throw error;
      }
    }
  }
  
  private async handleHumanIntervention(
    task: AutomatedTask, 
    error: Error
  ): Promise {
    // 1. 暂停自动化
    this.isPaused = true;
    
    // 2. 截图当前状态
    const screenshot = await this.captureState();
    
    // 3. 通知用户
    await this.notifyUser({
      type: 'human_required',
      reason: error.message,
      screenshot,
      instruction: this.getInstruction(error)
    });
    
    // 4. 等待用户完成
    await this.waitForUserAction();
    
    // 5. 恢复自动化
    this.isPaused = false;
    
    // 6. 重试任务
    await task.execute();
  }
  
  private getInstruction(error: Error): string {
    if (error instanceof CaptchaError) {
      return '请手动完成验证码验证,完成后点击"继续"按钮';
    }
    if (error instanceof LoginRequiredError) {
      return '需要重新登录,请在弹出的浏览器窗口中完成登录';
    }
    return 'AI无法自动处理此步骤,请手动完成';
  }
}

实现细节

1. 检测需要人工介入的场景


// ErrorClassifier.ts
function classifyError(error: Error): 'retry' | 'human' | 'fail' {
  // 需要人工介入的错误类型
  const humanRequiredPatterns = [
    /captcha/i,
    /验证码/i,
    /极验/i,
    /geetest/i,
    /login required/i,
    /session expired/i,
    /需要登录/i,
    /滑动验证/i,
    /点触验证/i
  ];
  
  for (const pattern of humanRequiredPatterns) {
    if (pattern.test(error.message)) {
      return 'human';
    }
  }
  
  // 临时性错误,重试
  const retryPatterns = [
    /timeout/i,
    /network/i,
    /connection/i,
    /503/i,
    /502/i
  ];
  
  for (const pattern of retryPatterns) {
    if (pattern.test(error.message)) {
      return 'retry';
    }
  }
  
  return 'fail';
}

2. 截图通知


// NotificationService.ts
class NotificationService {
  async notifyUser(request: HumanInterventionRequest) {
    // 保存截图
    const screenshotPath = await this.saveScreenshot(request.screenshot);
    
    // 发送通知(可以是邮件、钉钉、微信等)
    await this.sendNotification({
      title: '🤖 AI Agent需要人工帮助',
      message: `
检测到需要人工介入的步骤:

原因: ${request.reason}
说明: ${request.instruction}

截图已保存,请查看附件。
      `.trim(),
      attachments: [screenshotPath],
      actionUrl: this.getActionUrl(request.id)
    });
  }
  
  async waitForUserAction(): Promise {
    return new Promise((resolve) => {
      // 监听用户完成信号
      eventBus.on('human_action_completed', resolve);
      
      // 也可以设置超时
      setTimeout(() => {
        console.warn('Human intervention timeout, proceeding anyway');
        resolve();
      }, 30 * 60 * 1000); // 30分钟超时
    });
  }
}

3. Webhook回调方案

更优雅的方式是使用Webhook:


// WebhookServer.ts
const express = require('express');
const app = express();

app.post('/human-action/:taskId/complete', async (req, res) => {
  const { taskId } = req.params;
  const { success } = req.body;
  
  if (success) {
    // 用户完成,通知等待的Agent继续执行
    await taskManager.resumeTask(taskId);
    res.json({ status: 'resumed' });
  } else {
    // 用户放弃
    await taskManager.failTask(taskId, new Error('Human gave up'));
    res.json({ status: 'failed' });
  }
});

// 前端页面
app.get('/human-action/:taskId', (req, res) => {
  const { taskId } = req.params;
  const task = taskManager.getTask(taskId);
  
  res.send(`
    
      
        

需要人工操作

${task.instruction}

`); });

与Coze平台的集成

在Coze平台上实现人机协作:


// CozeHumanInTheLoop.ts
class CozeHumanInTheLoop {
  private botUserId: string;
  
  async execute(task: Task): Promise {
    try {
      await this.executeAutomatically(task);
    } catch (error) {
      if (this.isHumanRequired(error)) {
        // 通过Coze Bot通知用户
        await this.bot.sendMessage(
          this.botUserId,
          `🤖 AI Agent需要您的帮助\n\n` +
          `任务: ${task.name}\n` +
          `原因: ${error.message}\n\n` +
          `请在云电脑上完成操作后,回复"完成了"`
        );
        
        // 等待用户回复
        await this.waitForUserReply();
      }
    }
  }
  
  private async waitForUserReply(): Promise {
    return new Promise((resolve) => {
      eventBus.once('user_reply:completed', resolve);
    });
  }
}

效果验证

实施人机协作方案后:

指标之前(纯自动化)之后(人机协作)
验证码通过率~5%100%(人工处理)
任务成功率~30%~98%
平均执行时间不可控可控(人工介入时暂停计时)
用户干预频率0每100步约1-2次

什么时候应该用Human-in-the-Loop

什么时候不应该用

相关开源项目

Coze技能推荐

我的云电脑自动化技能已内置Human-in-the-Loop模块: