///
Динамические параметры капчи: что это, как их идентифицировать, методы извлечения
Екатерина Янчук
Екатерина Янчук
Автор технических статей
9 июня 2026 г.
15 мин

 

Как работать с динамическими параметрами капчи: полное руководство

Узнайте, что такое динамические параметры CAPTCHA, как их определить и извлечь, а также о том, как решить капчу с изменяющимися данными.

dynamic-params.png

 

robots
Начните сейчас и автоматизируйте решение reCAPTCHA v2

Капча и другие методы защиты сайтов

 

Сегодня уже сложно представить современные веб-ресурсы без использования некоторых защитных механизмов, например, капчи – проверки на то, что посетитель является реальным человеком, а не ботом, который может нести потенциальную угрозу. Раньше это были в основном текстовые капчи, где нужно вводить в специальное поле символы с картинки или отвечать на несложные вопросы. Со временем системы проверки пользователей и защиты сайтов становятся всё более сложными для обхода автоматизированными программами. А вот для реальных посетителей, наоборот, разработчики стараются минимизировать возможные неудобства – можно даже не догадываться о наличии такой защиты, проверка часто проходит на фоне без участия человека. 

 

Сейчас в основном проверка основана не столько на прохождении конкретного теста, сколько на анализе целой совокупности факторов: поведения пользователя, характеристик его браузера, сетевых запросов и многого другого. Сайт может проверять куки, отпечаток устройства, выполнение JavaScript и дополнительно показывать капчу в случае подозрительной активности.

 

Что такое динамические параметры капчи

 

Ещё один уровень защиты добавляют так называемые динамические параметры. Эти параметры создаются и изменяются при каждом запросе к капче. Они служат уникальными идентификаторами для каждой сессии проверки и в отличие от статических параметров (например, sitekey), которые остаются неизменными, динамические параметры обновляются при каждом запросе к капче. Это значит, что автоматизированная система не может просто повторно использовать однажды полученные значения для успешного прохождения проверки. 

 

Как эти меры защищают от ботов

 

Каждый раз, когда пользователь запрашивает капчу, сервер генерирует новый набор данных (например, challenge, context, token и др.), уникальный для данного сеанса.

Эти параметры предотвращают повторное использование ответов и могут включать в себя информацию о пользователе, сессии, временных метках. Даже если бот может решить одну капчу, повторить тот же процесс с другими динамическими параметрами будет сложно и потребует значительных вычислительных ресурсов. 

 

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

Эти методы направлены на то, что только реальные пользователи смогут пройти через “турникет”, а боты будут заблокированы или затруднены в попытках обойти защиту.  

 

Какие бывают динамические параметры

 

Изменяющиеся параметры капчи отличаются в зависимости от того, какое решение и в целом какой вендор и какая именно система защиты используются. Они генерируются во время сессии или после её прохождения. Давайте ознакомимся с их основными важными типами:

  • Challenge (задача) – это, собственно, сам элемент капчи, который пользователь должен решить для подтверждения своей личности. Он может принимать различные формы, включая текстовые задания, выбор изображений или выполнение определенных действий. Challenge создается сервером при загрузке страницы и представляет собой уникальную задачу для каждого запроса. Пользователь решает Challenge, после этого сервер проверяет ответ и, если он правильный, позволяет пользователю продолжить взаимодействие с сайтом.
  • Token используется для верификации сессии пользователя и подтверждения, что запрос поступает от настоящего пользователя, а не от бота. Токены могут быть созданы на стороне сервера и переданы клиенту для использования в процессе прохождения капчи. Токен обычно генерируется во время начала сессии или при каждом запросе к капче и после успешного прохождения капчи отправляется обратно на сервер для проверки.

Помимо challenge и token, существуют дополнительные параметры, которые могут быть специфичными для различных видов капчи. Вот некоторые из них:

  • context (используется, например, в AWS WAF) – содержит уникальные значения, привязанные к текущей сессии пользователя. Генерируется в скрипте window.gokuProps:

    
    window.gokuProps = {
        "key":"",
        "iv":"",
        "context":""
    };
            
  • geetest_challenge или challenge (используется в GeeTest v.3) – идентификатор капчи, который связывает запрос пользователя с конкретной сессией проверки. Генерируется в URL примерно такого вида (заметьте, что данная ссылка содержит временную метку для предотвращения кэширования запроса):

    
    https://example.com/api/v1/gee-test/init-params?t=1730640766594
            

Также в GeeTest v.3 используются следующие параметры:

  • geetest_validate – код, который подтверждает, что капча была решена корректно. Генерируется после успешного решения капчи и подтверждает, что проверка была пройдена;
  • geetest_seccode – дополнительный код безопасности, который подтверждает успешное решение.
  • dataDome cookie (используется в DataDome) – куки, генерируемые системой DataDome для отслеживания и проверки пользователя на предмет автоматизированных действий и обновляемые в ответ на его поведение.
  • g-recaptcha-response (используется в reCAPTCHA) – токен, полученный после успешного прохождения капчи, нужен для дальнейшей передачи на сервер.
  • cf_clearance (используется в проверках от Cloudflare) – куки, которые генерируются после прохождения капчи для успешного доступа к ресурсу.

Также стоит упомянуть о таких параметрах, как:

  • s (или sentinel/motionData) – могут содержать данные о движениях мыши и взаимодействии с капчей.
  • v (версия) – указывает версию капчи, которая может обновляться на сервере и требует обновлённого значения для каждой сессии.

Приведённые примеры отражают лишь часть параметров, изменяющихся с каждой сессией; на самом деле их довольно много и для каждого типа проверки (капчи) они разные. Знание об их наличии важно для последующего анализа и успешного решения капчи.

 

Поиск динамических параметров, работа с Инструментами разработчика

Важно: ниже приведена информация исключительно для ознакомления, тестирования и автоматизации ваших собственных сайтов, приложений или ресурсов, к которым у вас есть разрешённый доступ. 

Если вы пользуетесь сервисами по автоматическому решению капчи, например, CapMonster Cloud, то в документации этих сервисов в разделах, посвящённых типам капч, обычно указывается, какие именно параметры являются динамическими и где именно в коде они генерируются. Всё это необходимо для того, чтобы извлечь значения и впоследствии использовать их для решения капчи с помощью сервиса. Также полезно обладать базовыми навыками работы с Инструментами разработчика, чтобы быстро находить значения нужных параметров.

Для начала давайте определим основные способы генерации таких параметров:

1. С помощью JavaScript (на стороне клиента)

Когда вы открываете страницу с капчей, загружается скрипт, который отслеживает ваши действия – движения мыши, клики, нажатия клавиш. JavaScript генерирует параметры – некоторые элементы и формы, промежуточные окна проверки (как в случае с Cloudflare Challenge), случайные числа, данные о ваших взаимодействиях и информацию об устройстве. Затем эти данные шифруются или обрабатываются и отправляются на сервер.

2. С помощью API (на стороне сервера)

В процессе обработки запроса капчи сервер может добавить полезные параметры, например, сессионные идентификаторы или хэшированные значения. Также API может возвращать параметры, которые понадобятся для создания новой сессии капчи – они обновляются на сервере автоматически для каждой попытки.

