Автоматический обход Cloudflare капчи - два противоположных метода (выбирай что ближе)

Автоматизированное тестирование, являющееся важнейшим аспектом непрерывной интеграции, часто сталкивается с проблемами при использовании таких мер безопасности, как капча. Необходимость в непрерывных и повторяющихся тестовых запусках может привести к срабатыванию механизмов безопасности, таких как 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 здесь.
import undetected_chromedriver as uc driver = uc.Chrome(headless=True,use_subprocess=False) driver.get('https://rucaptcha.com/42') driver.save_screenshot('captcha.png')
  • DrissionPage: DrissionPage – это библиотека Python, которая автоматизирует взаимодействие с браузером и может использоваться для навигации по веб-сайтам, защищённым Cloudflare, без обнаружения. Изучить документацию DrissionPage можно по ссылке
from DrissionPage import ChromiumPage 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 с помощью:

{ "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. Смотрите более подробную информацию ниже:

Автоматический обход Cloudflare капчи - два противоположных метода (выбирай что ближе)

Примерный ответ:

{ "status": 1, "request": "2122988149" // идентификатор запроса для получения обходного токена }

Шаг 2: Подождите 10 секунд

  • Запрос на шаге 1 запускает задание для обхода Cloudflare вручную. Таким образом, выполнение этой работы занимает 7-10 секунд. Вам нужно подождать.

Шаг 3: Отправьте запрос GET для получения токена cf-turnstile-response

{ "status": 1, "request": "0.WoGeDojxQzHCCk023JRjfxv23olYh37jFdvPrcqmNeQ7PbSYIEuiBTK2SR_GdjfMitYEC23Gm7Vt93U1CPcI6aIFEhG-ffe1i9e6tIfIlYCFtb7OMxTB4tKCyTdpiaA.SP5YT77nuMNdOhZlvoBWAQ.da6448d22df7dd92f56a9fcf6d7138e5ee712bcf7d00c281f419b3bc091cbe64" }

Шаг 4: Установите значение для ввода cf-turnstile-response на вкладке консоли инструмента разработки.

document.querySelector('[name="cf-turnstile-response"]').value = 'TOKEN';

Шаг 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.
Endpoint: https://2captcha.com/in.php 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.
// Этот файл называется 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 } // мы перехватим сообщение в puppeeter console.log('intercepted-params:' + JSON.stringify(params)) window.cfCallback = b.callback return } } }, 50)
  • В Puppeteer используйте метод Page.evaluateOnNewDocument(inject_script), чтобы вводить скрипт всякий раз, когда загружается новый документ. Сохраните приведённый выше JS-скрипт в файле с именем inject.js, сценарий для обхода будет:
import { launch } from 'puppeteer' 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();, чтобы внедрить скрипт.
string injectedScripts = File.ReadAllText("inject.js", Encoding.UTF8); ((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);
// Запротоколировать сообщение с помощью команды inject.js для параметров 2captcha 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}’);”
if (message != null) { 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 становится надёжным и жизнеспособным решением.

Важно отметить, что методы автоматического обхода должны использоваться ответственно и с соблюдением этических норм. Надеемся, что эта тема окажется для Вас полезной!

Ссылки

33
1 комментарий

Спасибо, написал этот комментарий через селениум драйвер

1
Ответить