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
- Node.js 18 veya daha yeni (
node --version). - Bir Scarnox API anahtarı. Anahtarı bir ortam değişkeninde tutun.
- Sayfadaki PopularCaptcha widget'ının sitekey'i. Henüz yoksa captcha sitekey nasıl bulunur rehberine bakın.
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:
- GET yanıtındaki
set-cookiedeğerlerini kopyalayıp POST'ta geri gönderin. - Oturumu sizin yerinize tutan bir tarayıcı otomasyon aracı kullanın. Bkz. Playwright ve Puppeteer ile captcha çözme.
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.