Для наглядности рассмотрим оба способа. В качестве примера возьмём капчу от Amazon с генерацией context через JavaScript и GeeTest v.3 с генерацией ключа challenge через API:

Amazon (AWS WAF)

В данном типе капчи важные параметры (среди них меняющийся context) загружаются через специальный скрипт клиентской защиты:

AWS WAF example

Найти его можно с помощью Инструментов разработчика среди элементов на целевой странице.

 

GeeTest v.3

Здесь генерация параметров капчи происходит через API, отследить необходимый URL можно в запросах во вкладке Network:

image.png

Там же генерируется временная метка для того, чтобы запрос был привязан к определённому времени.

 

Как узнать, какие именно параметры являются динамическими?

 

Определить нужные параметры можно с помощью анализа запросов и ответов между браузером и сервером. Вот основные способы и пошаговый подход:

  • Инструменты разработчика:
  1. Откройте веб-страницу с капчей;
  2. Нажмите F12 и перейдите на вкладку Network;
  3. Найдите запросы, связанные с капчей (обычно это запросы к серверам капчи, например, api.geetest.com и др.);
  4. Проверьте параметры, передаваемые в этих запросах, например: ?t=123456789123;
  5. Сравните несколько запросов;
  6. Обновите страницу несколько раз;
  7. Сравните параметры. Если значения меняются между запросами – они динамические;
  8. Найдите вызовы JavaScript
  • Ищите в DevTools во вкладке Source или Elements. Проверьте, какие скрипты подключаются;
  • Найдите генерацию параметров, таких как timestamp, context, challenge и др.;
  • Ищите ключевые слова: в JavaScript коде часто используются функции для генерации динамических параметров;
  1. Анализируйте запросы на сервер. Некоторые параметры формируются сервером. Эти данные необходимо сохранить и использовать в следующем запросе. Если последовательность запросов нарушена (например, устаревшие куки), сервер может отклонить проверку.
  • Снифферы и прокси-серверы для анализа

Эти инструменты (например, Charles Proxy) позволяют анализировать запросы, находить динамические параметры и тестировать изменения, помогают понять их логику и проверить, как сервер обрабатывает модифицированные запросы.

Работа этих инструментов включает в себя:

  • Инструменты фиксируют запросы к серверу капчи (например, с параметрами t, challenge, context).
  • Исследуются заголовки, параметры URL, тело запросов и куки для выявления ключевых значений.
  • Изменяются параметры (например, токены) для проверки их влияния на серверный ответ.
  • Тестируется, как сервер реагирует на изменённые данные.

 

Краткая инструкция по использованию Charles Proxy для анализа параметров капчи:

  1. Загрузите и установите Charles Proxy.
  2. Включите SSL Proxying через ProxySSL Proxying Settings. Добавьте домен капчи.
  3. Запустите Charles и браузер со страницей, где загружается капча.
  4. Перейдите на страницу, чтобы начать запись запросов.
  5. Во вкладке Structure найдите запросы к CAPTCHA-сервисам (например, www.google.com/recaptcha/api.js).
  6. Откройте запросы/ответы и изучите параметры, передаваемые в них (token, sitekey, challenge, cookies и тд).

Charles Proxy example

Работа с параметрами капчи в Charles Proxy

 

Автоматизация с помощью инструментов: использование Selenium, Puppeteer, Playwright

 

Ещё одним способом анализировать данные капч и в сочетании с другими инструментами автоматизировать их обход являются эмуляторы браузеров – например, Selenium, Puppeteer и Playwright.

 

Общие возможности Selenium, Puppeteer и Playwright

 

Автоматизация. Все три инструмента позволяют управлять браузерами, выполнять обычные пользовательские действия: клики, ввод текста, переходы по страницам и тд. Всё это можно сделать автоматизированным.

Поддержка работы с динамическим контентом. Selenium, Puppeteer и Playwright могут работать с JavaScript, благодаря этому можно обрабатывать динамически загружаемые элементы страницы.

Тестирование. Они широко используются для автоматизации тестирования различных веб-приложений.

 

Как эмуляторы браузеров помогают определить динамический контент?

 

Ожидание элементов. Можно настроить ожидание загрузки элементов – это позволяет захватывать данные после завершения загрузки страницы.

Анализ ответов. Позволяют перехватывать сети-запросы, чтобы видеть изменения в данных, которые поступают из API.

Скриптовый доступ. При помощи встроенных средств (например, в Puppeteer) можно выполнять JavaScript для извлечения информации из динамически загружаемых элементов.

 

Методы и параметры для работы с динамическим контентом:

 

Selenium

Перехват DOM-элементов

Используйте методы find_element_by_xpath или find_element_by_css_selector, для доступа к значениям, связанным с капчей.

Скрипты JavaScript

Выполняйте JavaScript напрямую с помощью driver.execute_script().

Логирование запросов через прокси

Интеграция с BrowserMob Proxy для анализа сетевого трафика.

Вы можете извлекать данные заголовков, тела запросов, токенов и параметров капчи.

 

Puppeteer

Перехват запросов и ответов

Используйте page.on('request') и page.on('response') для захвата сетевого трафика.

Динамические значения DOM

С помощью методов, например, page.evaluate(), анализируйте параметры на уровне страницы.

Cookie и localStorage

Используйте page.cookies() или page.evaluate() для анализа хранилищ.

 

Playwright

Сетевые запросы

page.on('request') и page.on('response') для мониторинга сетевых данных.

Анализ DOM

page.locator() для извлечения данных из элементов.

Выполнение JavaScript

Применяйте page.evaluate() для анализа и извлечения параметров из скриптов.

 

Использование CapMonster Cloud

 

После того, как вы проанализировали и нашли все необходимые параметры капчи, следующим шагом станет использование CapMonster Cloud для создания и отправки задачи на сервер, чтобы автоматически решить капчу. Интегрировать этот инструмент в ваш код очень просто. Сервис поддерживает такие языки программирования, как Python, JavaScript, C#. Всё, что нужно, – это выбрать подходящий язык и установить официальную библиотеку для его использования.

 

Пример интеграции CapMonster Cloud в код на Python:

 

  1. Для начала зарегистрируйтесь в CapMonster Cloud и получите API-ключ для доступа к сервису.
  2. Установите библиотеку

Для Python установите официальную библиотеку через pip:

pip install capmonstercloudclient
  1. В вашем коде создайте задачу для решения капчи и получите решение. Пример решения reCAPTCHA v2 на Python:
# https://github.com/CapMonsterCloud/capmonstercloud-client-python

import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV2Request
# from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo  # Раскомментируйте, если планируете использовать прокси

API_KEY = "YOUR_API_KEY"  # Укажите ваш API-ключ CapMonster Cloud

