文档浏览器与 CrawlAgent BrowserCDP API

CDP API

Scrapeless Agent Browser 扩展了标准的 CDP(Chrome DevTools Protocol)功能,新增了一系列强大的自定义功能,以增强浏览器自动化能力。本文档主要介绍与 CAPTCHA 处理相关的 CDP 功能。

CAPTCHA Solver 功能

功能概述

Agent Browser 内置了高级 CAPTCHA 解决能力,可自动处理网页上常见的各类 CAPTCHA 类型。

支持的 CAPTCHA 类型

  • reCaptcha
  • Cloudflare Turnstile
  • Cloudflare 5s Challenge
  • AWS WAF

事件监听机制

核心事件

Agent Browser 提供了三个核心事件,用于监听 CAPTCHA 的解决过程:

事件名称描述
Captcha.detected检测到 CAPTCHA
Captcha.solveFinishedCAPTCHA 解决完成
Captcha.solveFailedCAPTCHA 解决失败

事件响应数据结构

字段类型描述
typestringCAPTCHA 类型:recaptcha turnstile
successboolean解决结果
messagestring状态消息:"NOT_DETECTED" "SOLVE_FINISHED" "SOLVE_FAILED" "INVALID"
token?string成功时返回的 token(可选)

实现示例

// Listen for CAPTCHA solving events
const client = await page.createCDPSession();
 
client.on('Captcha.detected', (result) => {
  console.log('Captcha detected:', result);
});
 
await new Promise((resolve, reject) => {
  client.on('Captcha.solveFinished', (result) => {
    if (result.success) resolve();
  });
  client.on('Captcha.solveFailed', () =>
    reject(new Error('Captcha solve failed'))
  );
  setTimeout(() =>
      reject(new Error('Captcha solve timeout')),
    5 * 60 * 1000
  );
});

高级配置 API

Agent Browser 提供了一系列高级 API,用于对 CAPTCHA solver 的行为进行细粒度控制。支持以下 API:

API 名称描述
Captcha.setToken设置 CAPTCHA 服务的认证 token
Captcha.setConfig配置所有 CAPTCHA solver 参数
Captcha.solve手动触发 CAPTCHA 解决过程
Agent.click模拟鼠标点击
Agent.liveURL获取当前会话页面的 live url

API 详细说明

1. Captcha.setConfig

配置 CAPTCHA solver 的所有参数。

await client.send('Captcha.setConfig', {
    config: JSON.stringify(
        {
            apiKey: "your-token",
            autoSolve: true,
            enabledForRecaptcha: true,
            enabledForRecaptchaV3: true,
            enabledForTurnstile: true
        }
    )
});

2. Captcha.solve

手动触发 CAPTCHA 解决过程。

const { Puppeteer, createPuppeteerCDPSession } = require('@scrapeless-ai/sdk');
 
(async () => {
    const browser = await Puppeteer.connect({
      sessionName: 'sdk_test',
      sessionTTL: 180,
      proxyCountry: 'US',
      sessionRecording: true,
      defaultViewport: null
    });
    const page = await browser.newPage();
    await page.goto('https://www.scrapeless.com');
    const cdpSession = await createPuppeteerCDPSession(page);
 
    await cdpSession.solveCaptcha({ timeout: 30000 });
})();

3. Agent.click

模拟鼠标点击。

const { Puppeteer, createPuppeteerCDPSession } = require('@scrapeless-ai/sdk');
 
(async () => {
    const browser = await Puppeteer.connect({
      sessionName: 'sdk_test',
      sessionTTL: 180,
      proxyCountry: 'US',
      sessionRecording: true,
      defaultViewport: null
    });
    const page = await browser.newPage();
    await page.goto('https://www.scrapeless.com');
    const cdpSession = await createPuppeteerCDPSession(page);
 
    await cdpSession.realClick('button');
})();

4. Agent.type

模拟键盘输入。

const { Puppeteer, createPuppeteerCDPSession } = require('@scrapeless-ai/sdk');
 
(async () => {
    const browser = await Puppeteer.connect({
      sessionName: 'sdk_test',
      sessionTTL: 180,
      proxyCountry: 'US',
      sessionRecording: true,
      defaultViewport: null
    });
    const page = await browser.newPage();
    await page.goto('https://www.scrapeless.com');
    const cdpSession = await createPuppeteerCDPSession(page);
 
    await cdpSession.realFill('input', 'Hello, Scrapeless!');
})();

5. Agent.liveURL

获取当前会话页面的 live url。

const { Puppeteer, log as Log, createPuppeteerCDPSession } = require('@scrapeless-ai/sdk');
const logger = Log.withPrefix('puppeteer-example');
 
(async () => {
    const browser = await Puppeteer.connect({
      sessionName: 'sdk_test',
      sessionTTL: 180,
      proxyCountry: 'US',
      sessionRecording: true,
      defaultViewport: null
    });
    const page = await browser.newPage();
    await page.goto('https://www.scrapeless.com');
    const cdpSession = await createPuppeteerCDPSession(page);
 
    const { error, liveURL } = await cdpSession.liveURL();
    if (error) {
      logger.error('Failed to get current page URL:', error);
    } else {
      logger.info('Current page URL:', liveURL);
    }
    await browser.close();
})();

6. Captcha.imageToText

解决图片验证码

const { Puppeteer, createPuppeteerCDPSession } = require('@scrapeless-ai/sdk');
 
const browser = await Puppeteer.connect({
  sessionName: 'sdk_test',
  sessionTTL: 180,
  proxyCountry: 'US',
  sessionRecording: true,
  defaultViewport: null
});
const page = await browser.newPage();
await page.goto('https://www.example.com');
const cdpSession = await createPuppeteerCDPSession(page);
 
await cdpSession.imageToText({
  imageSelector: '.captcha__image',
  inputSelector: 'input[name="captcha"]',
  timeout: 30000,
})