Solver captcha w Node.js: działający przykład z fetch (2026)
Solver captcha w Node.js to jedno żądanie HTTP. Node 18 i nowsze zawierają fetch, więc do wywołania API nie potrzebujesz pakietu. Wysyłasz sitekey i adres strony, czekasz na odpowiedź i wstawiasz token do formularza. Ten przewodnik pokazuje cały przepływ dla PopularCaptcha, które Scarnox dziś rozwiązuje bez proxy.
Zacznij od darmowego kredytu próbnego, bez karty i najpierw uruchom poniższy kod na stronie testowej.
Wymagania
- Node.js 18 lub nowszy (
node --version). - Klucz API Scarnox. Przechowuj go w zmiennej środowiskowej.
- Sitekey widżetu PopularCaptcha na stronie. Jeśli go jeszcze nie masz, zobacz jak znaleźć sitekey captcha.
Moduł solvera
Poniższy moduł to pojedyncza funkcja. Wysyła żądanie do API z nagłówkiem Bearer, przerywa po 185 sekundach i rzuca wyjątek, gdy errorId nie jest równe 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), // wywołanie zwraca wynik, gdy token będzie gotowy
});
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;
}
Nie ma odpytywania. Żądanie pozostaje otwarte, aż token będzie gotowy, a przy sukcesie token znajduje się w solution.token.
Ponawianie
Nieudane rozwiązanie zwraca errorId inne niż 0 i nie jest za nie naliczana opłata. Do przejściowych błędów wystarczy krótka pętla ponowień. Utrzymuj niską liczbę prób, aby zepsuty sitekey lub adres strony nie zjadał czasu:
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;
}
Pełniejszą politykę błędów znajdziesz w artykule obsługa błędów solvera captcha.
Wysyłanie tokenu
Token trafia do pola formularza, którego oczekuje serwis. Większość stron PopularCaptcha czyta h-captcha-response, a wiele z nich także g-recaptcha-response. Wyślij oba, dla bezpieczeństwa:
// 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);
Uruchom:
SCARNOX_API_KEY=scarnox_YOURAPIKEY node submit.mjs
Ciasteczka i sesje
Zwykły fetch nie zachowuje ciasteczek między żądaniami. Wiele stron rejestracji i wyszukiwania wiąże captcha z ciasteczkiem sesji, więc token wysłany bez pasującego ciasteczka może zostać odrzucony. Są dwa sposoby obsługi tego:
- Skopiuj wartości
set-cookiez odpowiedzi na GET i wyślij je z powrotem przy POST. - Użyj narzędzia do automatyzacji przeglądarki, które utrzymuje sesję za Ciebie. Zobacz rozwiązywanie captcha w Playwright i Puppeteer.
Pierwsze rozwiązanie wybierz, gdy formularz jest prosty, a strona nie uruchamia wiele JavaScriptu. Drugie wybierz w każdym bardziej złożonym przypadku.
Praktyczne sprawdzenie: po POST spójrz na kod statusu i końcowy adres URL. Przekierowanie na stronę sukcesu zwykle oznacza, że token został zaakceptowany. Strona, która znów pokazuje widżet, zwykle oznacza odrzucenie albo że ciasteczko z GET nie zostało wysłane. Zapisuj treść odpowiedzi przez kilka pierwszych uruchomień, aby wiedzieć, w którym przypadku jesteś.
Czas
Token wygasa po około dwóch minutach. Rozwiązuj tuż przed chwilą wysłania. Typowym błędem jest rozwiązanie na początku długiego zadania i wysłanie później. Rozwiąż, a potem od razu wyślij. Wygasanie tokenu captcha omawia to szczegółowo.
Niewidoczne captcha
Jeśli widżet na stronie ma data-size="invisible", przekaż { invisible: true }. Funkcja dołączy wtedy is_invisible: true do żądania:
const token = await solveCaptcha("YOUR-SITEKEY-UUID", pageUrl, { invisible: true });
Jeśli strona podłącza też callback do widżetu, formularz może wymagać wywołania tej funkcji z tokenem. Znajdź ją w skrypcie strony. Przewodnik o niewidocznej captcha omawia wzorce.
Scrapowanie z solverem
Czasem captcha pojawia się na stronie, którą scrapujesz, a nie w formularzu, który wysyłasz. Ten sam wzorzec działa: wykryj widżet w HTML, rozwiąż go, a następnie wyślij na adres, pod który widżet wysyła dane. Utrzymuj niskie tempo żądań i najpierw sprawdź regulamin serwisu. Scrapuj odpowiedzialnie: szanuj robots.txt, unikaj danych osobowych, których nie potrzebujesz, i nie zalewaj serwera.
Cennik
Scarnox nalicza opłatę za każde udane rozwiązanie. Za nieudane rozwiązania nie jest naliczana opłata. Aktualne stawki znajdziesz na stronie cennika. Aby zacząć, zacznij od darmowego kredytu próbnego, bez karty.