CDP API
Scrapeless 抓取浏览器扩展了标准 CDP(Chrome DevTools Protocol)功能,新增了一系列强大的自定义函数,以增强浏览器自动化能力。本文档主要介绍与 CAPTCHA 处理相关的 CDP 功能。
CAPTCHA 解决方案功能
功能概览
Scraping Browser 包含了先进的 CAPTCHA 解决方案能力,可自动处理网页上常见的 CAPTCHA 类型。
支持的 CAPTCHA 类型
- reCaptcha
- Cloudflare Turnstile
- Cloudflare 5秒挑战
- AWS WAF
事件监听机制
核心事件
Scraping Browser 提供了三个核心事件来监听 CAPTCHA 解决过程:
| 事件名称 | 描述 |
|---|---|
Captcha.detected | CAPTCHA 被检测到 |
Captcha.solveFinished | CAPTCHA 解决完成 |
Captcha.solveFailed | CAPTCHA 解决失败 |
事件响应数据结构
| 字段 | 类型 | 描述 |
|---|---|---|
type | string | CAPTCHA 类型:recaptcha turnstile |
success | boolean | 解决结果 |
message | string | 状态消息:"NOT_DETECTED" "SOLVE_FINISHED" "SOLVE_FAILED" "INVALID" |
token? | string | 成功时返回的令牌(可选) |
实现示例
// 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
Scraping Browser 提供了一系列高级 API,用于对 CAPTCHA 解决器的行为进行细粒度控制。支持以下 API:
| API 名称 | 描述 |
|---|---|
Captcha.setToken | 设置 CAPTCHA 服务的认证令牌 |
Captcha.setConfig | 配置所有 CAPTCHA 解决器参数 |
Captcha.solve | 手动触发 CAPTCHA 解决过程 |
Agent.click | 模拟鼠标点击 |
Agent.liveURL | 获取当前会话页面的实时 URL |
API 详细描述
1. Captcha.setConfig
配置 CAPTCHA 解决器的所有参数。
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
获取当前会话页面的实时 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('获取当前页面 URL 失败:', error);
} else {
logger.info('当前页面 URL:', liveURL);
}
await browser.close();
})();6. Captcha.imageToText
解决图像 CAPTCHA
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,
})