Các loại CAPTCHA được hỗ trợ

reCaptcha

Trình duyệt Scrapeless crawler chỉ hỗ trợ tự động giải quyết reCaptchaV2; các thao tác tiếp theo cần được tự thực hiện.

Cloudflare

  • Cloudflare Turnstile
  • Cloudflare Challenge

Trình duyệt Scrapeless crawler chỉ hỗ trợ tự động giải quyết Turnstile hoặc Challenge; các thao tác tiếp theo cần được tự thực hiện. Để biết các hướng dẫn chi tiết về cách xử lý các thử thách Cloudflare (bao gồm cả việc lấy cf_clearance), vui lòng tham khảo: https://www.scrapeless.com/en/blog/cloudflare-challenge-bypass

Ví dụ về giải pháp

Khi kết nối với trình duyệt để truy cập trang web mục tiêu, Scrapeless sẽ tự động giải quyết CAPTCHA. Tuy nhiên, chúng ta cần đảm bảo rằng CAPTCHA đã được giải quyết thành công. Đây là một ví dụ đơn giản: Ví dụ này truy cập trang web mục tiêu và xác nhận rằng CAPTCHA đã được giải quyết thành công bằng cách lắng nghe sự kiện CDP Captcha.solveFinished. Cuối cùng, nó sẽ chụp ảnh màn hình của trang để xác minh.

Ví dụ này định nghĩa hai phương thức chính:

  • addCaptchaListener: Được sử dụng để lắng nghe các sự kiện CAPTCHA trong phiên trình duyệt
  • onCaptchaFinished: Được sử dụng để chờ giải quyết CAPTCHA hoàn tất

Danh sách CAPTCHA được hỗ trợ

  • reCaptcha v2
  • Cloudflare Turnstile
  • Cloudflare 5s Challenge
  • AWS Challenge
import puppeteer from "puppeteer-core";
import EventEmitter from 'events';
const emitter = new EventEmitter()
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
export async function example(url) {
  const browser = await puppeteer.connect({
    browserWSEndpoint: scrapelessUrl,
    defaultViewport: null
  });
  console.log("Verbonden met Scrapeless browser");
  try {
    const page = await browser.newPage();
    // Listen for captcha events
    console.debug("addCaptchaListener: Start listening for captcha events");
    await addCaptchaListener(page);
    console.log("Navigated to URL:", url);
    await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
    console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
    await onCaptchaFinished()
    // Screenshot for debugging
    console.debug("Taking screenshot of the final page...");
    await page.screenshot({ path: 'screenshot.png', fullPage: true });
  } catch (error) {
    console.error(error);
  } finally {
    await browser.close();
    console.log("Browser closed");
  }
}
 
async function addCaptchaListener(page) {
  const client = await page.createCDPSession();
  client.on("Captcha.detected", (msg) => {
    console.debug("Captcha.detected: ", msg);
  });
  client.on("Captcha.solveFinished", async (msg) => {
    console.debug("Captcha.solveFinished: ", msg);
    emitter.emit("Captcha.solveFinished", msg);
    client.removeAllListeners()
  });
}
 
async function onCaptchaFinished(timeout = 60_000) {
  return Promise.race([
    new Promise((resolve) => {
      emitter.on("Captcha.solveFinished", (msg) => {
        resolve(msg);
      });
    }),
    new Promise((_, reject) => setTimeout(() => reject('Timeout'), timeout))
  ])
}

Ví dụ reCaptcha

Gọi phương thức mã ví dụ để xác minh việc giải quyết reCaptcha tự động.

 example('https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php');

Ví dụ Cloudflare Turnstile

Gọi phương thức mã ví dụ để xác minh việc giải quyết Cloudflare Turnstile tự động.

 example('https://www.scrapingcourse.com/login/cf-turnstile');

Việc giải quyết Cloudflare Turnstile thành công có thể được xác nhận không chỉ bằng cách lắng nghe sự kiện CDP Captcha.solveFinished, mà còn bằng cách lắng nghe window.turnstile.getResponse(). Đây là một ví dụ hoàn chỉnh:

import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
export async function turnstileExample(url) {
  const browser = await puppeteer.connect({
    browserWSEndpoint: scrapelessUrl,
    defaultViewport: null
  });
  console.log("Verbonden met Scrapeless browser");
  try {
    const page = await browser.newPage();
    console.log("Navigated to URL:", url);
    await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
    console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
    await waitTurnstile(page)
    // Screenshot for debugging
    console.debug("Taking screenshot of the final page...");
    await page.screenshot({ path: 'screenshot.png', fullPage: true });
  } catch (error) {
    console.error(error);
  } finally {
    await browser.close();
    console.log("Browser closed");
  }
}
 
async function waitTurnstile(page) {
    await page.waitForFunction(() => {
        return window.turnstile && window.turnstile.getResponse();
    });
    const token = await page.evaluate(() => {
        return window.turnstile.getResponse();
    });
    console.log("Cloudflare Turnstile token:", token);
}
 
turnstileExample('https://www.scrapingcourse.com/login/cf-turnstile');

Ví dụ Cloudflare Challenge

Cloudflare Challenge là đặc biệt vì đôi khi nó sẽ không kích hoạt Cloudflare Challenge, và phương pháp xác nhận giải quyết thành công bằng cách lắng nghe các sự kiện CDP sẽ hết thời gian chờ. Do đó, chờ đợi sự xuất hiện của các phần tử trên trang sau khi giải quyết là một phương pháp ổn định hơn. Đây là một ví dụ hoàn chỉnh:

import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=ANY';
 
export async function challengeExample(url) {
  const browser = await puppeteer.connect({
    browserWSEndpoint: scrapelessUrl,
    defaultViewport: null
  });
  console.log("Verbonden met Scrapeless browser");
  try {
    const page = await browser.newPage();
    console.log("Navigated to URL:", url);
    await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
    console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
    await waitChallenge(page, 'main.page-content .challenge-info')
    // Screenshot for debugging
    console.debug("Taking screenshot of the final page...");
    await page.screenshot({ path: 'screenshot.png', fullPage: true });
  } catch (error) {
    console.error(error);
  } finally {
    await browser.close();
    console.log("Browser closed");
  }
}
 
async function waitChallenge(page, selector) {
    await page.waitForSelector(selector);
    console.log("Cloudflare Challenge completed");
}
 
challengeExample('https://www.scrapingcourse.com/cloudflare-challenge');