async def solve_recaptcha_v2():
    client_options = ClientOptions(api_key=API_KEY)
    cap_monster_client = CapMonsterClient(options=client_options)

    # Базовый пример без прокси
    # CapMonster Cloud автоматически использует свои прокси
    recaptcha2_request = RecaptchaV2Request(
        websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
        websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd"
    )

    # Пример использования вашего собственного прокси
    # Раскомментируйте данный блок, если вы хотите использовать собственный прокси
    # proxy = ProxyInfo(
    #     proxyType="http",
    #     proxyAddress="123.45.67.89",
    #     proxyPort=8080,
    #     proxyLogin="username",
    #     proxyPassword="password"
    # )

    # recaptcha2_request = RecaptchaV2Request(
    #     websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
    #     websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd",
    #     proxy=proxy,
    #     userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36"
    # )

    # При необходимости можно проверить баланс
    balance = await cap_monster_client.get_balance()
    print("Balance:", balance)

    result = await cap_monster_client.solve_captcha(recaptcha2_request)
    print("Solution:", result)

asyncio.run(solve_recaptcha_v2())
Подробную информацию по типам капч и необходимым для создания задачи на решение параметрам смотрите в документации.
  1. После получения решения отправьте его на веб-страницу в форму, где требуется подтверждение.

 

Примеры извлечения динамических параметров и решения капчи

 

В этом разделе представлены примеры извлечения динамических параметров и решения различных типов капчи с использованием JavaScript (Node.js), Python и C#. 
Для автоматизации используется Selenium или встроенные HTTP-запросы в зависимости от типа проверки.

Важно: перед началом работы ознакомьтесь со списком всех нужных параметров в документации CapMonster Cloud:

для GeeTest v3

для Cloudflare Challenge

для AWS WAF

 

GeeTest v3 (с получением динамических параметров через API): 

 

Данный тип капчи содержит необходимые для создания запроса на сервер CapMonster Cloud динамические параметры. Параметры генерируются через API с использованием URL следующего вида: https://example.com/api/v1/gee-test/init-params?t=${t}. При этом дополнительные инструменты для автоматизации браузера не требуются –  можно использовать встроенный Fetch (для Node.js), Requests (для Python) и Newtonsoft.Json (для C#). 

 

Node.js

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-js


// Импортируем необходимые зависимости
import { CapMonsterCloudClientFactory, ClientOptions, GeeTestRequest } from '@zennolab_com/capmonstercloud-client';

async function run() {
// Создаём клиент CapMonster Cloud
  const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({
    clientKey: 'your_api_key', // Замените на ваш API-ключ CapMonsterCloud
  }));

  // Получаем параметры капчи через API
  const t = new Date().getTime();
  const response = await fetch(`https://example.com/api/v1/gee-test/init-params?t=${t}`);  // Получаем динамические параметры для капчи GeeTest через API. Убедитесь, что используете правильный URL для вашего случая
  const data = await response.json();
  
  const { challenge, gt } = data;

  const geeTestProxylessRequest = new GeeTestRequest({
    websiteURL: "https://example.com", // URL страницы с капчей
    gt: gt, // Параметр gt, полученный через API
    challenge: challenge, // Параметр challenge, полученный через API
  });

  const solutionResponse = await cmcClient.Solve(geeTestProxylessRequest);

  if (!solutionResponse || !solutionResponse.solution) {
    throw new Error('Капча не решена.');
  }

  console.log('Капча решена:', solutionResponse.solution);
}

run()
  .then(() => {
    console.log('DONE');
    process.exit(0);
  })
  .catch((err) => {
    console.error(err);
    process.exit(1);
  });

        

Python

Показать код
# https://github.com/CapMonsterCloud/capmonsterclient-python

# Импортируем необходимые зависимости
import requests
import asyncio
import time
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import GeetestRequest

async def run():
    # Создаём клиент CapMonster Cloud
    client_options = ClientOptions(api_key='your_api_key')  # Замените на ваш API-ключ CapMonsterCloud
    cmc_client = CapMonsterClient(options=client_options)

    # Получаем параметры капчи через API
    t = int(time.time() * 1000)  # Получаем текущую метку времени в миллисекундах
    response = requests.get(f'https://example.com/api/v1/gee-test/init-params?t={t}')
    data = response.json()

    challenge = data.get('challenge')
    gt = data.get('gt')

    if not challenge or not gt:
        raise ValueError('Не удалось получить параметры для капчи.')

    # Создаем запрос для решения капчи
    gee_test_proxyless_request = GeetestRequest(
        websiteUrl='https://example.com',  # URL страницы с капчей
        gt=gt,  
        challenge=challenge 
    )

    # Отправляем запрос на решение капчи
    solution_response = await cmc_client.solve_captcha(gee_test_proxyless_request)

    if not solution_response or not solution_response:
        raise ValueError('Капча не решена.')

    print('Капча решена:', solution_response)

asyncio.run(run())

        

C#

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-dotnet

// Импортируем библиотеку CapMonster Cloud и необходимые зависимости
using Zennolab.CapMonsterCloud.Requests;
using Zennolab.CapMonsterCloud;
using Newtonsoft.Json;

class Program
{
    static async Task Main(string[] args)
    {
        // Настройка клиента с вашим API-ключом CapMonster Cloud
        var clientOptions = new ClientOptions
        {
            ClientKey = "your_api_key" // Замените на ваш API-ключ CapMonster Cloud
        };

        // Создание клиента CapMonster Cloud с использованием заданных настроек
        var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);

        // Создание HTTP клиента для отправки запросов
        using var httpClient = new HttpClient();

        // Получаем текущий временной штамп для запроса
        var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

        // Формируем URL для получения динамических параметров капчи GeeTest
        var requestUrl = $"https://example.com/api/v1/captcha/gee-test/init-params?t={timestamp}";

        // Отправляем запрос и получаем ответ в виде строки
        var response = await httpClient.GetStringAsync(requestUrl);
        dynamic data = JsonConvert.DeserializeObject(response);

        // Создаём запрос для решения капчи GeeTest с полученными параметрами
        var geetestRequest = new GeeTestRequest
        {
            WebsiteUrl = "https://example.com/demo/geetest", // URL страницы с капчей
            Gt = data.gt, // Параметр gt, полученный из ответа
            Challenge = data.challenge // Параметр challenge, полученный из ответа
        };

        // Отправка запроса на решение капчи и получение результата
        var geetestResult = await cmCloudClient.SolveAsync(geetestRequest);

        Console.WriteLine($"Решение капчи:\nChallenge: {geetestResult.Solution.Challenge}\nValidate:  {geetestResult.Solution.Validate}\nSecCode:   {geetestResult.Solution.SecCode}");
    }
}

 


Cloudflare Challenge

 

При работе с CapMonster Cloud вы можете выбрать один из двух способов получения результата: токен или cookie cf_clearance, которые можно использовать для последующих запросов к целевой странице или для подстановки в браузерную сессию.

В примере ниже мы покажем, как с помощью Selenium получить параметры и сгенерировать решение для получения токена, а для получения cookie cf_clearance мы будем использовать HTTP-запросы.

 

Метод 1. Токен

 

Node.js

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-js

// Импортируем библиотеку CapMonster Cloud
import { Builder } from "selenium-webdriver";
import { Options } from "selenium-webdriver/chrome.js";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";

