Looking for international version of our service? Go to 2captcha.com

Обход Cloudflare Challenge c Puppeteer и нашим API

Обход проблемы Cloudflare с помощью Puppeteer и API

На первый взгляд процесс обхода защиты Cloudflare protection может показаться сложным, но когда дело доходит до написания кода всё оказывается проще, чем кажется.

В первую очередь, нужно четко отличать в чем разница между отдельной капчей Turnstile и страницей Cloudflare Challenge.

Страница Challenge Капча Turnstile
Вы НЕ ВИДИТЕ сам сайт Вы видите сайт
На странице есть параметр Ray ID На странице нет Ray ID
Вы можете найти определение переменной _cf_chl_opt в коде страницы Переменная _cf_chl_opt не определена
Cloudflare Challenge Page Screenshot

Для страниц Cloudflare Challenge есть несколько дополнительных требований: вам нужно перехватить несколько дополнительных значений: chlPageData, cData, action, а также, использовать актуальное значение User-Agent, а мы вернем использованное значение вместе с ответом.

Как обойти защиту на страницах Challenge в Puppeteer

Прежде всего, установите требуемые зависимости: puppeteer и 2captcha-ts из npm.

yarn add puppeteer 2captcha-ts

Запустите браузер

Ничего особенного, просто запускаем браузер с параметрами по умолчанию.

const browser = await launch({
    headless: false,
    devtools: true
})

const [page] = await browser.pages()

Перехват параметров

Чтобы получить требуемые значения, мы подключаем скрипт, который переопределяет метод turnstile.render так, что параметры выводятся в консоль. Мы также переопределяем метод console.clear потому что Cloudflare вызывает его, чтобы очистить консоль.

const preloadFile = readFileSync('./inject.js', 'utf8')
await page.evaluateOnNewDocument(preloadFile)
содержимое файла inject.js
console.clear = () => console.log('Console was cleared')
const i = setInterval(() => {
    if (window.turnstile) {
        clearInterval(i)
        window.turnstile.render = (a, b) => {
            let params = {
                sitekey: b.sitekey,
                pageurl: window.location.href,
                data: b.cData,
                pagedata: b.chlPageData,
                action: b.action,
                userAgent: navigator.userAgent,
                json: 1
            }
            console.log('intercepted-params:' + JSON.stringify(params))
            window.cfCallback = b.callback
            return
        }
    }
}, 50)

Решаем капчу с API ruCaptcha

Ловим параметры с помощью обрабоотчика событий console и используем 2captcha-ts для решения капчи через API. Получив токен, передаем его в callback-функцию, которая глобально определена скриптом, который мы подключали на странице. После определения обработчика, переходим на нужную страницу.

page.on('console', async (msg) => {
    const txt = msg.text()
    if (txt.includes('intercepted-params:')) {
        const params = JSON.parse(txt.replace('intercepted-params:', ''))
        console.log(params)

        try {
            console.log(`Solving the captcha...`)
            const res = await solver.cloudflareTurnstile(params)
            console.log(`Solved the captcha ${res.id}`)
            console.log(res)
            await page.evaluate((token) => {
                cfCallback(token)
            }, res.data)
        } catch (e) {
            console.log(e.err)
            return process.exit()
        }
    } else {
        return;
    }
})

page.goto('https://rucaptcha.com/42')

Вот и всё

Этот простой пример показывает, что весь процесс обхода Cloudflare Challenge прост при использовании интеграции с API ruCaptcha.

Полный код примера доступен в нашем репозитории в GitHub: https://github.com/2captcha/cloudflare-demo

Полезные ссылки

Если нужно обойти Cloudflare Turnstile (не Cloudflare Challenge) на любом сайте:

Остались вопросы?

Если после прочтения документации у вас остались вопросы по новому API, будем рады ответить и помочь:

Можно задать вопрос любым способом:

Мы ценим отзывы и хотим убедиться, что сервис идеально подходит для ваших задач.