Python ve Node.js ile birden fazla CAPTCHA çözün
Yalnızca başlattığınız istek sayısını değil, etkin çözüm işlemlerinin sayısını da sınırlayın. Aşağıdaki örnekler, aynı anda en fazla dört çözüm işlemi etkin olacak şekilde sekiz bağımsız reCAPTCHA Enterprise görevi çalıştırır ve her sonucu tamamlandıkça işler.
Dört, örnek bir eşzamanlılık ayarıdır; solvethree kapasite sınırı değildir. Uygulamanızın döndürülen çözümleri ne kadar hızlı kullanabildiğine uygun bir sınır seçin.
Bu sayfada
SDK'yı ve görev girdilerini hazırlayın
Python 3.10+ veya Node.js 22+ kullanın. Resmî SDK'yı belgelerdeki indirme URL'sinden yükleyin; doğrudan paket indirmesini kullanın. Çalışma alanının API anahtarını sunucuda tutun.
- Sunucu ortamında
SOLVETHREE_API_KEYveSOLVETHREE_PROXYdeğişkenlerini ayarlayın. accounts.example.comvelogindeğerlerini hedef ana makine adınız ve eyleminizle değiştirin. Sitenin, çalışma alanınızın kullanımına açık etkin bir profili zaten bulunmalıdır; ana makine adı göndermek profil oluşturmaz.jobsiçindeki her öğeyi ayrı bir mantıksal görev olarak değerlendirin. Örnekler, toplu işlemin okunabilirliğini korumak için aynı siteyi, eylemi ve proxy'yi tekrarlar, ancak her göreve farklı birrequestIdverir.- Kurtarma sırasında her görevin girdilerini değiştirmeyin. Yeni ve bağımsız bir çözüm işlemi yeni bir kimlik gerektirir; kesintiye uğramış bir çözüm işlemini kurtarmak ise özgün kimliği ve birebir aynı girdileri gerektirir.
Eşzamanlılığı sınırlı bir toplu işlem çalıştırın
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
from uuid import uuid4
from solvethree import Solvethree
# Each worker gets its own synchronous client.
def solve_one(job):
client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
return client.solve({**job, "requestId": str(uuid4())}, timeout=180)
jobs = [
{"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"]}
for _ in range(8)
]
with ThreadPoolExecutor(max_workers=4) as pool:
futures = [pool.submit(solve_one, job) for job in jobs]
for future in as_completed(futures):
try:
result = future.result()
print("Ready task:", result["id"])
# Submit this solution promptly; don't wait for the whole batch.
except Exception as error:
print("One task failed:", type(error).__name__)import { randomUUID } from 'node:crypto';
import { Solvethree } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const jobs = Array.from({ length: 8 }, () => ({
site: 'accounts.example.com', action: 'login',
proxy: process.env.SOLVETHREE_PROXY, requestId: randomUUID(),
}));
let next = 0;
async function worker() {
while (next < jobs.length) {
const job = jobs[next++];
try {
const result = await client.solve(job, { timeoutMs: 180_000 });
console.log('Ready task:', result.id);
// Submit this solution promptly, before taking another job.
} catch (error) {
console.error('One task failed:', error.constructor.name);
}
}
}
await Promise.all(Array.from({ length: Math.min(4, jobs.length) }, worker));`Solvethree` senkron olduğu için Python burada iş parçacıklarına ihtiyaç duyar. Her solve çağrısı bir görev oluşturur ve hazır bir sonuç bekler veya istisna fırlatır. Yerel bir asenkron istemci yoktur; bu nedenle doğrudan asenkron bir fonksiyonun içinde çağrılması yine de o fonksiyonun olay döngüsü iş parçacığını bloke eder. Örnek, her biri kendi istemcisine sahip dört iş parçacığı havuzu işçisi kullanır ve tüm toplu işlemi beklemeden tamamlanan future nesnelerini işler.
Node.js, eşzamanlılığı dört işçi promise'iyle sınırlar. Her işçi, başka bir işi almadan önce bir çözüm işlemini bekler. Promise.all bu işçileri bekler; her işi aynı anda başlatmaz. Buna karşılık, sınırsız bir iş listesini doğrudan solve çağrılarına eşlemek tüm listeyi hemen başlatır ve işe yarar bir eşzamanlılık sınırı sağlamaz.
Her iki örnek de hataları görev başına yakalar; böylece bir başarısız çözüm işlemi kalan işleri durdurmaz. 180 saniyelik zaman aşımı, tüm toplu işleme değil, her bir solve çağrısına uygulanır.
Hazır olan her sonucu hemen kullanın
Gerçek bir toplu işlem çalıştırmadan önce başarı akışındaki yorumu hedefe gönderim kodunuzla değiştirin. Yazdırılan kimlik görevi tanımlar; reCAPTCHA token'ı değildir. solution.token değerini, döndürülen userAgent ve secChUa ile birlikte, o görev için sağlanan aynı proxy'yi kullanarak gönderin.
Tüm token'ları toplayıp kullanmadan önce en yavaş çözüm işlemini beklemeyin. Hazır olan her sonucu geldiği yerde işleyin. SDK CAPTCHA'yı çözer; çözümü hedefinize göndermez ve hazır bir görev, hedefin sonraki isteği kabul ettiğini kanıtlamaz.
Tüm toplu işlemi değil, kesintiye uğrayan tek görevi kurtarın
Örnekler, işçi düzenini kısa tutmak için hata sınıfı adlarını yazdırır. Bir entegrasyonda, etkilenen işi ve SDK hatalarının sunduğu kurtarma kimliklerini saklayın: Python request_id ve task_id; JavaScript ise requestId ve taskId kullanır.
- Bir çözüm işlemi zaman aşımına uğrar veya bağlantısını kaybeder.
Hatada görev kimliği veya istek kimliği olup olmadığını kontrol edin. Uzak görev hâlâ mevcut olabilir.
Şunu deneyin: Görev kimliğini biliyorsanız GET ile durum sorgulamaya devam edin. Aksi hâlde, aynı girdileri aynı istek kimliğiyle yeniden göndererek oluşturma işlemini kurtarın.
- SDK, TaskFailedError fırlatır.
Nihai duruma ulaşan görevin errorCode ve error alanlarını inceleyin.
Şunu deneyin: Bu görevi sorgulamayı durdurun ve başka bir çözüm işlemi başlatmadan önce bildirilen nedeni giderin. Değiştirilmemiş geçersiz girdilerle körü körüne yeniden denemeyin.
Örneklerden herhangi birini yeniden çalıştırmak yeni istek kimlikleri oluşturur ve yeni mantıksal görevler başlatır; bu bir kurtarma işlemi değildir. Her iki SDK da görev oluşturmayı otomatik olarak yeniden denemekten kaçınır; bu nedenle başarılı işleri yeniden göndermek yerine yalnızca kesintiye uğrayan işi kurtaracak kadar bilgi saklayın.
Kaynaklar ve API referansı
İlk görevinizi çalıştırın.
$5 çalışma alanı kredisiyle başlayın.