(async function example() {
  // Создание объекта настроек для Chrome
  const options = new Options();

  // Создание и запуск драйвера для браузера Chrome
  const driver = await new Builder()
    .forBrowser("chrome")
    .setChromeOptions(options) // Устанавливаем настройки для Chrome
    .build();

  let params = null; // Переменная для хранения параметров капчи

  try {
    while (!params) {
      // Открытие страницы с капчей
      await driver.get(
        "https://example.com/challenge-page",
      ); // URL страницы с капчей

      // Выполнение JavaScript на странице для захвата параметров капчи
      await driver.executeScript(`
        window.turnstile = new Proxy(window.turnstile, {
          get(target, prop) {
            if (prop === 'render') {
              return function(a, b) {
                let p = {
                  websiteKey: b.sitekey,
                  websiteURL: window.location.href, 
                  data: b.cData, 
                  pagedata: b.chlPageData,
                  action: b.action,
                  userAgent: navigator.userAgent 
                };

                console.log(JSON.stringify(p)); 
                window.params = p; 
                window.turnstileCallback = b.callback; 
                return target.render.apply(this, arguments);
              }
            }
            return target[prop];
          }
        });
      `);

      // Получение параметров из глобальной переменной window.params
      params = await driver.executeAsyncScript(`
        const callback = arguments[arguments.length - 1]; // Получаем callback для завершения
        setTimeout(() => {
          callback(window.params); // Передаем параметры через callback
        }, 5000);
      `);

      if (!params) {
        console.log("Параметры не получены, перезагружаем страницу...");
        await driver.sleep(3000);
      }
    }

    console.log("Параметры:", params); // Выводим полученные параметры

    // Создание клиента CapMonster Cloud с использованием API-ключа
    const cmcClient = CapMonsterCloudClientFactory.Create(
      new ClientOptions({
        clientKey: "YOUR_API_KEY", // Замените на ваш API-ключ CapMonster Cloud
      }),
    );

    // Создание запроса для решения капчи Turnstile с полученными параметрами
    const turnstileRequest = new TurnstileRequest({
      websiteURL: params.websiteURL,
      websiteKey: params.websiteKey,
      data: params.data,
      action: params.action,
      cloudflareTaskType: "token",
      pageAction: "managed",
      pageData: params.pagedata,
    });

    // Отправка запроса на решение капчи
    const response = await cmcClient.Solve(turnstileRequest);

    // Проверка, решена ли капча
    if (!response || !response.solution) {
      throw new Error("Капча не решена.");
    }

    console.log("Капча решена:", response.solution); // Выводим решение капчи

    // Выполнение JavaScript на странице для передачи полученного токена в callback функцию
    await driver.executeScript(`
      window.turnstileCallback('${response.solution.token}'); // Передаем токен решения капчи в callback функцию
    `);
  } catch (err) {
    console.error("Ошибка:", err);
  } finally {
    await driver.quit();
  }
})();

Python

Показать код
# https://github.com/CapMonsterCloud/capmonsterclient-python

# Импортируем необходимые зависимости
import asyncio
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest

# Настройка CapMonsterCloud с использованием API-ключа
client_options = ClientOptions(api_key="your_api_key")  # Замените на ваш API-ключ CapMonsterCloud
cap_monster_client = CapMonsterClient(options=client_options)

# Функция для получения параметров капчи
async def get_turnstile_params(driver):
    params = None  # Переменная для хранения параметров капчи
    while not params: 
        driver.get("https://example.com")  # Открываем веб-страницу с капчей

        # Выполняем JavaScript-код для перехвата функции render и извлечения параметров
        driver.execute_script("""
            window.turnstile = new Proxy(window.turnstile, {
                get(target, prop) {
                    if (prop === 'render') {
                        return function(a, b) {
                            let p = {
                                websiteKey: b.sitekey, 
                                websiteURL: window.location.href,  
                                data: b.cData, 
                                pagedata: b.chlPageData,
                                action: b.action,  
                                userAgent: navigator.userAgent 
                            };
                            console.log(JSON.stringify(p)); 
                            window.params = p;  
                            window.turnstileCallback = b.callback;
                            return target.render.apply(this, arguments);  
                        };
                    }
                    return target[prop];
                }
            });
        """)

        # Извлекаем параметры из глобальной переменной `window.params` через execute_async_script
        params = driver.execute_async_script("""
            const callback = arguments[arguments.length - 1];
            setTimeout(() => {
                callback(window.params);
            }, 5000); 
        """)

        if not params:
            print("Параметры не получены, перезагружаем страницу...")
            await asyncio.sleep(3) 

    return params  # Возвращаем полученные параметры

async def solve_turnstile(params):
    # Создаем запрос для решения капчи с использованием CapMonsterCloud
    request = TurnstileRequest(
        websiteURL=params["websiteURL"], 
        websiteKey=params["websiteKey"], 
        data=params["data"],  
        action=params["action"], 
        pageAction="managed", 
        cloudflareTaskType="token", 
        pageData=params["pagedata"], 
        userAgent=params["userAgent"] 
    )
    # Отправляем запрос на решение капчи и получаем токен
    response = await cap_monster_client.solve_captcha(request)
    return response["token"] 

async def main():
    chrome_options = Options()
    driver = webdriver.Chrome(service=ChromeService(), options=chrome_options)

    try:
        # Получаем параметры капчи
        params = await get_turnstile_params(driver)
        print("Параметры получены:", params)

        # Решаем капчу и получаем токен
        token = await solve_turnstile(params)
        print("Капча решена. Токен:", token)

        # Выполняем JavaScript для передачи токена в callback-функцию
        driver.execute_script(f"window.turnstileCallback('{token}');")

    except Exception as e:
        # Обрабатываем ошибки, если они возникают
        print(f"Ошибка: {e}")

    finally:
        await asyncio.sleep(5)
        driver.quit()

asyncio.run(main())


C#

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-dotnet

// Импортируем необходимые зависимости
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;

class Program
{
    static async Task Main(string[] args)
    {
        // Настройки CapMonster Cloud с использованием API-ключа
        var clientOptions = new ClientOptions
        {
            ClientKey = "your_api_key" // Замените на ваш API-ключ CapMonster Cloud
        };

        // Создаем клиент для работы с CapMonster Cloud
        var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);

        // Настройки ChromeDriver
        var chromeOptions = new ChromeOptions();

        // Инициализация драйвера Chrome
        using var driver = new ChromeDriver(chromeOptions);

        // Получение параметров капчи
        var paramsObtained = await GetTurnstileParams(driver);
        Console.WriteLine("Параметры получены: " + string.Join(", ", paramsObtained));

        // Создание запроса на решение капчи
        var turnstileRequest = new TurnstileRequest
        {
            WebsiteUrl = paramsObtained["websiteURL"].ToString(),
            WebsiteKey = paramsObtained["websiteKey"].ToString(),
            Data = paramsObtained["data"].ToString(),
            PageAction = paramsObtained["pageAction"].ToString(),
            CloudflareTaskType = "token",
            PageData = paramsObtained["pagedata"].ToString(),
            UserAgent = paramsObtained["userAgent"].ToString()
        };

        // Решение капчи с использованием CapMonster Cloud
        var turnstileResult = await cmCloudClient.SolveAsync(turnstileRequest);
        Console.WriteLine("Капча решена. Токен: " + turnstileResult.Solution.Value);

        // Передача токена в callback-функцию на странице
        ((IJavaScriptExecutor)driver).ExecuteScript($"window.turnstileCallback('{turnstileResult.Solution.Value}');");

