Динамические параметры капчи: что это, как их идентифицировать, методы извлечения. Успешное решение капч с изменяемыми данными
Капча и другие методы защиты сайтов
Сегодня уже сложно представить современные веб-ресурсы без использования некоторых защитных механизмов, например, капчи – проверки на то, что посетитель является реальным человеком, а не ботом, который может нести потенциальную угрозу. Раньше это были в основном текстовые капчи, где нужно вводить в специальное поле символы с картинки или отвечать на несложные вопросы. Со временем системы проверки пользователей и защиты сайтов становятся всё более сложными для обхода автоматизированными программами. А вот для реальных посетителей, наоборот, разработчики стараются минимизировать возможные неудобства – можно даже не догадываться о наличии такой защиты, проверка часто проходит на фоне без участия человека.
Сейчас в основном проверка основана не столько на прохождении конкретного теста, сколько на анализе целой совокупности факторов: поведения пользователя, характеристик его браузера, сетевых запросов и многого другого. Сайт может проверять куки, отпечаток устройства, выполнение JavaScript и дополнительно показывать капчу в случае подозрительной активности.
Что такое динамические параметры капчи
Ещё один уровень защиты добавляют так называемые динамические параметры. Эти параметры создаются и изменяются при каждом запросе к капче. Они служат уникальными идентификаторами для каждой сессии проверки и в отличие от статических параметров (например, websitekey), которые остаются неизменными, динамические параметры обновляются при каждом запросе к капче. Это значит, что автоматизированная система не может просто повторно использовать однажды полученные значения для успешного прохождения проверки.
Как эти меры защищают от ботов
Каждый раз, когда пользователь запрашивает капчу, сервер генерирует новый набор данных (например, 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 – дополнительный код безопасности, который подтверждает успешное решение.
- dataDomeCookie (используется в DataDome) – куки, генерируемые системой DataDome для отслеживания и проверки пользователя на предмет автоматизированных действий и обновляемые в ответ на его поведение.
- g-recaptcha-response (используется в ReCAPTCHA) – токен, полученный после успешного прохождения капчи, нужен для дальнейшей передачи на сервер.
- cf_clearance (используется в проверках от Cloudflare) – куки, которые генерируются после прохождения капчи для успешного доступа к ресурсу.
Также стоит упомянуть о таких параметрах, как:
- s (или sentinel/motionData) – могут содержать данные о движениях мыши и взаимодействии с капчей.
- v (версия) – указывает версию капчи, которая может обновляться на сервере и требует обновлённого значения для каждой сессии.
- rqdata – содержит зашифрованные данные о сессии пользователя.
Приведённые примеры отражают лишь часть параметров, изменяющихся с каждой сессией; на самом деле их довольно много и для каждого типа проверки (капчи) они разные. Знание об их наличии важно для последующего анализа и успешного решения капчи.
Поиск динамических параметров, работа с Инструментами разработчика
Если вы пользуетесь сервисами по обходу капчи, например, CapMonster Cloud, то в документации этих сервисов в разделах, посвящённых типам капч, обычно указывается, какие именно параметры являются динамическими и где именно в коде они генерируются. Всё это необходимо для того, чтобы извлечь значения и впоследствии использовать их для решения капчи с помощью сервиса. Также полезно обладать базовыми навыками работы с Инструментами разработчика, чтобы быстро находить значения нужных параметров.
Для начала, давайте определим основные способы генерации таких параметров:
- С помощью JavaScript (на стороне клиента)
Когда вы открываете страницу с капчей, загружается скрипт, который отслеживает ваши действия – движения мыши, клики, нажатия клавиш. JavaScript генерирует параметры – некоторые элементы и формы, промежуточные окна проверки (как в случае с Cloudflare Challenge), случайные числа, данные о ваших взаимодействиях и информацию об устройстве. Затем эти данные шифруются или обрабатываются и отправляются на сервер.
- С помощью API (на стороне сервера)
В процессе обработки запроса капчи сервер может добавить полезные параметры, например, сессионные идентификаторы или хэшированные значения. Также API может возвращать параметры, которые понадобятся для создания новой сессии капчи – они обновляются на сервере автоматически для каждой попытки.
Для наглядности рассмотрим оба способа. В качестве примера возьмём капчу от Amazon с генерацией context через JavaScript и GeeTest v.3 с генерацией ключа challenge через API:
Amazon (AWS WAF)
В данном типе капчи важные параметры (среди них меняющийся context) загружаются через специальный скрипт клиентской защиты:
Найти его можно с помощью Инструментов разработчика среди элементов на целевой странице.
GeeTest v.3
Здесь генерация параметров капчи происходит через API, отследить необходимый URL можно в запросах во вкладке Network:
Там же генерируется временная метка для того, чтобы запрос был привязан к определённому времени.
Как узнать, какие именно параметры являются динамическими?
Определить нужные параметры можно с помощью анализа запросов и ответов между браузером и сервером. Вот основные способы и пошаговый подход:
- Инструменты разработчика:
Откройте веб-страницу с капчей;
Перейдите на вкладку "Network";
Найдите запросы, связанные с капчей (обычно это запросы к серверам капчи, например, api.geetest.com и др.);
Проверьте параметры, передаваемые в этих запросах, например: ?t=123456789123;
Сравните несколько запросов;
Обновите страницу несколько раз;
Сравните параметры. Если значения меняются между запросами – они динамические;
Найдите вызовы JavaScript
Ищите в DevTools во вкладке "Sources" или "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 и тд).
Автоматизация с помощью инструментов: использование 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#, Go и PHP. Всё, что нужно, – это выбрать подходящий язык и установить официальную библиотеку для его использования.
Пример интеграции CapMonster Cloud в код на Python:
- Для начала зарегистрируйтесь на CapMonster Cloud и получите API-ключ для доступа к их сервису.
- Установите библиотеку
Для Python установите официальную библиотеку через pip:
pip install capmonstercloudclient
- В вашем коде создайте задачу для решения капчи и получите решение. Пример на Python:
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaV2ProxylessRequest
client_options = ClientOptions(api_key=<YOUR_API_KEY>)
cap_monster_client = CapMonsterClient(options=client_options)
async def solve_captcha():
return await cap_monster_client.solve_captcha(recaptcha2request)
recaptcha2request = RecaptchaV2ProxylessRequest(websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high",
websiteKey="6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd")
responses = asyncio.run(solve_captcha())
print(responses)
- После получения решения отправьте его на веб-страницу в форму, где требуется подтверждение.
- Вы можете настроить прокси, использовать proxyless решения и другие параметры в зависимости от типа капчи.
Совет: для сложных капч (например, DataDome или Geetest) используйте CustomTask
Примеры извлечения динамических параметров и обхода капчи
Для демонстрации примеров мы будем использовать типы проверок GeeTest v.3, Cloudflare Challenge и Amazon (AWS WAF) на языках программирования JavaScript, Python и C#. Для работы с динамическим контентом выберем Selenium.
GeeTest v3 (с получением динамических параметров через API с помощью fetch):
Данный тип капчи содержит необходимые для создания запроса на сервер CapMonster Cloud динамические параметры. Параметры генерируются через API с использованием URL следующего вида: https://example.com/api/v1/gee-test/init-params?t=${t}. При этом дополнительные инструменты для автоматизации браузера не требуются – можно обойтись встроенным Fetch (для JavaScript) или библиотеками requests (для Python) и Newtonsoft.Json (для C#). Список всех параметров приведён в документации CapMonster Cloud.
JavaScript
// Импортируем необходимые зависимости
const { CapMonsterCloudClientFactory, ClientOptions, GeeTestProxylessRequest } = require('@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 GeeTestProxylessRequest({
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
# Импортируем необходимые зависимости
import requests
import asyncio
import time
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import GeetestProxylessRequest
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 = GeetestProxylessRequest(
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#
// Импортируем библиотеку 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 GeeTestProxylessRequest
{
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 (с получением token):
Для работы с данным типом проверки необходимо использовать эмуляторы браузеров, чтобы правильно отобразить динамический контент и открыть специальное окно для проверки Challenge Page. Динамические параметры генерируются через window.turnstile, и мы будем перехватывать их с помощью встроенного JavaScript. Эти параметры затем используются для формирования запроса к серверу CapMonster Cloud. Рассмотрим два способа – получение токена и куки cf-clearance, которые можно затем подставить в браузер, тем самым подтвердив успешное решение. Список всех нужных параметров перечислен в документации CapMonster Cloud.
JavaScript
// Импортируем библиотеку CapMonster Cloud
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } = require('@zennolab_com/capmonstercloud-client');
(async function example() {
// Создание объекта настроек для Chrome
const options = new chrome.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'); // URL страницы с капчей
// Выполнение JavaScript на странице для захвата параметров капчи
await driver.executeScript(`
// Перехват вызова функции render в объекте turnstile для получения параметров
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
// Переопределяем функцию render для захвата параметров капчи
return function(a, b) {
let p = {
websiteKey: b.sitekey, // Ключ сайта
websiteURL: window.location.href, // URL страницы с капчей
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
console.log(JSON.stringify(p)); // Выводим параметры в консоль для отладки
window.params = p; // Сохраняем параметры в глобальной переменной
window.turnstileCallback = b.callback; // Сохраняем callback функцию
return target.render.apply(this, arguments); // Вызов оригинальной функции render
}
}
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
# Импортируем необходимые зависимости
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 TurnstileProxylessRequest
# Настройка 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') {
// Переопределяем функцию render для захвата параметров капчи
return function(a, b) {
let p = {
websiteKey: b.sitekey, // Ключ сайта
websiteURL: window.location.href, // URL страницы с капчей
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
console.log(JSON.stringify(p));
window.params = p; // Сохраняем параметры в глобальную переменную
window.turnstileCallback = b.callback; // Сохраняем callback-функцию
return target.render.apply(this, arguments); // Вызываем оригинальную функцию render
};
}
return target[prop]; // Возвращаем остальные свойства объекта
}
});
""")
# Извлекаем параметры из глобальной переменной `window.params` через execute_async_script
params = driver.execute_async_script("""
const callback = arguments[arguments.length - 1]; // Получаем callback для завершения
setTimeout(() => {
callback(window.params); // Передаем параметры через callback
}, 5000);
""")
if not params:
print("Параметры не получены, перезагружаем страницу...")
await asyncio.sleep(3)
return params # Возвращаем полученные параметры
async def solve_turnstile(params):
# Создаем запрос для решения капчи с использованием CapMonsterCloud
request = TurnstileProxylessRequest(
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#
// Импортируем необходимые зависимости
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 TurnstileProxylessRequest
{
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') {
// Переопределяем функцию 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; // Сохраняем callback-функцию
return target.render.apply(this, arguments); // Вызываем оригинальную функцию render
};
}
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; // Возвращаем полученные параметры
}
}
Cloudflare Challenge (с получением cookie cf_clearance):
JavaScript
// Импортируем необходимые зависимости
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } = require('@zennolab_com/capmonstercloud-client');
(async function example() {
// Настройки ChromeDriver
const options = new chrome.Options();
// Инициализация WebDriver для Chrome
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
let params = null; // Переменная для хранения параметров капчи
let htmlPageBase64 = ''; // Переменная для хранения страницы в формате Base64
try {
while (!params) {
// Открываем страницу с капчей
await driver.get('https://example.com'); // Замените на URL вашей страницы
// Выполняем скрипт для перехвата параметров капчи Turnstile
await driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
// Переопределяем функцию render для извлечения параметров
return function(a, b) {
let p = {
websiteKey: b.sitekey,
websiteURL: window.location.href
};
console.log(JSON.stringify(p));
window.params = p; // Сохраняем параметры в глобальную переменную
return target.render.apply(this, arguments); // Вызываем оригинальную функцию render
}
}
return target[prop]; // Возвращаем остальные свойства объекта
}
});
`);
// Извлекаем параметры через глобальную переменную `window.params`
params = await driver.executeAsyncScript(`
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params); // Возвращаем параметры через callback
}, 5000);
`);
if (!params) {
console.log('Параметры не получены, перезагружаем страницу...');
await driver.sleep(3000); }
}
console.log('Параметры капчи:', params);
// Получаем HTML-код страницы и кодируем его в Base64
const pageSource = await driver.getPageSource();
htmlPageBase64 = Buffer.from(pageSource).toString('base64');
// Инициализация клиента CapMonster Cloud
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({
clientKey: 'your_api_key', // Замените на ваш API-ключ CapMonster Cloud
}));
// Формируем запрос для решения капчи
const turnstileRequest = new TurnstileRequest({
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
cloudflareTaskType: 'cf_clearance',
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
htmlPageBase64: htmlPageBase64,
proxyType: 'http',
proxyAddress: '8.8.8.8',
proxyPort: 8000,
proxyLogin: 'proxyLoginHere',
proxyPassword: 'proxyPasswordHere'
});
// Решение капчи с использованием CapMonster Cloud
const response = await cmcClient.Solve(turnstileRequest);
if (!response || !response.solution) {
throw new Error('Капча не решена.');
}
console.log('Капча решена, cookie cf_clearance:', response.solution);
} catch (err) {
console.error('Ошибка:', err);
} finally {
await driver.quit();
}
})();
Python
# Импортируем необходимые зависимости
import asyncio
import base64
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
# Настройка клиента CapMonster Cloud
client_options = ClientOptions(api_key="your_api_key") # Замените на ваш API-ключ CapMonsterCloud
cap_monster_client = CapMonsterClient(options=client_options)
# Функция для получения параметров Turnstile
async def get_turnstile_params(driver):
params = None
while not params:
# Загружаем страницу с капчей
driver.get("https://example.com") # Укажите URL страницы с капчей
# Выполняем скрипт для перехвата параметров Turnstile
driver.execute_script("""
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
// Переопределяем метод render для извлечения параметров
return function(a, b) {
let p = {
websiteKey: b.sitekey,
websiteURL: window.location.href
};
console.log(JSON.stringify(p));
window.params = p; // Сохраняем параметры в глобальную переменную
return target.render.apply(this, arguments);
};
}
return target[prop]; // Возвращаем остальные свойства объекта
}
});
""")
# Извлекаем параметры с использованием асинхронного скрипта
params = driver.execute_async_script("""
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params || null); // Возвращаем параметры или null
}, 5000);
""")
if not params:
print("Параметры не получены, перезагружаем страницу...")
await asyncio.sleep(3) # Ожидание перед повторной попыткой
return params
# Функция для решения капчи
async def solve_turnstile(params, html_page_base64):
request = TurnstileRequest(
websiteURL=params["websiteURL"],
websiteKey=params["websiteKey"],
cloudflareTaskType="cf_clearance",
userAgent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
htmlPageBase64=html_page_base64,
proxyType="http",
proxyAddress="8.8.8.8",
proxyPort=8000,
proxyLogin="proxyLoginHere",
proxyPassword="proxyPasswordHere"
)
# Отправляем запрос на решение капчи
response = await cap_monster_client.solve_captcha(request)
print("Ответ CapMonster:", response)
if "cf_clearance" not in response:
raise Exception("Капча не решена.")
return response["cf_clearance"]
async def main():
chrome_options = Options()
driver = webdriver.Chrome(service=ChromeService(), options=chrome_options)
try:
# Получаем параметры Turnstile
params = await get_turnstile_params(driver)
print("Получены параметры капчи:", params)
# Кодируем HTML страницы в Base64
page_source = driver.page_source
html_page_base64 = base64.b64encode(page_source.encode("utf-8")).decode("utf-8")
print("HTML страницы закодирован в Base64.")
# Решаем капчу
cf_clearance = await solve_turnstile(params, html_page_base64)
print("Капча решена. Cookie cf_clearance:", cf_clearance)
except Exception as e:
print(f"Ошибка: {e}")
finally:
await asyncio.sleep(5)
driver.quit()
asyncio.run(main())
C#
// Импортируем необходимые зависимости
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Настройка клиента CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "your_api_key" // Замените на ваш API-ключ CapMonsterCloud
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Настройка ChromeDriver
var chromeOptions = new ChromeOptions();
using var driver = new ChromeDriver(chromeOptions);
try
{
// Получение параметров Turnstile
var paramsObtained = await GetTurnstileParams(driver);
Console.WriteLine("Параметры получены: " + string.Join(", ", paramsObtained));
// Формирование запроса для решения капчи
var turnstileRequest = new TurnstileRequest
{
WebsiteUrl = paramsObtained["websiteURL"].ToString(),
WebsiteKey = paramsObtained["websiteKey"].ToString(),
CloudflareTaskType = "cf_clearance",
NoCache = false,
ProxyType = ProxyType.Http,
ProxyAddress = "8.8.8.8",
ProxyPort = 8000,
ProxyLogin = "proxyLoginHere",
ProxyPassword = "proxyPasswordHere",
PageData = paramsObtained["pagedata"].ToString(),
Data = paramsObtained["data"].ToString(),
HtmlPageBase64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(driver.PageSource)), // Кодирование HTML страницы
UserAgent = paramsObtained["userAgent"].ToString()
};
// Отправка запроса на CapMonster Cloud
var turnstileResult = await cmCloudClient.SolveAsync(turnstileRequest);
Console.WriteLine("Капча решена. Cookie cf_clearance: " + turnstileResult.Solution.Clearance);
// При необходимости добавьте cf_clearance в cookies браузера
// var cfClearance = turnstileResult.Solution.Clearance;
// driver.Manage().Cookies.AddCookie(new Cookie("cf_clearance", cfClearance));
// Если нужен вызов callback, выполните его через JavaScript
// ((IJavaScriptExecutor)driver).ExecuteScript($"window.turnstileCallback('{cfClearance}');");
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
}
finally
{
await Task.Delay(5000);
driver.Quit();
}
}
// Функция для получения параметров Turnstile
static async Task<Dictionary<string, object>> GetTurnstileParams(IWebDriver driver)
{
Dictionary<string, object> paramsObtained = null;
while (paramsObtained == null)
{
// Открываем страницу с Turnstile
driver.Navigate().GoToUrl("https://example.com"); // Укажите URL с капчей
// Подменяем метод render с помощью 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,
pagedata: b.chlPageData,
data: b.cData,
userAgent: navigator.userAgent
};
console.log(JSON.stringify(p));
window.params = p;
window.turnstileCallback = b.callback; // Сохраняем callback для последующего вызова
return target.render.apply(this, arguments);
};
}
return target[prop];
}
});
");
paramsObtained = await Task.Run(() =>
{
return (Dictionary<string, object>)((IJavaScriptExecutor)driver).ExecuteAsyncScript(@"
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params); // Возвращаем параметры, если они существуют
}, 5000);
");
});
if (paramsObtained == null)
{
Console.WriteLine("Параметры не получены, перезагрузка страницы...");
await Task.Delay(3000);
}
}
return paramsObtained;
}
}
Amazon:
JavaScript
// Импортируем необходимые зависимости
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const { CapMonsterCloudClientFactory, ClientOptions, AmazonProxylessRequest } = require('@zennolab_com/capmonstercloud-client');
(async function run() {
// Настройки для Chrome
const options = new chrome.Options();
// options.addArguments('--headless'); // Добавьте, если хотите запускать в фоновом режиме
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
const pageUrl = 'https://example.com'; // Укажите URL страницы с CAPTCHA
await driver.get(pageUrl);
// Получение параметров капчи с помощью JavaScript
const captchaParams = await driver.executeScript(() => {
const gokuProps = window.gokuProps || {}; // Получаем объект gokuProps, если он существует
const scripts = Array.from(document.querySelectorAll('script')); // Собираем все теги <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"
};
});
console.log('Полученные параметры:', captchaParams);
// Настройка клиента CapMonster Cloud
const cmcClient = CapMonsterCloudClientFactory.Create(new ClientOptions({
clientKey: 'your_api_key', // Замените на ваш API-ключ
}));
// Создание запроса на решение капчи
const amazonProxylessRequest = new AmazonProxylessRequest({
websiteURL: pageUrl,
challengeScript: captchaParams.challengeScriptUrl,
captchaScript: captchaParams.captchaScriptUrl,
websiteKey: captchaParams.websiteKey,
context: captchaParams.context,
iv: captchaParams.iv,
cookieSolution: false, // Если нужно получить cookie, установите true
});
try {
// Решение капчи через CapMonster Cloud
const response = await cmcClient.Solve(amazonProxylessRequest);
if (!response?.solution) throw new Error('CAPTCHA не решена.');
console.log('CAPTCHA решена:', response.solution);
} catch (err) {
console.error('Ошибка при решении CAPTCHA:', err);
} finally {
await driver.quit();
}
})()
.then(() => {
console.log('DONE');
process.exit(0);
})
.catch(err => {
console.error('ERROR:', err);
process.exit(1);
});
Python
# Импорт необходимых зависимостей
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import AmazonWafProxylessRequest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
CAPTCHA_URL = "https://example.com" # Укажите нужный URL
# Настройка ChromeDriver
chrome_options = Options()
# chrome_options.add_argument('--headless') # Уберите комментирование для работы в фоновом режиме
driver = webdriver.Chrome(options=chrome_options)
def get_captcha_params():
"""
Получаем параметры CAPTCHA со страницы через JavaScript.
"""
driver.get(CAPTCHA_URL)
captcha_params = driver.execute_script("""
const gokuProps = window.gokuProps || {}; // Получаем gokuProps с параметрами
const scripts = Array.from(document.querySelectorAll('script')); // Все <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
# Настройки CapMonsterCloud
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 = AmazonWafProxylessRequest(
websiteUrl=CAPTCHA_URL,
challengeScript=captcha_params["challengeScriptUrl"],
captchaScript=captcha_params["captchaScriptUrl"],
websiteKey=captcha_params["websiteKey"],
context=captcha_params["context"],
iv=captcha_params["iv"],
cookieSolution=False # Если требуется cookie-решение, укажите True
)
return await cap_monster_client.solve_captcha(amazon_waf_request)
async def main():
try:
# Извлечение параметров капчи
captcha_params = get_captcha_params()
print("Параметры CAPTCHA:", captcha_params)
# Решение капчи
response = await solve_captcha(captcha_params)
print("Результат решения CAPTCHA:", response)
except Exception as e:
print("Произошла ошибка:", e)
finally:
driver.quit()
asyncio.run(main())
C#
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
const string CAPTCHA_URL = "https://example.com"; // URL с CAPTCHA
// Настройки ChromeDriver
var chromeOptions = new ChromeOptions();
// chromeOptions.AddArgument("--headless"); // Уберите комментирование для работы в фоновом режиме
using var driver = new ChromeDriver(chromeOptions);
// Извлечение параметров капчи
var captchaParams = GetCaptchaParams(driver, CAPTCHA_URL);
// Настройки CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "your_api_key" // Замените на ваш API-ключ CapMonster Cloud
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Создание запроса
var amazonWafRequest = new AmazonWafProxylessRequest
{
WebsiteUrl = CAPTCHA_URL,
ChallengeScript = captchaParams["challengeScriptUrl"],
CaptchaScript = captchaParams["captchaScriptUrl"],
WebsiteKey = captchaParams["websiteKey"],
Context = captchaParams["context"],
Iv = captchaParams["iv"],
CookieSolution = false
};
// Отправка запроса на решение
var solveResult = await cmCloudClient.SolveAsync(amazonWafRequest);
// Вывод результатов
Console.WriteLine("ExistingToken: " + solveResult.Solution.ExistingToken);
Console.WriteLine("CaptchaVoucher: " + solveResult.Solution.CaptchaVoucher);
}
private static Dictionary<string, string> GetCaptchaParams(IWebDriver driver, string url)
{
driver.Navigate().GoToUrl(url);
var jsExecutor = (IJavaScriptExecutor)driver;
// Выполнение JavaScript для извлечения параметров
var captchaParams = 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(script => script.src.includes('challenge.js'))?.src || 'Not found',
captchaScriptUrl: scripts.find(script => script.src.includes('captcha.js'))?.src || 'Not found'
};
") as IDictionary<string, object>;
return captchaParams.ToDictionary(k => k.Key, v => v.Value?.ToString() ?? "Not found");
}
}
Советы по обходу ограничений и предотвращению блокировок
Работа с динамическими параметрами и автоматическое решение капчи часто сопровождаются сложностями, такими как блокировки, капчи или динамически обновляемые элементы страниц. Ниже приведены практические советы для успешного обхода таких ограничений.
- Используйте Undetected ChromeDriver
Стандартные WebDriver-идентификаторы Selenium легко обнаруживаются защитными системами. Чтобы минимизировать вероятность блокировок:
Установите библиотеку undetected_chromedriver. Она автоматически маскирует использование WebDriver:
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()
Включите режим безголового браузера (headless), чтобы дополнительно сократить подозрения.
- Эмуляция действий пользователя
Скрипт, действующий слишком "роботизированно", может вызвать подозрения. Используйте следующие приемы:
- Динамическая задержка: между действиями вставляйте случайные интервалы задержки:
import time
import random
time.sleep(random.uniform(1, 3)) # Задержка от 1 до 3 секунд
- Прокрутка страницы. Эмуляция скроллинга делает скрипт похожим на пользователя:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
- Движение мыши: имитируйте действия мыши с помощью таких библиотек, как pyautogui или selenium-wire
- Использование прокси-серверов
Прокси помогают избежать блокировки по 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)
- Обновляйте user-agent и заголовки
options.add_argument("user-agent=Ваш User-Agent")
Итак, советы для долгосрочной работы без блокировок:
- Избегайте агрессивного парсинга.
- Используйте библиотеки, которые меняют поведение, чтобы отличаться от других скриптов.
- Используйте Headless-режим осторожно: некоторые сайты распознают "безголовый" браузер.
Работа с динамическими параметрами капчи – это увлекательный процесс, который позволяет лучше понять, как работают механизмы веб-защиты. В данной статье мы подробно разобрали основные моменты: от того, как определить и проанализировать динамические параметры, до того, как извлечь их и эффективно решать капчи.
Мы также показали примеры кода на различных языках программирования, чтобы вы могли легко научиться извлекать нужные значения и автоматизировать решение капчи с помощью CapMonster Cloud.
Не забыли и про инструменты, которые помогут вам эмулировать действия пользователя и работать с прокси-серверами. Использование таких решений, как Selenium, Puppeteer, Playwright, Undetected ChromeDriver, качественных прокси, ротации User-Agent и эмуляции поведения пользователя, даст вам возможность обойти многие ограничения.
При этом важно помнить о частоте запросов и соблюдать правила использования веб-ресурсов, чтобы ваша автоматизация была не только эффективной, но и этичной. Удачи вам в реализации ваших идей и новых проектах!
NB: Напоминаем, что продукт используется для автоматизации тестирования на ваших собственных сайтах и на сайтах, к которым у вас есть доступ на законных основаниях.