Солвер капчі на Node.js: робочий приклад з fetch (2026)
Солвер капчі на Node.js — це один HTTP-запит. Node 18 і новіші мають fetch, тож для виклику API пакет не потрібен. Надішліть sitekey і URL сторінки, дочекайтеся відповіді і покладіть токен у форму. Цей посібник показує весь потік для PopularCaptcha, яку Scarnox сьогодні розв'язує в режимі proxyless.
Почніть з безкоштовного пробного кредиту, картка не потрібна і спершу запустіть наведений нижче код на тестовій сторінці.
Вимоги
- Node.js 18 або новіший (
node --version). - Ключ API Scarnox. Зберігайте його у змінній середовища.
- Sitekey віджета PopularCaptcha на сторінці. Якщо його ще немає, дивіться як знайти sitekey капчі.
Модуль солвера
Модуль нижче — це одна функція. Вона надсилає запит до 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
Cookie і сесії
Звичайний fetch не зберігає cookie між запитами. Багато сторінок реєстрації та пошуку прив'язують капчу до cookie сесії, тому токен без відповідного cookie може бути відхилений. Є два способи це обробити:
- Скопіюйте значення
set-cookieз відповіді на GET і надішліть їх назад у POST. - Використовуйте інструмент автоматизації браузера, який зберігає сесію за вас. Дивіться розв'язання капчі в Playwright і Puppeteer.
Перший варіант обирайте, коли форма проста і сайт використовує мало 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 тарифікує за кожне успішне розв'язання. Невдалі розв'язання не тарифікуються. Актуальні тарифи — на сторінці цін. Щоб почати, почніть з безкоштовного пробного кредиту, картка не потрібна.