Используйте сервис решения CAPTCHA с Puppeteer

Автор: solvethree3 мин на чтение

Используйте официальный JavaScript SDK для получения токена reCAPTCHA v3 Enterprise, затем передайте solution.token в свою форму через Puppeteer. SDK решает задачу; он не применяет решение в браузере и не предоставляет браузерный плагин.

Пример ниже рассчитан на HTTPS-форму под вашим управлением с textarea g-recaptcha-response и кнопкой отправки. Это требования к форме демонстрационного примера, а не универсальный интерфейс для страниц, защищённых reCAPTCHA.

На этой странице

Подготовьте зависимости и форму под вашим управлением

  1. 1.

    Установите Puppeteer и SDK

    Используйте Node.js 22 или более позднюю версию. С помощью npm установите puppeteer и официальный tarball SDK по адресу https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz. SDK импортируется как @solvethree/sdk; используйте URL загрузки, не предполагая наличия выпуска в реестре npm. Сохраните пример как ES-модуль, например в файле с расширением .mjs.

  2. 2.

    Настройте профиль сайта

    Настройте имя хоста под вашим управлением в консоли solvethree и убедитесь, что его профиль активен для вашего рабочего пространства. Передача имени хоста и действия не создаёт этот профиль. В примере используется действие login; замените его действием, настроенным для вашего приложения.

  3. 3.

    Задайте переменные окружения

    Задайте для TARGET_URL адрес HTTPS-формы под вашим управлением, для SOLVETHREE_PROXY — URL вашего HTTP- или HTTPS-прокси, а для SOLVETHREE_API_KEY — ключ рабочего пространства. Храните ключ в процессе Node.js, а не в JavaScript страницы. В примере один прокси используется и для решения, и для отправки формы браузером.

Поле site задачи — это имя хоста, извлечённое из TARGET_URL, а не полный URL страницы. Для reCAPTCHA передавайте site, action и ровно одно из полей proxy или proxyCandidates; не добавляйте поля type или url. В этом примере используется proxy, чтобы Puppeteer мог напрямую использовать тот же прокси.

Решите задачу, затем откройте Puppeteer с теми же параметрами идентификации

Puppeteer + Node.js · решение для собственной HTTPS-формы
// Install puppeteer and the official solvethree SDK first.
import puppeteer from 'puppeteer';
import { Solvethree } from '@solvethree/sdk';

const target = new URL(process.env.TARGET_URL); // Your configured HTTPS page.
const proxy = new URL(process.env.SOLVETHREE_PROXY);
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const result = await client.solve({
  site: target.hostname, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
});
const browser = await puppeteer.launch({
  args: [`--proxy-server=${proxy.protocol}//${proxy.host}`],
});
try {
  const page = await browser.newPage();
  if (proxy.username) await page.authenticate({
    username: decodeURIComponent(proxy.username),
    password: decodeURIComponent(proxy.password),
  });
  await page.setUserAgent({ userAgent: result.solution.userAgent });
  await page.setExtraHTTPHeaders({ 'sec-ch-ua': result.solution.secChUa });
  await page.goto(target.href);
  // Adapt these selectors and any required callback to your own form.
  await page.waitForSelector('[name="g-recaptcha-response"]');
  await page.$eval('[name="g-recaptcha-response"]', (field, token) => {
    field.value = token;
    field.dispatchEvent(new Event('input', { bubbles: true }));
  }, result.solution.token);
  await Promise.all([
    page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
    page.click('button[type="submit"]'),
  ]);
  // Check your application's success response here.
} finally {
  await browser.close();
}

client.solve создаёт задачу один раз и опрашивает её состояние до готовности либо выбрасывает исключение. Этот пример запускает Puppeteer только после возврата из вызова. Браузер использует прокси задачи, выполняет аутентификацию при наличии учётных данных прокси и применяет solution.userAgent и solution.secChUa перед переходом на страницу.

При отправке токена не заменяйте этот прокси или параметры идентификации браузера посторонними значениями. Если позже вы перейдёте на proxyCandidates, используйте вспомогательную функцию SDK successfulProxy, чтобы выбрать для браузера исходный прокси, на котором задача успешно решена.

Если решение завершилось неудачно, проверьте errorCode и error задачи вместо повторных попыток с неизменёнными входными данными. Ошибки HTTP-запросов отличаются от окончательных сбоев задач. Блок finally закрывает локальный браузер после работы с ним; закрытие страниц не является механизмом отмены удалённой задачи.

Адаптируйте допущения примера о форме

  • [name="g-recaptcha-response"] выбирает textarea демонстрационного примера. Замените его, если ваше приложение получает токен через другое поле или параметр запроса. Отправлять нужно solution.token, а не ID задачи.
  • button[type="submit"] выбирает кнопку отправки демонстрационного примера. Используйте фактический элемент управления или механизм отправки вашего приложения.
  • Пример присваивает токен и отправляет событие input. Это не заменяет обратный вызов, специфичный для приложения. Перед отправкой добавьте все необходимые обратные вызовы, значение CSRF, поля входа и настройку сессии.
  • Замените заключительный комментарий о проверке успеха проверкой ответа или итогового состояния вашего приложения. Готовая задача сервиса решения не подтверждает, что приложение приняло токен.

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

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Используйте сервис решения CAPTCHA с Puppeteer · solvethree