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

Капча и другие методы защиты сайтов
Сегодня уже сложно представить современные веб-ресурсы без использования некоторых защитных механизмов, например, капчи – проверки на то, что посетитель является реальным человеком, а не ботом, который может нести потенциальную угрозу. Раньше это были в основном текстовые капчи, где нужно вводить в специальное поле символы с картинки или отвечать на несложные вопросы. Со временем системы проверки пользователей и защиты сайтов становятся всё более сложными для обхода автоматизированными программами. А вот для реальных посетителей, наоборот, разработчики стараются минимизировать возможные неудобства – можно даже не догадываться о наличии такой защиты, проверка часто проходит на фоне без участия человека.
Сейчас в основном проверка основана не столько на прохождении конкретного теста, сколько на анализе целой совокупности факторов: поведения пользователя, характеристик его браузера, сетевых запросов и многого другого. Сайт может проверять куки, отпечаток устройства, выполнение 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) загружаются через специальный скрипт клиентской защиты:

Найти его можно с помощью Инструментов разработчика среди элементов на целевой странице.
GeeTest v.3
Здесь генерация параметров капчи происходит через API, отследить необходимый URL можно в запросах во вкладке Network:

Там же генерируется временная метка для того, чтобы запрос был привязан к определённому времени.
Как узнать, какие именно параметры являются динамическими?
Определить нужные параметры можно с помощью анализа запросов и ответов между браузером и сервером. Вот основные способы и пошаговый подход:
- Инструменты разработчика:
- Откройте веб-страницу с капчей;
- Нажмите F12 и перейдите на вкладку Network;
- Найдите запросы, связанные с капчей (обычно это запросы к серверам капчи, например, api.geetest.com и др.);
- Проверьте параметры, передаваемые в этих запросах, например: ?t=123456789123;
- Сравните несколько запросов;
- Обновите страницу несколько раз;
- Сравните параметры. Если значения меняются между запросами – они динамические;
- Найдите вызовы JavaScript
- Ищите в DevTools во вкладке Source или Elements. Проверьте, какие скрипты подключаются;
- Найдите генерацию параметров, таких как timestamp, context, challenge и др.;
- Ищите ключевые слова: в JavaScript коде часто используются функции для генерации динамических параметров;
- Анализируйте запросы на сервер. Некоторые параметры формируются сервером. Эти данные необходимо сохранить и использовать в следующем запросе. Если последовательность запросов нарушена (например, устаревшие куки), сервер может отклонить проверку.
- Снифферы и прокси-серверы для анализа
Эти инструменты (например, Charles Proxy) позволяют анализировать запросы, находить динамические параметры и тестировать изменения, помогают понять их логику и проверить, как сервер обрабатывает модифицированные запросы.
Работа этих инструментов включает в себя:
- Инструменты фиксируют запросы к серверу капчи (например, с параметрами t, challenge, context).
- Исследуются заголовки, параметры URL, тело запросов и куки для выявления ключевых значений.
- Изменяются параметры (например, токены) для проверки их влияния на серверный ответ.
- Тестируется, как сервер реагирует на изменённые данные.
Краткая инструкция по использованию Charles Proxy для анализа параметров капчи:
- Загрузите и установите Charles Proxy.
- Включите SSL Proxying через Proxy → SSL Proxying Settings. Добавьте домен капчи.
- Запустите Charles и браузер со страницей, где загружается капча.
- Перейдите на страницу, чтобы начать запись запросов.
- Во вкладке Structure найдите запросы к CAPTCHA-сервисам (например, www.google.com/recaptcha/api.js).
- Откройте запросы/ответы и изучите параметры, передаваемые в них (token, sitekey, challenge, cookies и тд).

Работа с параметрами капчи в 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:
- Для начала зарегистрируйтесь в CapMonster Cloud и получите API-ключ для доступа к сервису.
- Установите библиотеку
Для Python установите официальную библиотеку через pip:
pip install capmonstercloudclient- В вашем коде создайте задачу для решения капчи и получите решение. Пример решения 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())| Подробную информацию по типам капч и необходимым для создания задачи на решение параметрам смотрите в документации. |
- После получения решения отправьте его на веб-страницу в форму, где требуется подтверждение.
Примеры извлечения динамических параметров и решения капчи
В этом разделе представлены примеры извлечения динамических параметров и решения различных типов капчи с использованием JavaScript (Node.js), Python и C#.
Для автоматизации используется Selenium или встроенные HTTP-запросы в зависимости от типа проверки.
Важно: перед началом работы ознакомьтесь со списком всех нужных параметров в документации CapMonster Cloud: |
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 и эмуляции поведения пользователя, даст вам возможность обойти многие ограничения.
При этом важно помнить о частоте запросов и соблюдать правила использования веб-ресурсов, чтобы ваша автоматизация была не только эффективной, но и этичной. Удачи вам в реализации ваших идей и новых проектах!
Часто задаваемые вопросы
NB: Пожалуйста, обратите внимание, что продукт предназначен для автоматизации тестирования исключительно ваших собственных веб-сайтов и ресурсов, к которым у вас есть законное право доступа.






