Обход Cloudflare Challenge с помощью Puppeteer и 2Captcha

Обход Cloudflare Challenge с помощью Puppeteer и 2Captcha

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

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

Обход Cloudflare Challenge с помощью Puppeteer и 2Captcha
Обход Cloudflare Challenge с помощью Puppeteer и 2Captcha

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

Как обойти страницу вызова

Первым делом устанавливаем необходимые зависимости: 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)

Решите капчу с помощью 2Captcha API

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

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')

Вот и все

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

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

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

Рекомендации

Узнайте, как обойти турникет Cloudflare (не Cloudflare Challenge) на любом веб-сайте.

11
2 комментария

Ищу спеца в playwright на длительный проект закупки билетов с сайтов футбольных клубов

1
Ответить