Обход Cloudflare Challenge c Puppeteer и нашим API
На первый взгляд процесс обхода защиты Cloudflare protection может показаться сложным, но когда дело доходит до написания кода всё оказывается проще, чем кажется.
В первую очередь, нужно четко отличать в чем разница между отдельной капчей Turnstile и страницей Cloudflare Challenge.
| Страница Challenge | Капча Turnstile | 
|---|---|
| Вы НЕ ВИДИТЕ сам сайт | Вы видите сайт | 
| На странице есть параметр Ray ID | На странице нет Ray ID | 
| Вы можете найти определение переменной _cf_chl_optв коде страницы | Переменная _cf_chl_optне определена | 

Для страниц Cloudflare Challenge есть несколько дополнительных требований: вам нужно перехватить несколько дополнительных значений: chlPageData, cData, action, а также, использовать актуальное значение User-Agent, а мы вернем использованное значение вместе с ответом.
Как обойти защиту на страницах Challenge в Puppeteer
Прежде всего, установите требуемые зависимости: puppeteer и @2captcha/captcha-solver из npm.
            
            
              bash
              
              
              
            
          
          yarn add puppeteer @2captcha/captcha-solverЗапустите браузер
Ничего особенного, просто запускаем браузер с параметрами по умолчанию.
            
            
              js
              
              
              
            
          
          const browser = await launch({
    headless: false,
    devtools: true
})
const [page] = await browser.pages()Перехват параметров
Чтобы получить требуемые значения, мы подключаем скрипт, который переопределяет метод turnstile.render так, что параметры выводятся в консоль. Мы также переопределяем метод console.clear потому что Cloudflare вызывает его, чтобы очистить консоль.
            
            
              js
              
              
              
            
          
          const preloadFile = readFileSync('./inject.js', 'utf8')
await page.evaluateOnNewDocument(preloadFile)содержимое файла inject.js
        
            
            
              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/captcha-solver для решения капчи через API. Получив токен, передаем его в callback-функцию, которая глобально определена скриптом, который мы подключали на странице. После определения обработчика, переходим на нужную страницу.
            
            
              js
              
              
              
            
          
          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, будем рады ответить и помочь:
Можно задать вопрос любым способом:
- Отправить письмо на [email protected]
- Skype
- Создать тикет
Мы ценим отзывы и хотим убедиться, что сервис идеально подходит для ваших задач.