        await Task.Delay(5000);
    }

    // Функция для получения параметров капчи
    static async Task<Dictionary<string, object>> GetTurnstileParams(IWebDriver driver)
    {
        Dictionary<string, object> paramsObtained = null; // Переменная для хранения параметров

        while (paramsObtained == null) // Повторяем, пока параметры не будут получены
        {
            driver.Navigate().GoToUrl("https://example.com"); // Открываем страницу с капчей

            // Выполняем JavaScript для перехвата параметров капчи
            ((IJavaScriptExecutor)driver).ExecuteScript(@"
                window.turnstile = new Proxy(window.turnstile, {
                    get(target, prop) {
                        if (prop === 'render') {
                            return function(a, b) {
                                let p = {
                                    websiteURL: window.location.href, 
                                    websiteKey: b.sitekey,
                                    data: b.cData, 
                                    pageAction: b.action,
                                    pagedata: b.chlPageData, 
                                    userAgent: navigator.userAgent 
                                };
                                console.log(JSON.stringify(p)); 
                                window.params = p; 
                                window.turnstileCallback = b.callback; 
                                return target.render.apply(this, arguments); 
                            };
                        }
                        return target[prop]; 
                    }
                });
            ");

            // Извлекаем параметры из глобальной переменной `window.params` через ExecuteAsyncScript
            paramsObtained = await Task.Run(() =>
            {
                return (Dictionary<string, object>)((IJavaScriptExecutor)driver).ExecuteAsyncScript(@"
                    const callback = arguments[arguments.length - 1]; // Callback для завершения выполнения
                    setTimeout(() => {
                        callback(window.params); // Передаем параметры через callback
                    }, 5000); 
                ");
            });

            // Если параметры не получены, ждем перед повторной попыткой
            if (paramsObtained == null)
            {
                Console.WriteLine("Параметры не получены, перезагружаем страницу...");
                await Task.Delay(3000);
            }
        }

        return paramsObtained; // Возвращаем полученные параметры
    }
}



 


 

Метод 2. Cookie cf_clearance

 

Node.js

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-js

import { Buffer } from "buffer";
import {
  CapMonsterCloudClientFactory,
  ClientOptions,
  TurnstileRequest,
} from "@zennolab_com/capmonstercloud-client";

import { ProxyAgent } from "undici";

async function main() {
  const API_KEY = "YOUR_API_KEY_HERE";

  const URL = "https://www.example.com/"; // Замените на нужный URL

  const cmcClient = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: API_KEY }),
  );

  // ===== ПРОКСИ =====
  const proxy = {
    proxyType: "http",
    proxyAddress: "PROXY_ADDRESS_HERE",
    proxyPort: 1234,
    proxyLogin: "PROXY_LOGIN_HERE",
    proxyPassword: "PROXY_PASSWORD_HERE",
  };

  const proxyUrl = `http://${proxy.proxyLogin}:${proxy.proxyPassword}@${proxy.proxyAddress}:${proxy.proxyPort}`;
  const dispatcher = new ProxyAgent(proxyUrl);

  const userAgent =
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36";

  // ===== 1. ПОЛУЧАЕМ HTML =====
  const res = await fetch(URL, {
    dispatcher,
    headers: {
      // Установите нужные заголовки
      "User-Agent": userAgent,
      Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    },
  });

  const html = await res.text();

  console.log("Статус:", res.status);

  const htmlBase64 = Buffer.from(html, "utf-8").toString("base64");

  // ===== 2. ЗАПРОС В CAPMONSTER CLOUD =====
  const turnstileRequest = new TurnstileRequest({
    websiteURL: URL,
    websiteKey: "xxxxx",
    cloudflareTaskType: "cf_clearance",
    proxy,
    htmlPageBase64: htmlBase64,
    userAgent,
  });

  const result = await cmcClient.Solve(turnstileRequest);

  const cookie = result.solution?.cf_clearance || result.solution;

  console.log("cf_clearance:", cookie);

  // ==========================
  // УСТАНОВКА COOKIE
  // ==========================
  const cookieHeader = `cf_clearance=${cookie}`;

  // ===== 3. ПОВТОРНЫЙ ЗАПРОС С COOKIE =====
  const res2 = await fetch(URL, {
    dispatcher,
    headers: {
      // Установите нужные заголовки
      "User-Agent": userAgent,
      Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
      Cookie: cookieHeader,
    },
  });

  const html2 = await res2.text();

  console.log("Итоговый статус:", res2.status);
  console.log("Фрагмент итогового HTML:\n", html2.slice(0, 800));
}

main().catch(console.error);

Python

Показать код
# https://github.com/CapMonsterCloud/capmonsterclient-python

import asyncio
import base64
import requests
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import TurnstileRequest
from capmonstercloudclient.requests.baseRequestWithProxy import ProxyInfo  # Используем ProxyInfo

API_KEY = "YOUR_API_KEY_HERE"  # Укажите ваш API-ключ CapMonster Cloud

async def solve_cf_clearance():
    client_options = ClientOptions(api_key=API_KEY)
    cap_monster_client = CapMonsterClient(options=client_options)

    # Пример настройки прокси
    proxy = ProxyInfo(
        proxyType="http",
        proxyAddress="PROXY_ADDRESS_HERE",
        proxyPort=1234,
        proxyLogin="PROXY_LOGIN_HERE",
        proxyPassword="PROXY_PASSWORD_HERE" 
    )

    # ===== ПОЛУЧАЕМ HTML-СТРАНИЦУ И КОНВЕРТИРУЕМ В BASE64 =====
    URL = "https://www.example.com"
    UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36"
    
    PROXY_URL = f"http://{proxy.proxyLogin}:{proxy.proxyPassword}@{proxy.proxyAddress}:{proxy.proxyPort}"
    PROXY_DICT = {
        "http": PROXY_URL,
        "https": PROXY_URL
    }
    
    session = requests.Session()
    session.proxies.update(PROXY_DICT)
    # Установите нужные заголовки
    session.headers.update({
        "User-Agent": UA,
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
        "Upgrade-Insecure-Requests": "1",
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "none",
        "Sec-Fetch-User": "?1",
        "sec-ch-ua": '"Chromium";v="148", "Google Chrome";v="148", "Not:A-Brand";v="99"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"Windows"'
    })
    
    # Первый запрос для получения страницы с капчей
    resp = session.get(URL, verify=True, timeout=30)
    print("Начальный статус:", resp.status_code)
    print("\n--- Фрагмент исходной страницы ---")
    print(resp.text[:800])
    print("\n----------------------------------\n")
    
    html_base64 = base64.b64encode(resp.content).decode()
    # ===== КОНЕЦ ИЗВЛЕЧЕНИЯ BASE64 =====

    # Cloudflare cf_clearance решается только с вашим прокси
    turnstile_request = TurnstileRequest(
        websiteURL=URL,
        websiteKey="xxxxx",
        cloudflareTaskType="cf_clearance",
        htmlPageBase64=html_base64,
        userAgent=UA,
        proxy=proxy
    )

    # При необходимости можно проверить баланс
    balance = await cap_monster_client.get_balance()
    print("Баланс:", balance)

    result = await cap_monster_client.solve_captcha(turnstile_request)
    print("Решение:", result)
    
    # Получаем cf_clearance из результата
    cf_clearance_cookie = result.get("gRecaptchaResponse") or result.get("cf_clearance")
    print("cf_clearance:", cf_clearance_cookie)
    
    # Устанавливаем куки cf_clearance в сессию
    session.cookies.set("cf_clearance", cf_clearance_cookie)
    
    # Второй запрос с установленными куки
    resp2 = session.get(URL, verify=True, timeout=30)
    print("Итоговый статус:", resp2.status_code)
    print("\n--- Фрагмент итоговой страницы ---")
    print(resp2.text[:800])

