Обход 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-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, будем рады ответить и помочь:
Можно задать вопрос любым способом:
- Отправить письмо на [email protected]
- Skype
- Создать тикет
Мы ценим отзывы и хотим убедиться, что сервис идеально подходит для ваших задач.