Node.js ile reCAPTCHA Enterprise çözün
Node.js 22+ üzerinde resmî solvethree JavaScript SDK'yı kullanın. Etkin bir site profili yapılandırın, sitenin ana makine adını ve eylemini belirtin ve bir proxy üzerinden çözüm alın. SDK, token'ı ve tarayıcı kimliğini döndürür; uygulamanız bunları hedefe gönderir.
Bu sayfada
SDK'yı yükleyin ve siteyi yapılandırın
Resmî paketi doğrudan solvethree.com üzerinden yükleyin:
npm install https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgz- 1.
Site profilini etkinleştirin
Hedef siteyi konsolda yapılandırın ve profilinin etkin ve çalışma alanınızda kullanılabilir olduğundan emin olun. Ana makine adı ve eylem göndermek profil oluşturmaz. Site profili kurulumu kılavuzuna bakın.
- 2.
Sunucu ortamını ayarlayın
Node.js sürecinin ortamında SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına, SOLVETHREE_PROXY değerini ise proxy URL'nize ayarlayın. API anahtarını sunucuda tutun; tarayıcı kodunda açığa çıkarmayın.
- 3.
Betiği hazırlayın
Sonraki örneği solve.mjs olarak kaydedin. accounts.example.com yerine yapılandırdığınız ana makine adını, login yerine de sayfanın gerçek reCAPTCHA eylemini yazın.
Enterprise token'ını isteyin
site için sayfa URL'si değil, ana makine adı kullanın. reCAPTCHA varsayılan olarak enterprise-v3 kullandığından örnekte recaptchaType gerekmez. type veya url eklemeyin. İstekte proxy veya proxyCandidates alanlarından tam olarak biri bulunmalıdır; bu örnek tek bir proxy kullanır.
import { randomUUID } from 'node:crypto';
import { Solvethree, SolvethreeError, TaskFailedError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const request = {
site: 'accounts.example.com', // Use your configured hostname.
action: 'login', // Use the page's actual action.
proxy: process.env.SOLVETHREE_PROXY,
requestId: randomUUID(),
};
let result;
try {
result = await client.solve(request, { timeoutMs: 180_000 });
} catch (error) {
if (error instanceof TaskFailedError) {
throw new Error(`Task failed: ${error.errorCode}`);
}
if (error instanceof SolvethreeError) {
// Save these IDs; use them to recover the existing task.
console.error({ requestId: error.requestId, taskId: error.taskId });
}
throw error;
}
const { token, userAgent, secChUa } = result.solution;
console.log('Ready task:', result.id); // Keep solution credentials private.Ortam değişkenlerini ayarladıktan sonra betiği Node.js ile çalıştırın. solve, görevi bir kez oluşturur ve görev hazır olana veya bir istisna fırlatana kadar durumunu sorgular. 180,000 ms zaman aşımı, istemcinin bekleme süresini sınırlar.
Döndürülen alanların farklı işlevleri vardır:
result.id, görevin kimliğidir. CAPTCHA token'ı değildir.result.solution.token, uygulamanın CAPTCHA alanında gönderilecek değerdir.result.solution.userAgentveresult.solution.secChUa, bu token ile kullanılacak tarayıcı kimliğidir.
Çözüm değerlerini gizli tutun. Süreç yeniden başlatıldıktan sonra işleme devam etmeniz gerekiyorsa solve çağrısından önce requestId değerini ve görev girdilerini eksiksiz kaydedin; proxy kimlik bilgilerini de koruyun.
Aynı proxy üzerinden gönderin
solve döndükten sonra aynı betikte devam edin. Bu örnek undici kullanır; yorum satırında açıklandığı gibi bunu ayrıca yüklemelisiniz. Token'ı request.proxy üzerinden gönderir ve döndürülen tarayıcı kimliği alanlarının ikisini de kullanır.
// Continue after client.solve(). Install undici separately: npm install undici@7.
import { fetch, ProxyAgent } from 'undici';
const dispatcher = new ProxyAgent(request.proxy);
try {
// Replace the URL and form fields with your application's contract.
const response = await fetch('https://accounts.example.com/login', {
method: 'POST',
dispatcher,
redirect: 'manual',
headers: {
'user-agent': result.solution.userAgent,
'sec-ch-ua': result.solution.secChUa,
},
body: new URLSearchParams({
'g-recaptcha-response': result.solution.token,
}),
signal: AbortSignal.timeout(30_000),
});
console.log('Application HTTP status:', response.status);
await response.arrayBuffer();
} finally {
await dispatcher.close();
}URL'yi ve form alanlarını uygulamanızın beklediği yapıya göre değiştirin. Örnek yalnızca g-recaptcha-response sağlar; uygulamanın gerektirdiği diğer alanları ve oturum verilerini de ekleyin. Hedefi, çözüm aldığınız site ve eylemle tutarlı tutun.
Çözüm isteği tek bir proxy kullandığından request.proxy değerini yeniden kullanmak gönderimin o proxy üzerinden yapılmasını sağlar. İsteği proxyCandidates kullanacak şekilde değiştirirseniz başarılı proxy'yi SDK'nın successfulProxy yardımcı işleviyle seçin.
Bir görevin hazır olması, hedefin uygulama isteğinizi kabul ettiği değil, bir çözüm üretildiği anlamına gelir. Hedefin yanıtında gerçek başarı koşulunu kontrol edin; HTTP durumunu yazdırmak yeterli değildir. Reddetme nedenlerini teşhis etmek için hazır token reddedildi kılavuzuna bakın.
Hataları yönetin ve kesintiye uğrayan isteklere devam edin
Çözüm örneği, görevi sonlandıran hataları diğer SDK hatalarından ayırır. Bu ayrımı koruyun: başarısız bir görev ile başarısız bir HTTP isteği farklı şekilde ele alınmalıdır.
- solve, TaskFailedError fırlatır
İstisna, errorCode ve taskId içerir. Hata metni dahil başarısız görevin tam yanıtına ihtiyacınız varsa getTask(taskId) çağrısı yapın.
Şunu deneyin: O görevin durumunu sorgulamayı bırakın ve yeni bir görev oluşturmadan önce bildirilen nedeni giderin. Değiştirilmemiş geçersiz girdilerle yeniden denemeyin.
- Bir SolvethreeError, taskId içerir
SDK'da mevcut görevin kimliği bulunur.
Şunu deneyin: getTask ile durum sorgulamaya devam edin. pending veya solving durumlarında devam edin, çözümü yalnızca ready durumunda kullanın ve failed durumunda durun.
- Oluşturma işlemi kesintiye uğrar ve yalnızca requestId kullanılabilir
Bağlantının zaman aşımına uğraması, görevin oluşturulmadığını kanıtlamaz.
Şunu deneyin: Aynı görev girdileri ve aynı requestId ile createTask kullanarak mevcut göreve erişin. Bu kimliği farklı girdilerle yeniden kullanmak çakışmaya yol açar.
- API bir HTTP isteğini reddeder
Yanıtı hazır veya başarısız bir görev olarak ele almak yerine ApiError tarafından sunulan HTTP durumunu inceleyin.
Şunu deneyin: Başarı yanıtının içeriğini işlemeden önce HTTP hatasını giderin. Her hatanın yetersiz krediden kaynaklandığını varsaymayın.
Örnek, program her başladığında yeni bir requestId üretir. Değiştirmeden yeniden çalıştırmak kesintiye uğrayan işleme devam etmek değildir: bunun yerine kaydettiğiniz isteği ve kimlikleri kullanın. SDK, görev oluşturmayı hiçbir zaman otomatik olarak yeniden denemez; ancak çözüm için belirlenen süre içinde geçici durum sorgulama hatalarında Retry-After değerine uyar.
Durum sorgulama ve bekleme ayarlarını açıkça belirlemek için görev durumu sorgulama ve zaman aşımları kılavuzuna bakın.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.