Node.js'te reCAPTCHA v2 Nasıl Çözülür, Invisible Dahil

reCAPTCHA v2'nin üç çeşidi vardır ve hepsi aynı Node.js yöntemine karşılık gelir. Checkbox salt çağrıdır, Invisible ve Enterprise üçüncü bir argümandaki seçeneklerdir ve ikisi birleştirilebilir. Paket ayrıca kendi TypeScript tanımlarıyla gelir; dolayısıyla bunların hiçbiri ayrı bir @types kurulum.
Kurulum
npm install capskip
CapSkip kendi makinenizde çözer; dolayısıyla önce masaüstü uygulamasının çalışıyor olması gerekir. Ardından istemciyi ayarlarındaki porta yönlendirin:
const { CapSkip } = require('capskip');
const solver = new CapSkip({
apiKey: 'capskip', // any string when key validation is off
host: '127.0.0.1',
port: 8080,
recaptchaTimeout: 300, // seconds
});Üretimde, bağlantı ayrıntılarını ortam değişkenlerinden okuyun:
const solver = new CapSkip({
apiKey: process.env.CAPSKIP_API_KEY || 'capskip',
host: process.env.CAPSKIP_HOST || '127.0.0.1',
port: parseInt(process.env.CAPSKIP_PORT || '8080', 10),
});Üç varyant
| Varyant | Ekleme seçeneği |
|---|---|
| Checkbox | yok |
| Invisible | { invisible: 1 } |
| Enterprise | { enterprise: 1 } |
| Invisible Enterprise | her iki key |
// Checkbox: sitekey and page URL, nothing else.
const result = await solver.recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/login',
);
console.log(result.code); // g-recaptcha-response token
// Invisible.
await solver.recaptcha(sitekey, pageUrl, { invisible: 1 });
// Enterprise, and both at once.
await solver.recaptcha(sitekey, pageUrl, { enterprise: 1 });
await solver.recaptcha(sitekey, pageUrl, { enterprise: 1, invisible: 1 });Argüman stiline dikkat edin. Node, anahtar kelime kullanan Python SDK'sının aksine sitekey'i ve URL'yi konumsal olarak alır. Kodu ikisi arasında taşımak, çoğu hatanın sızdığı yerdir.
TypeScript
Tür tanımları paketle birlikte gelir; dolayısıyla bu, ek kurulum olmadan çalışır:
import { CapSkip, SolveResult } from 'capskip';
const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });
const result: SolveResult = await solver.recaptcha(sitekey, pageUrl);SolveResult taşır captchaId ve code her tür için, userAgent Turnstile için ve üç GeeTest alanı. Yalnızca reCAPTCHA için code önemlidir.
sitekey'i doğru elde etme
Şudur data-sitekey widget kapsayıcısındaki öznitelik ya da şuna verilen ilk argüman: grecaptcha.render Invisible modu, görünür bir konteyner olmadığı anlamına geldiğinde. Her zaman şununla başlar: 6L ve herkese açıktır.
URL, widget'ın oluşturulduğu sayfa olmalıdır. Bir form işleyicisi veya giriş sonrası yönlendirme geçmek, temiz bir şekilde çözülüp ardından doğrulamada başarısız olan bir token'ın olağan nedenidir.
Token'ı gönderme
const body = new URLSearchParams({
'g-recaptcha-response': result.code,
username: '...',
password: '...',
});
const response = await fetch('https://example.com/login', {
method: 'POST',
body,
});Token'lar tek kullanımlıktır ve yaklaşık iki dakika sürer, bu yüzden mümkün olduğunca geç çözün. Site token'ı bir form alanı yerine bir JavaScript callback'ine aktarıyorsa, çözüm aynıdır ancak gönderim farklıdır; bunu bizim reCAPTCHA v2 callback çözücü sayfası kapsar.
Aynı anda birkaç tanesini çözme
const [a, b] = await Promise.all([ solver.recaptcha(sitekeyA, 'https://a.example.com'), solver.recaptcha(sitekeyB, 'https://b.example.com'), ]); console.log(a.code, b.code);
Paket ayrıca şunu dışa aktarır: AsyncCapSkip, ancak Node'da yalnızca şunun bir takma adıdır: CapSkip. Node I/O zaten eşzamansızdır ve her metot zaten bir Promise döndürür, bu yüzden yalnızca Python SDK'sından taşınan kodun çalışmaya devam etmesi için vardır. Ona geçmek hiçbir şey kazandırmaz.
Hatalar
const {
ValidationException, NetworkException, ApiException, TimeoutException,
} = require('capskip');
try {
const result = await solver.recaptcha(sitekey, pageUrl);
} catch (err) {
if (err instanceof ValidationException) { /* bad arguments */ }
else if (err instanceof NetworkException) { /* CapSkip not running */ }
else if (err instanceof ApiException) { /* bad sitekey or url */ }
else if (err instanceof TimeoutException) { /* polling timed out */ }
else throw err;
}Dördü de ortak bir tabanı genişletir, bu nedenle şunu yakalamak CapSkipError tercih ederseniz her şeyi tek bir dalda halleder.
Sık sorulan sorular
Sonuç için sorgulama yapmam gerekir mi?
Hayır. İstemci dahili olarak yoklama yapar ve Promise, tamamlanan token ile çözülür. 250ms sonra kontrol etmeye başlar ve şuna doğru geri çekilir: pollingInterval, bu da genellikle elle yazılmış bir döngüden daha iyidir.
ESM ve import söz dizimiyle çalışır mı?
Evet. Buradaki örnekler şunu kullanır: require kısalık için, ancak import { CapSkip } from 'capskip' çalışır ve paketlenmiş TypeScript tanımları da onunla birlikte gelir.
Bunu Puppeteer veya Playwright ile birlikte kullanabilir miyim?
Evet. Token'ı bu SDK ile çözün, ardından onu şununla sayfaya enjekte edin: page.evaluate göndermeden önce. Bizim Node.js CAPTCHA çözücü sayfası tarayıcı otomasyonu tarafını kapsar.
Özet
Bir yöntem, üç çeşit, şununla seçilir: invisible ve enterprise. Argümanlar konumsaldır, token şuraya yerleşir result.code, ve Promise.all eşzamanlılık için ihtiyacınız olan tek şeydir çünkü AsyncCapSkip burada yalnızca bir takma addır.
Daha geniş Node yüzeyi şuradadır: Node.js CAPTCHA çözücü sayfası, diğer diller şurada: reCAPTCHA v2 çözücü sayfa ve bir şey var canlı v2 demosu karşı test etmek için. CapSkip bir yerel captcha çözücü, dolayısıyla çözüm başına hiçbir ücret alınmaz.
