Автоматизированное тестирование, являющееся важнейшим аспектом непрерывной интеграции, часто сталкивается с проблемами при использовании таких мер безопасности, как капча. Необходимость в непрерывных и повторяющихся тестовых запусках может привести к срабатыванию механизмов безопасности, таких как Cloudflare CAPTCHA, что приводит к сбоям тестирования. Хотя во время выполнения теста можно отключить капчу, существуют сценарии, при которых это может оказаться неосуществимым. В этом тексте мы расскажем о Cloudflare CAPTCHA, сосредоточив внимание на автономной капче Standalone Cloudflare Turnstile Captcha и Cloudflare Turnstile Challenge Page. Мы рассмотрим тонкости этих капчей и обсудим два эффективных способа их автоматического обхода.
Введение в Cloudflare
Существует 2 типа капчи Cloudflare turnstile captcha:
- Автономная Standalone Cloudflare Turnstile Captcha: Виджет-капча размещается на странице веб-сайта и защищает форму от автоматической отправки. Пример.
- Cloudflare Turnstile Challenge Page: Капча на веб-сайтах, проксируемых через Cloudflare. Пример.
Техники обхода
3.1. Бесплатный (только на Python):
- Необнаруживаемый драйвер Chrome: Использование необнаруживаемого браузера Chrome позволяет сценариям автоматизации взаимодействовать с веб-сайтами, не вызывая проверки безопасности Cloudflare. Однако эта библиотека по-прежнему обнаруживается новейшим алгоритмом Cloudflare.
- Пример файла на Python здесь.
driver = uc.Chrome(headless=True,use_subprocess=False)
driver.get(‘https://rucaptcha.com/42’)
driver.save_screenshot(‘captcha.png’)
- DrissionPage: DrissionPage – это библиотека Python, которая автоматизирует взаимодействие с браузером и может использоваться для навигации по веб-сайтам, защищённым Cloudflare, без обнаружения. Изучить документацию DrissionPage можно по ссылке
page = ChromiumPage()
page.get(‘https://rucaptcha.com/42’)
3.2. Платный обход при использовании 2Captcha:
Как это работает? Отправьте капчу по API в 2Captcha, чтобы получить токен cf-turnstile-response. Их работники обойдут эту капчу вручную и отправят обратно токен cf-turnstile-response. Затем используйте этот токен, чтобы обойти Cloudflare, установив значение для ввода cf-turnstile-response.
3.2.1. Автономная Standalone Turnstile капча
Шаг 1: Отправьте запрос на обход turnstile на 2Captcha с помощью:
- Конечная точка: https://2captcha.com/in.php
- Метод: POST
- Тело запроса в формате JSON:
«key»: «YOUR_API_KEY», // Перейдите на https://2captcha.com/enterpage , скопируйте свой API-ключ и вставьте его сюда
«method»: «turnstile»,
«sitekey»: «0x4AAAAAAAC3DHQFLr1GavRN», // Для каждого веб-сайта используется уникальный ключ сайта
«pageurl»: «https://2captcha.com/demo/cloudflare-turnstile», // URL Вашего веб-сайта, используя CF turnstile
«json»: 1
}
Где Вы можете получить значение ключа сайта? В тэге CF iframe Вы можете взять значение из атрибута src. Смотрите более подробную информацию ниже:
Примерный ответ:
«status»: 1,
«request»: «2122988149» // идентификатор запроса для получения обходного токена
}
Шаг 2: Подождите 10 секунд
- Запрос на шаге 1 запускает задание для обхода Cloudflare вручную. Таким образом, выполнение этой работы занимает 7-10 секунд. Вам нужно подождать.
Шаг 3: Отправьте запрос GET для получения токена cf-turnstile-response
- Конечная точка: https://2captcha.com/res.php?key=YOUR_API_KEY&action=get&id=2122988149&json=1
- Примерный ответ:
«status»: 1,
«request»: «0.WoGeDojxQzHCCk023JRjfxv23olYh37jFdvPrcqmNeQ7PbSYIEuiBTK2SR_GdjfMitYEC23Gm7Vt93U1CPcI6aIFEhG-ffe1i9e6tIfIlYCFtb7OMxTB4tKCyTdpiaA.SP5YT77nuMNdOhZlvoBWAQ.da6448d22df7dd92f56a9fcf6d7138e5ee712bcf7d00c281f419b3bc091cbe64»
}
Шаг 4: Установите значение для ввода cf-turnstile-response на вкладке консоли инструмента разработки.
Шаг 5: Капча пройдена. Продолжайте свою работу.
Вы можете ознакомиться с последними рекомендациями по вводу автономной капчи standalone turnstile здесь. Если Вы ищете примеры кода 2Captcha на C#, PHP, Ruby, Java, Python или Javascript, пожалуйста, перейдите в их git-репозитории.
3.2.2. Cloudflare Challenge page
Обход с помощью puppeteer JS
- Во-первых, отправьте тот же POST-запрос, что и при автономной standalone turnstile капче, чтобы запустить задание обхода 2Captcha. Однако здесь есть ещё 3 обязательных поля, которые необходимо заполнить, включая data, pagedata и action.
Method: POST
{
«key»: «YOUR_API_KEY»,
«method»: «turnstile»,
«sitekey»: «0x0AAAAAAADnPIDROzbs0Aaj»,
«data»: «7fab0000b0e0ff00»,
«pagedata»: «3gAFo2…0ME1UVT0=»,
«pageurl»: «https://2captcha.com/»,
«action»: «managed»,
«json»: 1
}
- Как мы можем получить значения для этих полей? Вы должны перехватить вызов window.turnstile.render, введя следующий JavaScript перед загрузкой виджета Turnstile.
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
}
// мы перехватим сообщение в puppeeter
console.log(‘intercepted-params:’ + JSON.stringify(params))
window.cfCallback = b.callback
return
}
}
}, 50)
- В Puppeteer используйте метод Page.evaluateOnNewDocument(inject_script), чтобы вводить скрипт всякий раз, когда загружается новый документ. Сохраните приведённый выше JS-скрипт в файле с именем inject.js, сценарий для обхода будет:
import { Solver } from ‘@2captcha/captcha-solver’
import { readFileSync } from ‘fs’
const solver = new Solver(`API_KEY`) // Set your API key here
const example = async () => {
const browser = await launch({
headless: false,
devtools: true
})
const [page] = await browser.pages()
// Загрузить контент inject.js
const preloadFile = readFileSync(‘./inject.js’, ‘utf8’);
await page.evaluateOnNewDocument(preloadFile);
// Здесь мы перехватываем сообщения консоли, чтобы поймать сообщение, записанное inject.js script
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;
}
})
// Когда страница перенаправляется, в консоли браузера появляется запись «intercepted-params: …»
page.goto(‘https://rucaptcha.com/42’)
}
example() // Запустите приведённый выше пример функции
Обход с Selenium C#
- C# – это всего лишь пример реализации. 2Captcha может быть реализована на любом другом языке.
- В Selenium проделайте то же самое с Puppeteer. Вызовите команду Page.addScriptToEvaluateOnNewDocument из Chrome Dev Tools вместо page.evaluateOnNewDocument();, чтобы внедрить скрипт.
((ChromeDriver)AtataContext.Current.Driver)
.ExecuteCdpCommand(«Page.addScriptToEvaluateOnNewDocument»,
new System.Collections.Generic.Dictionary<string, object> { { «source», injectedScripts } }
);
- Загрузите сообщение, содержащее текст “intercepted-params”. И не забудьте настроить параметры ведения журнала на всех уровнях, чтобы получать журнал с помощью: chromeOptions.SetLoggingPreference(LogType.Browser, OpenQA.Selenium.LogLevel.All);
LogEntry message = AtataContext.Current.Driver.Manage().Logs.GetLog(LogType.Browser).FirstOrDefault(m => m.Message.Contains(«intercepted-params:»));
- Обработайте параметры в запросе Turnstile Captcha для data, PageData и action. Наконец, переадресуйте верификацию Cloudflare с помощью токена для обхода с js-скриптом $”cfCallback(‘{token}’);”
{
string paramString = Regex.Replace(message.Message, @».*intercepted-params:», «»)
.Replace(«}\»», «}»)
.Replace(«\\», «»);
TwoCaptchaParams param = JsonConvert.DeserializeObject<TwoCaptchaParams>(@$»{paramString}»);
// Решите CAPTCHA, используя 2captcha-csharp
CustomTwoCaptcha solver = new CustomTwoCaptcha(_apiKey);
TurnstileChallengePage captcha = new TurnstileChallengePage();
captcha.SetSiteKey(param.SiteKey);
captcha.SetUrl(param.PageUrl);
captcha.SetData(param.Data);
captcha.SetPageData(param.PageData);
captcha.SetAction(param.Action);
captcha.SetUserAgent(param.UserAgent);
var captchaId = solver.SendRequest(captcha).GetAwaiter().GetResult();
Thread.Sleep(10);
string token = solver.GetResult(captchaId).GetAwaiter().GetResult();
// Введите решённый токен CAPTCHA
AtataContext.Current.Driver.AsScriptExecutor().ExecuteScript($»cfCallback(‘{token}’);»);
}
else
{
Console.WriteLine(«Console message not found.»);
}
- Наконец, запустите его, и Вы успешно обойдёте CloudFlare. Поздравляем!
Заключение
Автоматический обход Cloudflare капчи требует тонкого понимания различных типов проблем, связанных с мерами безопасности. В этом случае 2captcha становится надёжным и жизнеспособным решением.
Важно отметить, что методы автоматического обхода должны использоваться ответственно и с соблюдением этических норм. Надеемся, что эта тема окажется для Вас полезной!
Ссылки
Руководство по 2Captcha: https://2captcha.com/blog/bypass-cloudflare-turnstile-captcha