asyncio.run(solve_cf_clearance())

C#

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-dotnet

using System;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;

class Program
{
    static async Task Main(string[] args)
    {
        var API_KEY = "YOUR_API_KEY_HERE"; // Замените на ваш API-ключ CapMonster Cloud

        var URL =
            "https://www.example.com";

        // ===================== КЛИЕНТ CAPMONSTER CLOUD =====================
        var cmCloudClient = CapMonsterCloudClientFactory.Create(
            new ClientOptions
            {
                ClientKey = API_KEY
            }
        );

        // ===================== НАСТРОЙКА ПРОКСИ =====================
        var proxyHost = "YOUR_PROXY_ADDRESS_HERE";
        var proxyPort = 1234;
        var proxyUser = "YOUR_PROXY_LOGIN_HERE";
        var proxyPass = "YOUR_PROXY_PASSWORD_HERE";

        var proxy = new WebProxy(proxyHost, proxyPort)
        {
            Credentials = new NetworkCredential(proxyUser, proxyPass)
        };

        // ===================== HTTP-КЛИЕНТ =====================
        var handler = new HttpClientHandler
        {
            Proxy = proxy,
            UseProxy = true,
            UseCookies = true,
            CookieContainer = new CookieContainer()
        };

        var http = new HttpClient(handler);

        var userAgent =
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36";
        // Установите нужные заголовки
        http.DefaultRequestHeaders.UserAgent.ParseAdd(userAgent);
        http.DefaultRequestHeaders.Accept.ParseAdd(
            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        );

        // ===================== 1. НАЧАЛЬНЫЙ ЗАПРОС =====================
        var response = await http.GetAsync(URL);

        Console.WriteLine($"Начальный статус: {(int)response.StatusCode} {response.StatusCode}");

        var html = await response.Content.ReadAsStringAsync();

        Console.WriteLine(html.Substring(0, Math.Min(800, html.Length)));

        var htmlBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(html));

        // ===================== 2. РЕШЕНИЕ CF CHALLENGE =====================
        var turnstileRequest = new TurnstileRequest
        {
            WebsiteUrl = URL,
            WebsiteKey = "xxxxx",
            CloudflareTaskType = "cf_clearance",
            HtmlPageBase64 = htmlBase64,
            UserAgent = userAgent,
            Proxy = new ProxyContainer(
                proxyHost,
                proxyPort,
                ProxyType.Http,
                proxyUser,
                proxyPass
            )
        };

        var result = await cmCloudClient.SolveAsync(turnstileRequest);

        var cookie = result.Solution?.Clearance?.ToString();

        Console.WriteLine("\nCookie cf_clearance:");
        Console.WriteLine(cookie);

        if (string.IsNullOrEmpty(cookie))
        {
            Console.WriteLine("Токен не получен");
            return;
        }

        // ===================== УСТАНОВКА COOKIE =====================
        handler.CookieContainer.Add(
            new Uri(URL),
            new Cookie("cf_clearance", cookie)
        );

        // ===================== 3. ЗАПРОС С COOKIE =====================
        var finalResponse = await http.GetAsync(URL);

        Console.WriteLine($"Итоговый статус: {(int)finalResponse.StatusCode} {finalResponse.StatusCode}");

        var finalHtml = await finalResponse.Content.ReadAsStringAsync();

        Console.WriteLine(finalHtml.Substring(0, Math.Min(800, finalHtml.Length)));
    }
}

        

 


AWS WAF:

 

Для Amazon AWS WAF используется Selenium для извлечения параметров и последующего получения решения через CapMonster Cloud.

Node.js

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-js

// Импортируем необходимые зависимости
import { Builder } from "selenium-webdriver";
import { Options } from "selenium-webdriver/chrome.js";
import {
  CapMonsterCloudClientFactory,
  ClientOptions,
  AmazonRequest,
} from "@zennolab_com/capmonstercloud-client";

(async function run() {
  // Настройки Chrome
  const options = new Options();
  // options.addArguments("--headless=new");

  // Создаем и запускаем ChromeDriver
  const driver = await new Builder()
    .forBrowser("chrome")
    .setChromeOptions(options)
    .build();

  const pageUrl =
    "https://www.example.com/amazon-captcha-page"; // Замените на URL страницы с капчей Amazon

  try {
    // ===== 1. ОТКРЫВАЕМ СТРАНИЦУ =====
    await driver.get(pageUrl);

    // ===== 2. ПОЛУЧАЕМ ПАРАМЕТРЫ AWS WAF CAPTCHA =====
    const captchaParams = await driver.executeScript(() => {
      const gokuProps = window.gokuProps || {};
      const scripts = [...document.querySelectorAll("script")];

      return {
        websiteKey: gokuProps.key || null,
        context: gokuProps.context || null,
        iv: gokuProps.iv || null,
        challengeScriptUrl:
          scripts.find((s) => s.src.includes("challenge.js"))?.src || null,
        captchaScriptUrl:
          scripts.find((s) => s.src.includes("captcha.js"))?.src || null,
      };
    });

    console.log("Параметры CAPTCHA:");
    console.dir(captchaParams, { depth: null });

    // ===== 3. СОЗДАЕМ КЛИЕНТ CAPMONSTER CLOUD =====
    const cmcClient = CapMonsterCloudClientFactory.Create(
      new ClientOptions({
        clientKey: "YOUR_CAPMONSTER_API_KEY", // Замените на ваш API-ключ CapMonster
      }),
    );

    // ===== 4. СОЗДАЕМ ЗАПРОС НА РЕШЕНИЕ AWS WAF CAPTCHA =====
    const request = new AmazonRequest({
      websiteURL: pageUrl,
      challengeScript: captchaParams.challengeScriptUrl,
      captchaScript: captchaParams.captchaScriptUrl,
      websiteKey: captchaParams.websiteKey,
      context: captchaParams.context,
      iv: captchaParams.iv,
      cookieSolution: true,
    });

    // ===== 5. ОТПРАВЛЯЕМ ЗАПРОС В CAPMONSTER CLOUD =====
    const response = await cmcClient.Solve(request);

    console.log("Полный ответ:");
    console.dir(response, { depth: null });

    if (!response?.solution) {
      throw new Error("CapMonster Cloud вернул пустое решение");
    }

    const solution = response.solution;

    const wafToken = solution.cookies?.["aws-waf-token"];

    if (!wafToken) {
      throw new Error(
        `Токен AWS WAF не найден:\n${JSON.stringify(solution, null, 2)}`,
      );
    }

    console.log("Токен AWS WAF:");
    console.log(wafToken);

    // ==========================
    // УСТАНОВКА COOKIE
    // ==========================
    await driver.manage().deleteCookie("aws-waf-token");

    await driver.manage().addCookie({
      name: "aws-waf-token",
      value: wafToken,
      path: "/",
      secure: true,
    });

    const cookies = await driver.manage().getCookies();

    console.log("Cookies после установки:");
    console.dir(cookies, { depth: null });

    // ===== 6. ОБНОВЛЯЕМ СТРАНИЦУ =====
    console.log("Обновляем страницу...");
    await driver.navigate().refresh();

    // Даём время на загрузку страницы после обновления
    await driver.sleep(3000);

    console.log("Текущий URL:");
    console.log(await driver.getCurrentUrl());
  } catch (err) {
    console.error("ОШИБКА:");
    console.error(err);
  } finally {
    // await driver.quit();
  }
})()
  .then(() => {
    console.log("ГОТОВО");
    process.exit(0);
  })
  .catch((err) => {
    console.error(err);
    process.exit(1);
  });

