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
- 验证码/滑块:这是最典型的场景
- 支付确认:涉及资金的敏感操作应该人工确认
- 登录失效:Cookie/Session过期需要重新登录
- 异常状态:AI无法处理的非预期页面状态
- 长流程:超过一定时间的任务,中途让用户检查进度
什么时候不应该用
- 纯后台任务:没有用户在线的场景
- 高频自动化:每次都需要人工介入就没有意义了
- 明确可解析的错误:如表单验证失败,应该AI自己修复
相关开源项目
- mcp-data-api - 包含完整Human-in-the-Loop实现的远程控制方案
Coze技能推荐
我的云电脑自动化技能已内置Human-in-the-Loop模块:
- 自动检测需要人工介入的场景
- 截图+Webhook通知用户
- 自动恢复执行