Cloudflare Turnstile
Здесь заполним небольшую контактную форму на тестовом сайте tsmanaged.zlsupport.com и решим капчу типа Cloudflare Turnstile. Так же, как и для предыдущих типов капч, нам нужно будет узнать sitekey самой капчи в Инструментах разработчика в браузере (см. в документации).
1. Импортируем зависимости и пропишем значения:
import puppeteer from "puppeteer";
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest,
} from "@zennolab_com/capmonstercloud-client";
const API_KEY = "ВАШ_API_КЛЮЧ"; // Замените на ваш API-ключ CapMonster Cloud
const WEBSITE_KEY = "0x4AAAAAAABUYP0XeMJF0xoy";
const WEBSITE_URL = "http://tsmanaged.zlsupport.com";
2. Запустим браузер, создадим задачу для CapMonster Cloud, отправим ее на сервер, получим и вставим результат на страницу:
async function solveTurnstileCaptcha() {
const browser = await puppeteer.launch({
headless: false,
args: ["--disable-features=HttpsFirstBalancedModeAutoEnable"], // Используйте этот аргумент, если сайт не поддерживает HTTPS
});
const page = await browser.newPage();
try {
await page.goto(WEBSITE_URL, {
waitUntil: "networkidle2",
});
console.log("Страница открыта, решаем Cloudflare Turnstile CAPTCHA...");
// Заполните поля своими учетными данными
await page.type('input[name="username"]', "yourlogin");
await page.type('input[name="password"]', "yourpass");
// Инициализация клиента CapMonster
const clientOptions = new ClientOptions({
clientKey: API_KEY,
});
const capMonsterClient = CapMonsterCloudClientFactory.Create(clientOptions);
const turnstileRequest = new TurnstileRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// Решение Turnstile через CapMonster
const taskResult = await capMonsterClient.Solve(turnstileRequest);
const token = taskResult.solution.token;
console.log("Капча успешно решена:", token);
// Вставка токена в поле
await page.evaluate((token) => {
const tokenField = document.querySelector("#token");
if (tokenField) {
tokenField.value = token;
tokenField.dispatchEvent(new Event("input", { bubbles: true }));
tokenField.dispatchEvent(new Event("change", { bubbles: true }));
}
}, token);
console.log('Токен успешно вставлен в поле "token"!');
// Нажатие на кнопку отправки формы
await page.click('button[type="submit"]');
console.log('Кнопка "Submit" успешно нажата!');
await new Promise((resolve) => setTimeout(resolve, 5000));
} catch (error) {
console.error("Произошла ошибка:", error);
} finally {
await browser.close();
}
}
solveTurnstileCaptcha();
// Вставка токена в поле
await page.evaluate((token) => {
const tokenField = document.querySelector("#token");
if (tokenField) {
tokenField.value = token;
tokenField.dispatchEvent(new Event("input", { bubbles: true }));
tokenField.dispatchEvent(new Event("change", { bubbles: true }));
}
}, token);
console.log('Токен успешно вставлен в поле "token"!');
// Нажатие на кнопку отправки формы
await page.click('button[type="submit"]');
console.log('Кнопка "Submit" успешно нажата!');
await new Promise((resolve) => setTimeout(resolve, 5000));
} catch (error) {
console.error("Произошла ошибка:", error);
} finally {
await browser.close();
}
}
solveTurnstileCaptcha();
Пояснение данной части кода:
async function solveTurnstileCaptcha() { ... }: Объявление асинхронной функции solveTurnstileCaptcha, которая содержит весь процесс решения Cloudflare Turnstile CAPTCHA с использованием Puppeteer и CapMonster.
const browser = await puppeteer.launch({ headless: false, args: [...] });: Запуск браузера с помощью Puppeteer. Опция headless: false указывает, что браузер будет открыт в обычном режиме с графическим интерфейсом. Аргумент --disable-features=HttpsFirstBalancedModeAutoEnable отключает функцию HTTPS-First Mode, которая может блокировать переход на HTTP-сайты.
const page = await browser.newPage();: Создание новой вкладки (страницы) в браузере.
- await page.goto(WEBSITE_URL, { waitUntil: "networkidle2" });: Переход на страницу с Cloudflare Turnstile CAPTCHA. Параметр waitUntil: "networkidle2" заставляет Puppeteer дождаться завершения основной сетевой активности перед продолжением выполнения кода.
console.log("Страница открыта, решаем Cloudflare Turnstile CAPTCHA...");: Вывод в консоль сообщения о том, что страница успешно открыта и начинается процесс решения CAPTCHA.
await page.type('input[name="username"]', "yourlogin");: Ввод логина в поле username.
await page.type('input[name="password"]', "yourpass");: Ввод пароля в поле password.
const clientOptions = new ClientOptions({ clientKey: API_KEY });: Создание объекта настроек клиента CapMonster с использованием API-ключа.
const capMonsterClient = CapMonsterCloudClientFactory.Create(clientOptions);: Инициализация клиента CapMonster на основе ранее созданных настроек.
const turnstileRequest = new TurnstileRequest({ websiteURL: WEBSITE_URL, websiteKey: WEBSITE_KEY });: Создание объекта запроса для решения Cloudflare Turnstile CAPTCHA. В запрос передаются адрес страницы и sitekey капчи.
const taskResult = await capMonsterClient.Solve(turnstileRequest);: Отправка задачи в CapMonster Cloud и ожидание результата решения CAPTCHA.
const token = taskResult.solution.token;: Извлечение токена решения CAPTCHA из объекта ответа.
console.log("Капча успешно решена:", token);: Вывод в консоль сообщения об успешном решении CAPTCHA и полученного токена.
await page.evaluate((token) => { ... }, token);: Выполнение JavaScript-кода внутри страницы для вставки полученного токена в поле с идентификатором token.
const tokenField = document.querySelector("#token");: Поиск поля token на странице.
tokenField.value = token;: Запись полученного токена в найденное поле.
tokenField.dispatchEvent(new Event("input", { bubbles: true }));: Генерация события input для уведомления страницы об изменении значения поля.
tokenField.dispatchEvent(new Event("change", { bubbles: true }));: Генерация события change для корректной обработки изменения значения страницы.
console.log('Токен успешно вставлен в поле "token"!');: Вывод в консоль сообщения о том, что токен был успешно вставлен в поле.
await page.click('button[type="submit"]');: Нажатие на кнопку отправки формы после вставки токена.
console.log('Кнопка "Submit" успешно нажата!');: Вывод в консоль сообщения об успешном нажатии кнопки отправки.
await new Promise((resolve) => setTimeout(resolve, 5000));: Пауза на 5 секунд для ожидания обработки формы или завершения проверки CAPTCHA.
} catch (error) { console.error("Произошла ошибка:", error); }: Обработка возможных ошибок во время выполнения скрипта с выводом информации об ошибке в консоль.
finally { await browser.close(); }: Закрытие браузера после завершения работы скрипта независимо от того, возникла ошибка или нет.
solveTurnstileCaptcha();: Вызов функции solveTurnstileCaptcha для запуска процесса решения Cloudflare Turnstile CAPTCHA.
Вот так выглядит весь код:
import puppeteer from "puppeteer";
import {
CapMonsterCloudClientFactory,
ClientOptions,
TurnstileRequest,
} from "@zennolab_com/capmonstercloud-client";
const API_KEY = "ВАШ_API_КЛЮЧ"; // Замените на ваш API-ключ CapMonster
const WEBSITE_KEY = "0x4AAAAAAABUYP0XeMJF0xoy";
const WEBSITE_URL = "http://tsmanaged.zlsupport.com";
async function solveTurnstileCaptcha() {
const browser = await puppeteer.launch({
headless: false,
args: ["--disable-features=HttpsFirstBalancedModeAutoEnable"], // Используйте этот аргумент, если сайт не поддерживает HTTPS
});
const page = await browser.newPage();
try {
await page.goto(WEBSITE_URL, {
waitUntil: "networkidle2",
});
console.log("Страница открыта, решаем Cloudflare Turnstile CAPTCHA...");
// Заполните поля своими учетными данными
await page.type('input[name="username"]', "yourlogin");
await page.type('input[name="password"]', "yourpass");
// Инициализация клиента CapMonster
const clientOptions = new ClientOptions({
clientKey: API_KEY,
});
const capMonsterClient = CapMonsterCloudClientFactory.Create(clientOptions);
const turnstileRequest = new TurnstileRequest({
websiteURL: WEBSITE_URL,
websiteKey: WEBSITE_KEY,
});
// Решение Turnstile через CapMonster
const taskResult = await capMonsterClient.Solve(turnstileRequest);
const token = taskResult.solution.token;
console.log("Капча успешно решена:", token);
// Вставка токена в поле
await page.evaluate((token) => {
const tokenField = document.querySelector("#token");
if (tokenField) {
tokenField.value = token;
tokenField.dispatchEvent(new Event("input", { bubbles: true }));
tokenField.dispatchEvent(new Event("change", { bubbles: true }));
}
}, token);
console.log('Токен успешно вставлен в поле "token"!');
// Нажатие на кнопку отправки формы
await page.click('button[type="submit"]');
console.log('Кнопка "Submit" успешно нажата!');
await new Promise((resolve) => setTimeout(resolve, 5000));
} catch (error) {
console.error("Произошла ошибка:", error);
} finally {
await browser.close();
}
}
solveTurnstileCaptcha();