Skip to content

Puppeteer (Node.js) модуль ​

Используется Puppeteer для автоматического решения капчи.
Поддерживает клики по изображениям, перетягивание ползунка и другие типы.
Умеет сам определять тип капчи на странице.

Актуальная версия: ​

Версия модуляСкачатьИзменения
0.4npm · 0.4Автоопределение капчи auto(), добавлен AWS WAF

Установка ​

Модуль опубликован на npm:

bash
npm install capguru puppeteer
javascript
const { CaptchaSolver, CapGuruFatalError } = require('capguru');

Обновление до последней версии:

bash
npm install capguru@latest
Установка без npm

Скачайте архив из таблицы версий, скопируйте папку capguru в свой проект и установите Puppeteer:

bash
npm install puppeteer

Подключайте модуль по относительному пути: require('./capguru').

Как использовать ​

Импортируйте CaptchaSolver из пакета.
Создайте солвер до перехода на страницу с капчей и вызовите await solver.setup().
Затем откройте страницу и вызовите await solver.auto() — модуль сам найдёт капчу и решит её.
Если тип капчи известен заранее, можно вызвать нужный метод напрямую.

javascript
const puppeteer = require('puppeteer');
const { CaptchaSolver, CapGuruFatalError } = require('capguru');

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();

  const solver = new CaptchaSolver({
    page,
    apiKey: 'YOUR_CAPGURU_API_KEY',
    debug: true,
    attempts: 5,
  });
  await solver.setup();

  await page.goto('https://example.com/with-captcha');

  try {
    const kind = await solver.auto(30);
    console.log('Captcha:', kind || 'not found');
  } catch (e) {
    if (e instanceof CapGuruFatalError) console.log('API key or balance problem:', e.message);
    else console.log('Not solved:', e.message);
  } finally {
    await browser.close();
  }
})();

Почему солвер создаётся до перехода на страницу

При создании солвер начинает запоминать картинки капчи, которые загружает браузер, и переключает hCaptcha на английский язык. Если создать его после page.goto(), картинки первой загрузки будут пропущены, а hCaptcha может остаться на языке сайта.

Методы: ​

Автоматически:

  await solver.auto(30);      // найти капчу и решить, вернёт тип или null
  await solver.detect();      // только определить тип, не решая
  await solver.setup();       // подготовка, вызывать до page.goto()

Для конкретного типа:

  await solver.solveRecaptcha2();
  await solver.solveHcaptcha();
  await solver.solveOther();
  await solver.solveGeetest();
  await solver.solveFuncaptcha();
  await solver.solveTiktok();
  await solver.solveAws();

auto() и detect() возвращают тип капчи:

ЗначениеКапча
recaptcha2reCAPTCHA v2
hcaptchahCaptcha
yandexOther
geetestGeeTest v3 / v4
funcaptchaFunCaptcha (Arkose Labs)
tiktokTikTok
awsAWS WAF
nullКапча не найдена за отведённое время

Параметры auto():

ПараметрТипПо умолчаниюОписание
timeoutnumber30Сколько секунд ждать появления капчи
pollnumber0.5Как часто проверять страницу, в секундах

Поддержка капч:
​


reCaptcha2FunCaptchaTikTokGeeTesthCaptchaAWS WAFOther
ДаДаДаДаДаДаДа

Параметры конструктора: ​


ПараметрТипПо умолчаниюОписание
pagePage—Экземпляр Puppeteer page
apiKeystring—API-ключ Cap.Guru
serverstring'https://api.cap.guru'URL сервера API
attemptsnumber5Макс. количество попыток
debugbooleanfalseВывод отладочных сообщений
selectorstring''CSS-селектор контейнера капчи

Требования ​

  • Puppeteer 24 или 25
  • Node.js 18+ (для Puppeteer 25 нужен Node.js 22.12+)

Обработка ошибок ​

При неверном API-ключе или нулевом балансе выбрасывается CapGuruFatalError — модуль сразу прекращает попытки.
Если капчу не удалось решить за все попытки, выбрасывается Error.
CapGuruFatalError — наследник Error, поэтому проверяйте его первым:

javascript
const { CapGuruFatalError } = require('capguru');

try {
  const kind = await solver.auto(30);
  console.log('Captcha:', kind || 'not found');
} catch (e) {
  if (e instanceof CapGuruFatalError) {
    console.log('Проблема с API-ключом или балансом:', e.message);
  } else if (e.message.includes('ERROR_CAPTCHA_UNSOLVABLE')) {
    console.log('Капча не решена за все попытки');
  }
}