Python

Показать код
# https://github.com/CapMonsterCloud/capmonsterclient-python

# Импорт необходимых зависимостей
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import AmazonWafRequest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

CAPTCHA_URL = "https://www.example.com"  # Укажите нужный URL

# ===== НАСТРОЙКА CHROMEDRIVER =====
chrome_options = Options()
# chrome_options.add_argument('--headless')  # Уберите комментирование для работы в фоновом режиме
driver = webdriver.Chrome(options=chrome_options)

# ===== ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ ПАРАМЕТРОВ CAPTCHA =====
def get_captcha_params():
    driver.get(CAPTCHA_URL)
    captcha_params = driver.execute_script("""
        const gokuProps = window.gokuProps || {};
        const scripts = Array.from(document.querySelectorAll('script'));

        return {
            websiteKey: gokuProps.key || "Not found",
            context: gokuProps.context || "Not found",
            iv: gokuProps.iv || "Not found",
            challengeScriptUrl: scripts.find(script => script.src.includes('challenge.js'))?.src || "Not found",
            captchaScriptUrl: scripts.find(script => script.src.includes('captcha.js'))?.src || "Not found"
        };
    """)
    return captcha_params

# ===== НАСТРОЙКИ CAPMONSTER CLOUD =====
client_options = ClientOptions(api_key="YOUR_API_KEY")  # Замените на ваш API-ключ
cap_monster_client = CapMonsterClient(options=client_options)

async def solve_captcha(captcha_params):

    # ===== Создаём запрос для CapMonsterCloud и отправляем его на решение капчи =====
    amazon_waf_request = AmazonWafRequest(
        websiteUrl=CAPTCHA_URL,
        challengeScript=captcha_params["challengeScriptUrl"],
        captchaScript=captcha_params["captchaScriptUrl"],
        websiteKey=captcha_params["websiteKey"],
        context=captcha_params["context"],
        iv=captcha_params["iv"],
        cookieSolution=True
    )
    return await cap_monster_client.solve_captcha(amazon_waf_request)

async def main():
    try:
        # ===== 1. ПОЛУЧАЕМ ПАРАМЕТРЫ AWS WAF CAPTCHA =====
        captcha_params = get_captcha_params()
        print("Параметры CAPTCHA:", captcha_params)

        # ===== 2. ОТПРАВЛЯЕМ ЗАПРОС В CAPMONSTER CLOUD =====
        response = await solve_captcha(captcha_params)
        print("Результат решения CAPTCHA:", response)

        if not response or "cookies" not in response:
            raise Exception("CapMonster returned empty solution")

        solution = response

        waf_token = solution["cookies"].get("aws-waf-token")

        if not waf_token:
            raise Exception(f"AWS WAF token not found:\n{solution}")

        print("AWS WAF token:")
        print(waf_token)

        # ==========================
        # УСТАНОВКА COOKIE
        # ==========================

        # Удаляем старые cookie
        driver.delete_cookie("aws-waf-token")

        # Добавляем новые cookie
        driver.add_cookie({
            "name": "aws-waf-token",
            "value": waf_token,
            "path": "/",
            "secure": True
        })

        # Проверяем cookies
        cookies = driver.get_cookies()
        print("Cookies after insertion:")
        print(cookies)

        # ===== 3. ОБНОВЛЯЕМ СТРАНИЦУ =====
        print("Refreshing page...")
        driver.refresh()

        # Ждём загрузку
        await asyncio.sleep(3)

        print("Current URL:")
        print(driver.current_url)

    except Exception as e:
        print("Произошла ошибка:", e)

    finally:
        driver.quit()

asyncio.run(main())

C#

Показать код
// https://github.com/CapMonsterCloud/capmonstercloud-client-dotnet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;

class Program
{
    static async System.Threading.Tasks.Task Main(string[] args)
    {
        const string CAPTCHA_URL = "https://www.example.com"; // URL с CAPTCHA

        // ===== НАСТРОЙКА CHROMEDRIVER =====
        var chromeOptions = new ChromeOptions();
        // chromeOptions.AddArgument("--headless"); // при необходимости
        using var driver = new ChromeDriver(chromeOptions);

        try
        {
            // ===== 1. ПОЛУЧАЕМ ПАРАМЕТРЫ AWS WAF CAPTCHA =====
            var captchaParams = GetCaptchaParams(driver, CAPTCHA_URL);

            // ===== 2. СОЗДАЕМ КЛИЕНТ CAPMONSTER CLOUD =====
            var clientOptions = new ClientOptions
            {
                ClientKey = "YOUR_API_KEY" // Замените на свой API-ключ
            };

            var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);

            // ===== 3. СОЗДАЕМ ЗАПРОС НА РЕШЕНИЕ AWS WAF CAPTCHA =====
            var amazonWafRequest = new AmazonWafRequest
            {
                WebsiteUrl = CAPTCHA_URL,
                ChallengeScript = captchaParams["challengeScriptUrl"],
                CaptchaScript = captchaParams["captchaScriptUrl"],
                WebsiteKey = captchaParams["websiteKey"],
                Context = captchaParams["context"],
                Iv = captchaParams["iv"],
                CookieSolution = true
            };

            // ===== 4. ОТПРАВЛЯЕМ ЗАПРОС В CAPMONSTER CLOUD =====
            var solveResult = await cmCloudClient.SolveAsync(amazonWafRequest);

            Console.WriteLine("Full response:");
            Console.WriteLine(solveResult);

            if (solveResult?.Solution?.Cookies == null)
                throw new Exception("CapMonster returned empty solution");

            var wafToken = solveResult.Solution.Cookies.ContainsKey("aws-waf-token")
                ? solveResult.Solution.Cookies["aws-waf-token"]
                : null;

            if (string.IsNullOrEmpty(wafToken))
                throw new Exception("AWS WAF token not found");

            Console.WriteLine("AWS WAF token:");
            Console.WriteLine(wafToken);

            // ==========================
            // УСТАНОВКА COOKIE
            // ==========================

            // удаляем старую cookie
            try
            {
                driver.Manage().Cookies.DeleteCookieNamed("aws-waf-token");
            }
            catch { }

            // получаем домен
            var uri = new Uri(CAPTCHA_URL);
            var domain = uri.Host;

            // добавляем новую cookie
            driver.Manage().Cookies.AddCookie(new Cookie(
                "aws-waf-token",
                wafToken,
                domain,
                "/",
                DateTime.Now.AddDays(1)
            ));

            // проверка cookies
            var cookies = driver.Manage().Cookies.AllCookies;

            Console.WriteLine("Cookies after insertion:");
            foreach (var cookie in cookies)
            {
                Console.WriteLine($"{cookie.Name} = {cookie.Value}");
            }

            // ===== 5. ОБНОВЛЯЕМ СТРАНИЦУ =====
            Console.WriteLine("Refreshing page...");
            driver.Navigate().Refresh();

            Thread.Sleep(3000);

            Console.WriteLine("Current URL:");
            Console.WriteLine(driver.Url);
        }
        catch (Exception ex)
        {
            Console.WriteLine("ERROR:");
            Console.WriteLine(ex);
        }
        finally
        {
            driver.Quit();
        }
    }

    private static Dictionary<string, string> GetCaptchaParams(IWebDriver driver, string url)
    {
        driver.Navigate().GoToUrl(url);

        var jsExecutor = (IJavaScriptExecutor)driver;

        var result = jsExecutor.ExecuteScript(@"
            const gokuProps = window.gokuProps || {};
            const scripts = Array.from(document.querySelectorAll('script'));

            return {
                websiteKey: gokuProps.key || 'Not found',
                context: gokuProps.context || 'Not found',
                iv: gokuProps.iv || 'Not found',
                challengeScriptUrl: scripts.find(s => s.src.includes('challenge.js'))?.src || 'Not found',
                captchaScriptUrl: scripts.find(s => s.src.includes('captcha.js'))?.src || 'Not found'
            };
        ") as IDictionary<string, object>;

        return result.ToDictionary(
            k => k.Key,
            v => v.Value?.ToString() ?? "Not found"
        );
    }
}

 

 

