AWS Lambda'da Node.js SDK'sını kullanın
Node.js 22 veya sonraki bir sürümü kullanın ve resmî SDK'yı işleyicinizle birlikte paketleyin. İşlevin görev ve hata kimliklerini döndürmeye zamanı kalması için SDK'nın son süresini Lambda'nın kalan yürütme süresinden daha kısa ayarlayın.
Bu sayfada
SDK'yı paketleyin ve hedefi yapılandırın
- 1.
Bağımlılığı yükleyin
Temiz bir derleme dizininde bir npm paketi başlatın.
https://solvethree.com/downloads/solvethree-sdk-0.1.0.tgzadresindeki resmî tarball arşivini npm ile yükleyin. Bu paket@solvethree/sdkiçe aktarımını sağlar; npm kayıt defterinde yayımlanmış bir sürüm olduğunu varsaymayın. - 2.
Çalışma alanını ve hedefi yapılandırın
SOLVETHREE_API_KEY,CAPTCHA_SITEveSOLVETHREE_PROXYadlı özel Lambda ortam değişkenlerini ayarlayın. Bir çalışma alanı API anahtarı, tam URL yerine hedef ana makine adı ve bu görevin proxy'sini kullanın. Çalışma alanında bu site için zaten etkin bir profil bulunmalıdır; site profili kurulumuna bakın. - 3.
İşleyiciyi kaydedin ve paketleyin
Aşağıdaki örneği
index.mjsolarak kaydedin.index.mjs, paket meta verileri ve yüklenmişnode_modulesdizini arşivin kökünde olacak şekilde bir ZIP oluşturun; bunları kapsayıcı bir proje dizininin içine koymayın. ZIP'e kimlik bilgileri eklemeyin. - 4.
Mevcut Lambda sürecinizle dağıtın
Node.js 22 çalışma zamanını kullanın ve işleyiciyi
index.handlerolarak ayarlayın. Mantıksal iş için sabit birrequestIdsağlayarak yetkili arka uç veya IAM akışınız üzerinden çağırın. Döndürülen çözüm verilerini gizli tutun.
Örnekte login eylemi kullanılır; dağıtmadan önce bunu hedefinizin beklediği eylemle değiştirin. Tek bir proxy gönderir ve varsayılan enterprise-v3 istek türünü kullanır. reCAPTCHA type veya url alanlarını eklemeyin.
SDK beklemesini çağrının süre bütçesiyle sınırlandırın
import { Solvethree, SolvethreeError, TaskFailedError, ApiError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
export const handler = async (event, context) => {
const timeoutMs = Math.min(180000, context.getRemainingTimeInMillis() - 1500);
if (timeoutMs < 1000) throw new Error('Not enough execution time to start a task');
// The caller supplies one stable ID for this logical job; Lambda retries must
// reuse it. awsRequestId changes with invocations and is not that logical ID.
if (!event.requestId) throw new Error('Provide a stable requestId');
try {
return await client.solve({
site: process.env.CAPTCHA_SITE, action: 'login', proxy: process.env.SOLVETHREE_PROXY,
requestId: event.requestId,
}, { timeoutMs, signal: AbortSignal.timeout(timeoutMs) });
} catch (error) {
if (error instanceof TaskFailedError) return { status: 'failed', id: error.taskId, errorCode: error.errorCode };
if (error instanceof ApiError) return { apiError: error.status, requestId: error.requestId };
if (error instanceof SolvethreeError) return { interrupted: true, requestId: error.requestId, taskId: error.taskId };
throw error;
}
};
// Invoke through your authorized backend/IAM flow. The return value is private
// solution data; do not attach this handler to an unauthenticated public URL.İşleyici, Lambda'nın kalan yürütme süresini okur, 1,500 milisaniye ayırır ve SDK beklemesini 180,000 milisaniyeyle sınırlandırır. Bu üst sınır bu örneğe aittir; evrensel bir Lambda yürütme sınırı değildir. Ayrılan süreden sonra bir saniyeden az zaman kalırsa işleyici başlamayı reddeder.
Hem SDK zaman aşımı hem de iptal sinyali hesaplanan son süreyi kullanır. solve, görevi bir kez oluşturur ve hazır olana veya bir hata oluşana kadar durumunu sorgular. Ayrılan süre, hata işlemenin kurtarma bilgilerini döndürmesine zaman tanır; ancak Lambda'nın zorla sonlandırılması yine de herhangi bir yanıt verilmesini engelleyebilir.
Çağıran taraf, çağrı yeniden denemelerinde event.requestId değerini korumalıdır. 1–64 ASCII harfi, rakam, alt çizgi veya kısa çizgi kullanın. awsRequestId kullanmayın: bu, mantıksal çözüm isteğini değil, bir çağrıyı tanımlar.
Başka bir çözümü körü körüne başlatmadan hataları işleyin
| Sonuç | Yapılması gereken |
|---|---|
ready durumundaki bir görev | Çözümünü kullanın. Yalnızca görev oluşturulması veya başarılı bir HTTP yanıtı yeterli değildir. |
status: failed | id ve errorCode değerlerini kaydedin. Hata mesajına ihtiyacınız varsa görevi alın, ancak başarısız olan bu görevin durumunu sorgulamayı bırakın. |
apiError | HTTP durumunu ve döndürülen istek kimliğini kaydedin. Bu, görevin son durumu olan bir başarısızlık değil, bir API isteği hatasıdır; aynı girdilerle yeniden denemeden önce nedenini inceleyin. |
interrupted: true | Kurtarma için döndürülen tüm taskId ve requestId değerlerini, çağıran tarafın ilk mantıksal istek kimliğiyle birlikte saklayın. |
Doğrulama hataları ve beklenmeyen hatalar yeniden fırlatılır. İşleyici her istisnayı bir kesinti yanıtına dönüştürmez.
- 1.
Varsa görev kimliğiyle kurtarın
Mevcut görevi
getTaskile alın.pendingvesolving, görevin hâlâ çalıştığı anlamına gelir; yalnızcareadykullanılabilir bir çözüm içerir. Sonraki beklemeleri yeni çağrının kalan süre bütçesi içinde tutun. - 2.
Yoksa mantıksal istek kimliğiyle kurtarın
Aynı görev isteğini, çağıranın özgün
requestIddeğeriyle yeniden deneyin. Eşleşen girdiler mevcut görevi döndürür; farklı girdiler çakışmaya neden olur. Yapılandırma değişiklikleri sonrasında da dahil olmak üzere, kurtarma sırasında siteyi, eylemi ve proxy'yi değiştirmeyin.
Bağlantı zaman aşımı, görev oluşturmanın başarısız olduğunu kanıtlamaz. Yeni bir mantıksal istek kimliği atamadan önce mevcut görevi kurtarın. Temel işleyiş kuralları için görev sorgulama ve API hata işleme belgelerine bakın.
Aynı proxy ve döndürülen tarayıcı kimliğiyle gönderin
SDK, çözüm verilerini döndürür; bunları hedefe uygulamaz. Uygulamanız çözümü gönderirken yapılandırılmış proxy'yi ve döndürülen userAgent ile secChUa değerlerini kullanın. Bunların yerine ilgisiz bir tarayıcı kimliği veya hedef URL kullanmayın. Hazır bir görev, çözümün üretildiği anlamına gelir; hedefin sonraki isteği kabul ettiği anlamına gelmez.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.