Scarnox · Blog

Солвер капчі на Node.js: робочий приклад з fetch (2026)

Солвер капчі на Node.js — це один HTTP-запит. Node 18 і новіші мають fetch, тож для виклику API пакет не потрібен. Надішліть sitekey і URL сторінки, дочекайтеся відповіді і покладіть токен у форму. Цей посібник показує весь потік для PopularCaptcha, яку Scarnox сьогодні розв'язує в режимі proxyless.

Почніть з безкоштовного пробного кредиту, картка не потрібна і спершу запустіть наведений нижче код на тестовій сторінці.

Вимоги

Модуль солвера

Модуль нижче — це одна функція. Вона надсилає запит до API з заголовком Bearer, переривається через 185 секунд і кидає помилку, коли errorId не дорівнює 0:

// solver.mjs
const API_URL = "https://api.scarnox.com/api/tasks/create";

export async function solveCaptcha(sitekey, pageUrl, { invisible = false } = {}) {
  const body = {
    captcha_type: "PopularCaptchaTaskProxyless",
    site_key: sitekey,
    site_url: pageUrl,
  };
  if (invisible) body.is_invisible = true;

  const res = await fetch(API_URL, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.SCARNOX_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify(body),
    signal: AbortSignal.timeout(185_000), // виклик повертається, коли токен готовий
  });

  const data = await res.json().catch(() => null);
  if (!data) throw new Error(`HTTP ${res.status}: response was not JSON`);

  if (data.errorId !== 0) {
    throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  }
  return data.solution.token;
}

Опитування немає. Запит залишається відкритим, доки токен не буде готовий, і при успіху токен лежить у solution.token.

Повтори

Невдале розв'язання повертає errorId, відмінний від 0, і за нього не списуються кошти. Для тимчасових збоїв достатньо короткого циклу повторів. Тримайте кількість спроб низькою, щоб зламаний sitekey або URL сторінки не з'їдав час:

export async function solveWithRetry(sitekey, pageUrl, attempts = 3) {
  let lastError;
  for (let i = 1; i <= attempts; i++) {
    try {
      return await solveCaptcha(sitekey, pageUrl);
    } catch (err) {
      lastError = err;
      console.warn(`Attempt ${i} failed: ${err.message}`);
      await new Promise((r) => setTimeout(r, 1000 * i));
    }
  }
  throw lastError;
}

Повнішу політику помилок дивіться в обробці помилок солвера капчі.

Відправка токена

Токен іде в поле форми, яке очікує сайт. Більшість сторінок PopularCaptcha читають h-captcha-response, а багато з них — також g-recaptcha-response. Надішліть обидва для надійності:

// submit.mjs
import { solveWithRetry } from "./solver.mjs";

const pageUrl = "https://example.com/signup";
const token = await solveWithRetry("YOUR-SITEKEY-UUID", pageUrl);

const form = new URLSearchParams({
  email: "you@example.com",
  "h-captcha-response": token,
  "g-recaptcha-response": token,
});

const res = await fetch(pageUrl, {
  method: "POST",
  body: form,
  redirect: "manual",
});
console.log("Status:", res.status);

Запуск:

SCARNOX_API_KEY=scarnox_YOURAPIKEY node submit.mjs

Звичайний fetch не зберігає cookie між запитами. Багато сторінок реєстрації та пошуку прив'язують капчу до cookie сесії, тому токен без відповідного cookie може бути відхилений. Є два способи це обробити:

Перший варіант обирайте, коли форма проста і сайт використовує мало JavaScript. Другий — для всього складнішого.

Практична перевірка: після POST подивіться на код статусу і кінцевий URL. Перенаправлення на сторінку успіху зазвичай означає, що токен прийнято. Сторінка, яка знову показує віджет, зазвичай означає відхилення або що cookie з GET не передалося. Перші кілька запусків записуйте тіло відповіді, щоб бачити, в якому з випадків ви опинилися.

Час

Токен спливає приблизно за дві хвилини. Розв'язуйте близько до моменту відправки. Типова помилка — розв'язати на початку довгого завдання, а відправити пізніше. Розв'язуйте і одразу відправляйте. Посібник про термін дії токена капчі розглядає це детальніше.

Невидимі капчі

Якщо віджет на сторінці має data-size="invisible", передайте { invisible: true }. Тоді функція надсилає is_invisible: true разом із запитом:

const token = await solveCaptcha("YOUR-SITEKEY-UUID", pageUrl, { invisible: true });

Якщо сторінка також прив'язує до віджета колбек, форма може потребувати його виклику з токеном. Знайдіть його в скрипті сторінки. Посібник про невидиму капчу описує патерни.

Скрапінг із солвером

Іноді капча з'являється на сторінці, яку ви скрапите, а не у формі, яку відправляєте. Патерн той самий: знайдіть віджет у HTML, розв'яжіть його і відправте на URL, куди віджет надсилає дані. Тримайте низьку частоту запитів і спершу перевірте умови сайту. Скрапьте відповідально: дотримуйтесь robots.txt, уникайте персональних даних, які вам не потрібні, і не перевантажуйте сервер.

Ціни

Scarnox тарифікує за кожне успішне розв'язання. Невдалі розв'язання не тарифікуються. Актуальні тарифи — на сторінці цін. Щоб почати, почніть з безкоштовного пробного кредиту, картка не потрібна.

Наступні кроки