Советы для стабильного тестирования и снижения риска ограничений

 

Работа с динамическими параметрами и автоматизированным тестированием часто сопровождается такими сложностями, как ограничения запросов, дополнительные проверки или динамически обновляемые элементы страниц. Ниже приведены практические рекомендации, которые помогут сделать тестирование более стабильным и предсказуемым.

 

1. Используйте Undetected ChromeDriver

Некоторые сайты могут определять стандартные WebDriver-признаки Selenium и включать дополнительные проверки.

 

Для более корректного тестирования поведения сайта можно использовать undetected_chromedriver, который помогает приблизить браузер к обычной пользовательской среде.

pip install undetected-chromedriver

 

Пример использования:

import undetected_chromedriver.v2 as uc

options = uc.ChromeOptions()
options.add_argument("--headless")  # Запуск в фоновом режиме
options.add_argument("--disable-blink-features=AutomationControlled")

driver = uc.Chrome(options=options)
driver.get("https://example.com")
print(driver.page_source)
driver.quit()

2. Эмуляция действий пользователя

Во время тестирования полезно имитировать обычное взаимодействие пользователя с сайтом. Не выполняйте действия слишком быстро подряд. Добавляйте случайные интервалы между действиями:

import time
import random

time.sleep(random.uniform(1, 3))  # Задержка от 1 до 3 секунд

Прокрутка страницы. Некоторые элементы загружаются только после скроллинга:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Движение мыши: имитируйте действия мыши с помощью таких библиотек, как pyautogui или selenium-wire

3. Использование прокси-серверов
Прокси помогают избежать блокировки по IP-адресу:

Используйте ротацию прокси. Следите за географией прокси, чтобы соответствовать региону сайта:

from selenium.webdriver.common.proxy import Proxy, ProxyType

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "http://username:password@proxy_ip:port"

capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)

driver = webdriver.Chrome(desired_capabilities=capabilities)


4. Обновляйте user-agent и заголовки

options.add_argument("user-agent=Ваш User-Agent")


Итак, советы для долгосрочной работы без блокировок:

  • Избегайте слишком агрессивной частоты запросов.
  • Следите за нагрузкой на тестируемый ресурс.
  • Используйте реалистичные задержки и сценарии взаимодействия.
  • Проверяйте работу как в обычном, так и в headless-режиме.
  • Регулярно обновляйте браузер и используемые библиотеки автоматизации.


Заключение

Работа с динамическими параметрами капчи – это увлекательный процесс, который позволяет лучше понять, как работают механизмы веб-защиты. В данной статье мы подробно разобрали основные моменты: от того, как определить и проанализировать динамические параметры, до того, как извлечь их и эффективно решать капчи.

Мы также показали примеры кода на языках программирования JavaScript (Node.js), Python и C#, чтобы вы могли легко научиться извлекать нужные значения и автоматизировать решение капчи с помощью CapMonster Cloud.

Не забыли и про инструменты, которые помогут вам эмулировать действия пользователя и работать с прокси-серверами. Использование таких решений, как Selenium, Puppeteer, Playwright, Undetected ChromeDriver, качественных прокси, ротации User-Agent и эмуляции поведения пользователя, даст вам возможность обойти многие ограничения.

При этом важно помнить о частоте запросов и соблюдать правила использования веб-ресурсов, чтобы ваша автоматизация была не только эффективной, но и этичной. Удачи вам в реализации ваших идей и новых проектах! 
 

Часто задаваемые вопросы

Динамические параметры CAPTCHA — это значения, которые генерируются заново при каждом запросе капчи или сессии пользователя. Они могут включать токены, challenge-id, context, rqdata и другие данные, которые подтверждают уникальность сессии и предотвращают повторное использование старых решений.

Статические параметры (например, sitekey) остаются неизменными для одного сайта, тогда как динамические параметры меняются при каждом запросе. Именно динамические значения связываются с конкретной сессией пользователя и временем выполнения капчи.

Основная цель — защита от автоматизации. Даже если бот получил успешное решение один раз, он не сможет использовать его повторно, потому что сервер ожидает новые значения для каждой попытки. Это значительно усложняет работу скриптов и повторных запросов.

Самый простой способ — сравнить несколько запросов в DevTools:

  1. открыть страницу с CAPTCHA
  2. перейти в Network
  3. перезагрузить страницу несколько раз
  4. сравнить значения параметров

Если значение меняется при каждом запросе — оно динамическое.

Такие сервисы используют заранее известные схемы работы CAPTCHA и помогают обрабатывать динамические параметры (challenge, token, context и т.д.), которые сложно корректно сформировать вручную.

robots
Начните сейчас и автоматизируйте решение reCAPTCHA v2

NB: Пожалуйста, обратите внимание, что продукт предназначен для автоматизации тестирования исключительно ваших собственных веб-сайтов и ресурсов, к которым у вас есть законное право доступа.

ItGuy
geear
Партнёрская программа для разработчиков софта
Зарабатывайте до 30% от трат ваших пользователей на обход капчи
✅ Заявка отправлена
Спасибо за интерес к нашей партнёрской программе! Мы свяжемся с вами в течение 7 рабочих дней.
Заявка на подключение
Заполните форму, чтобы отправить заявку на подключение к партнёрской программе
Больше статей