Scarnox · Blog

Captcha solver Node.js ile: fetch kullanan çalışan örnek (2026)

Node.js'te captcha solver tek bir HTTP isteğidir. Node 18 ve sonrası fetch ile birlikte gelir; API'yi çağırmak için bir pakete ihtiyacınız yoktur. Sitekey'i ve sayfa URL'sini gönderin, yanıtı bekleyin ve token'ı formun içine koyun. Bu rehber, Scarnox'un bugün proxysiz olarak çözdüğü PopularCaptcha için tüm akışı gösterir.

Ücretsiz deneme kredisiyle, kredi kartı gerekmeden başlayın ve aşağıdaki kodu önce bir test sayfasında çalıştırın.

Gereksinimler

Solver modülü

Aşağıdaki modül tek bir fonksiyondur. API'ye Bearer başlığıyla istek gönderir, 185 saniyede iptal eder ve errorId 0 değilse hata fırlatır:

// 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), // çağrı token hazır olduğunda döner
  });

  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;
}

Yoklama yoktur. İstek token hazır olana kadar açık kalır ve başarıda token solution.token içindedir.

Yeniden denemeler

Başarısız bir çözüm errorId değeri olarak 0 dışında bir şey döndürür ve bunun için ücret alınmaz. Geçici hatalar için kısa bir yeniden deneme döngüsü yeterlidir. Deneme sayısını düşük tutun; böylece yanlış bir sitekey ya da sayfa URL'si zaman harcatmaz:

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;
}

Daha kapsamlı bir hata politikası için captcha solver hata yönetimi rehberine bakın.

Token'ı gönderme

Token, form alanına gider; çoğu PopularCaptcha sayfası h-captcha-response alanını okur, birçoğu g-recaptcha-response alanını da okur. Emin olmak için ikisini de gönderin:

// 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);

Şöyle çalıştırın:

SCARNOX_API_KEY=scarnox_YOURAPIKEY node submit.mjs

Çerezler ve oturumlar

Düz fetch, istekler arasında çerezleri tutmaz. Birçok kayıt ve arama sayfası captcha'yı bir oturum çerezine bağlar; bu yüzden eşleşen çerez olmadan gönderilen bir token reddedilebilir. İki yol vardır:

Form basitse ve site çok JavaScript çalıştırmıyorsa ilkini seçin. Daha karmaşık her şey için ikincisini seçin.

Pratik bir kontrol: POST'tan sonra durum koduna ve son URL'ye bakın. Bir başarı sayfasına yönlendirme genellikle token'ın kabul edildiği anlamına gelir. Widget'ın yeniden gösterildiği bir sayfa genellikle reddedildiği ya da GET'teki çerezin gelmediği anlamına gelir. İlk birkaç çalıştırmada yanıt gövdesini loglayın; böylece hangi durumda olduğunuzu görürsünüz.

Zamanlama

Token yaklaşık iki dakikada süresi dolar. Çözümü gönderime yakın yapın. Sık yapılan hata, uzun bir işin başında çözüp sonra göndermektir. Çözün ve hemen gönderin. Captcha token süresi bunu daha ayrıntılı anlatır.

Görünmez captcha'lar

Sayfadaki widget data-size="invisible" içeriyorsa { invisible: true } geçin. Fonksiyon o zaman istekle birlikte is_invisible: true gönderir:

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

Sayfa widget'a bir callback de bağlıysa formun o fonksiyonun token ile çağrılmasına ihtiyacı olabilir. Bunu bulmak için sayfanın script'ini okuyun. Kalıpları görünmez captcha rehberi kapsar.

Solver ile scraping

Bazen captcha, gönderdiğiniz bir formda değil, scrape ettiğiniz bir sayfada çıkar. Aynı kalıp işe yarar: widget'ı HTML'de tespit edin, çözün ve widget'ın gönderdiği URL'ye gönderin. İstek hızını düşük tutun ve önce sitenin koşullarını kontrol edin. Sorumlu scraping için robots.txt dosyasına uyun, ihtiyacınız olmayan kişisel veriden kaçının ve sunucuyu zorlamayın.

Fiyatlandırma

Scarnox başarılı her çözüm için ücretlendirir. Başarısız çözümler ücretlendirilmez. Güncel oranlar için fiyatlandırma sayfasına bakın. Başlamak için ücretsiz deneme kredisiyle, kredi kartı gerekmeden başlayın.

Sonraki adımlar