Node.js'te reCAPTCHA v3 Nasıl Çözülür ve Bir Action Nasıl Ayarlanır

reCAPTCHA v3 asla bir bulmaca göstermez. Ziyareti sessizce puanlar ve sayfaya bir token verir; siteyse bunu kendi arka ucunda doğrular. Sizin tarafınızda tıklanacak bir şey yoktur; dolayısıyla tüm iş, sitenin kabul edeceği bir token üretmektir. Node.js'te bu, aynı recaptcha v2 için kullanılan metot, bir ek seçenekle.
Çalışıp çalışmayacağına karar veren ayrıntı aksiyondur.
Kurulum
npm install capskip
const { CapSkip } = require('capskip');
const solver = new CapSkip({
host: '127.0.0.1',
port: 8080,
recaptchaTimeout: 300, // seconds, shared with Turnstile and GeeTest
});CapSkip yerel olarak çalışır; bu nedenle herhangi bir çağrı başarılı olmadan önce masaüstü uygulamasının açık olması gerekir.
Temel çağrı
const result = await solver.recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/checkout',
{ version: 'v3', action: 'submit' },
);
console.log(result.code); // the v3 tokenv2'den iki fark: version: 'v3' gereklidir ve action sayfanın şuna geçirdiğiyle eşleşmelidir: grecaptcha.execute. Bunu dışarıda bırakırsanız varsayılan olarak şu olur: verify.
Eylem neden önemlidir
Eylemler (action), bir sitenin her korumalı etkileşime iliştirdiği etiketlerdir; böylece bir giriş ile bir ödeme bağımsız olarak puanlanabilir. Çoğu backend, token'daki eylemin o uç nokta için bekledikleriyle eşleştiğini kontrol eder.
Yanlış etiketi gönderin ve token gerçektir ama farklı bir etkileşim için etiketlenmiş olarak gelir; bunu birçok doğrulayıcı reddeder. Tahmin etmek yerine gerçek değeri sayfadan okuyun:
const html = await (await fetch('https://example.com/checkout')).text();
// Sites normally call execute() with the action as a string literal.
const match = html.match(/execute\([^,]+,\s*\{\s*action:\s*['"]([^'"]+)/);
const action = match ? match[1] : 'verify';
const result = await solver.recaptcha(sitekey, pageUrl, {
version: 'v3',
action,
});Yaygın değerler şunlardır: login, submit, homepage ve checkout, ancak bunlar siteyi kim oluşturduysa onun seçtiği rastgele dizelerdir.
Enterprise v3
const result = await solver.recaptcha(sitekey, pageUrl, {
version: 'v3',
enterprise: 1,
action: 'submit',
});Enterprise, farklı bir ürün değil, dik (bağımsız) bir bayraktır, dolayısıyla yalnızca üst üste eklenir. İkisini sayfanın yüklediği betikten ayırt edin: Enterprise şunu çeker: enterprise.js, standart şunu çeker: api.js. Yanlış bir tahmin, hatalı bir token döndürmek yerine çözümü başarısız kılar; dolayısıyla kontrol etmek ucuzdur.
Token'ı gönderme
const response = await fetch('https://example.com/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
token: result.code,
orderId: '...',
}),
});v2'nin aksine standart bir form widget'ı yoktur, bu yüzden v3 entegrasyonları değişir. Bazıları gizli bir g-recaptcha-response alanı, diğerleri özel bir anahtarla JSON gönderir. Bir alan adı varsaymadan önce sayfanın kendi JavaScript'inin ne yaptığını kontrol edin.
Toplu çözüm
const tokens = await Promise.all(
urls.map((url) =>
solver.recaptcha(sitekey, url, { version: 'v3', action: 'submit' })),
);
console.log(tokens.map((t) => t.code));AsyncCapSkip bu pakette de vardır, ancak şunun bir takma adıdır: CapSkip. Her metot zaten bir Promise döndürür, dolayısıyla Promise.all Node'daki eşzamanlılık hikâyesinin tamamı budur.
Hatalar
const { ApiException, NetworkException } = require('capskip');
try {
const result = await solver.recaptcha(sitekey, pageUrl, { version: 'v3' });
} catch (err) {
if (err instanceof NetworkException) {
// CapSkip is not running on the configured port
} else if (err instanceof ApiException) {
// the sitekey or pageurl was rejected
} else {
throw err;
}
}Sık sorulan sorular
Göndermeden önce puanı görebilir miyim?
Hayır. Skor Google'da kalır ve yalnızca backend'leri token'ı doğruladığında site sahibine açıklanır. İstemci tarafından yalnızca bir token alırsınız, başka hiçbir şey almazsınız; bu yüzden önce bir skoru inceleme veya skora göre filtreleme imkânı yoktur.
Sayfada görünür bir action yoksa ne olur?
Bazı sayfalar şunu çağırır: execute biri olmadan, bu durumda varsayılan verify doğrudur. Yukarıdaki regex hiçbir şey bulamazsa, bu genellikle bir ayrıştırma hatasından ziyade bunun nedenidir.
Bir v3 token'ı ne kadar sürer?
Yaklaşık iki dakika, tek kullanımlık, v2 ile aynı. Bir havuz oluşturmak yerine ona ihtiyaç duyan isteğin hemen öncesinde çözün.
Özet
Geçer version: 'v3', ayarlayın action sayfanın gerçekte ne çalıştırdığına göre, şunu ekleyin enterprise: 1 yüklendiğinde enterprise.jsve hızlıca gönderin çünkü token yaklaşık iki dakikada sona erer.
Diğer diller şurada ele alınmıştır: reCAPTCHA v3 çözücü sayfa, Enterprise ayrıntıları şurada: Enterprise çözücü sayfası ve daha geniş Node yüzeyi şurada: Node.js CAPTCHA çözücü sayfa. Gerçek bir token'ın belirişini şu adreste izleyin: v3 demosu. CapSkip bir captcha çözücü kendi makinenizde çalışan.
