Python और Node.js में कई CAPTCHA हल करें
सिर्फ़ शुरू किए जाने वाले अनुरोधों की नहीं, बल्कि सक्रिय समाधान प्रयासों की संख्या सीमित करें। नीचे दिए गए उदाहरण आठ स्वतंत्र reCAPTCHA Enterprise टास्क चलाते हैं, जिनमें एक समय में अधिकतम चार समाधान प्रयास सक्रिय रहते हैं और हर परिणाम पूरा होते ही संभाला जाता है।
चार यहाँ एक उदाहरण के रूप में दी गई कॉन्करेंसी सेटिंग है, solvethree की क्षमता सीमा नहीं। ऐसी सीमा चुनें जो आपके ऐप्लिकेशन के लौटाए गए समाधानों को इस्तेमाल करने की गति के अनुरूप हो।
इस पेज पर
SDK और टास्क इनपुट तैयार करें
Python 3.10+ या Node.js 22+ इस्तेमाल करें। दस्तावेज़ में दिए गए डाउनलोड URL से आधिकारिक SDK इंस्टॉल करें; सीधे पैकेज डाउनलोड का इस्तेमाल करें। वर्कस्पेस की API कुंजी सर्वर पर रखें।
- सर्वर एनवायरनमेंट में
SOLVETHREE_API_KEYऔरSOLVETHREE_PROXYसेट करें। accounts.example.comऔरloginको अपने लक्ष्य होस्टनेम और ऐक्शन से बदलें। साइट की सक्रिय प्रोफ़ाइल आपके वर्कस्पेस के लिए पहले से उपलब्ध होनी चाहिए; होस्टनेम सबमिट करने से प्रोफ़ाइल नहीं बनती।jobsकी हर एंट्री को अलग लॉजिकल टास्क मानें। बैच को पढ़ने में आसान रखने के लिए उदाहरणों में वही साइट, ऐक्शन और प्रॉक्सी दोहराए गए हैं, लेकिन हर टास्क को अलगrequestIdदिया गया है।- रिकवरी के दौरान हर टास्क के इनपुट बिना बदलाव रखें। नए स्वतंत्र समाधान प्रयास के लिए नई ID चाहिए; बाधित समाधान प्रयास को रिकवर करने के लिए मूल ID और बिल्कुल वही इनपुट चाहिए।
सीमित बैच चलाएँ
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));यहाँ Python को थ्रेड चाहिए क्योंकि `Solvethree` सिंक्रोनस है। हर solve कॉल टास्क बनाता है और तैयार परिणाम मिलने तक प्रतीक्षा करता है या अपवाद फेंकता है। कोई नेटिव async क्लाइंट नहीं है, इसलिए इसे सीधे async फ़ंक्शन के अंदर कॉल करने पर भी उस फ़ंक्शन का इवेंट-लूप थ्रेड ब्लॉक होगा। उदाहरण चार थ्रेड-पूल वर्कर इस्तेमाल करता है, जिनमें हर एक का अपना क्लाइंट है, और पूरे बैच की प्रतीक्षा किए बिना पूरे हुए फ़्यूचर संभालता है।
Node.js चार वर्कर प्रॉमिस के ज़रिए कॉन्करेंसी सीमित करता है। हर वर्कर अगला जॉब लेने से पहले एक समाधान प्रयास पूरा होने की प्रतीक्षा करता है। Promise.all उन वर्कर की प्रतीक्षा करता है; यह हर जॉब को एक साथ शुरू नहीं करता। इसके विपरीत, असीमित जॉब सूची को सीधे solve कॉल से मैप करने पर पूरी सूची तुरंत शुरू हो जाती है और कॉन्करेंसी की कोई उपयोगी सीमा नहीं रहती।
दोनों उदाहरण हर टास्क की त्रुटियाँ अलग से पकड़ते हैं, ताकि एक विफल समाधान प्रयास बाकी जॉब को न रोके। 180-सेकंड का टाइमआउट हर solve कॉल पर लागू होता है, पूरे बैच पर नहीं।
हर तैयार परिणाम तुरंत इस्तेमाल करें
वास्तविक बैच चलाने से पहले सफलता वाले कोड पथ की टिप्पणी को अपने लक्ष्य पर सबमिट करने वाले कोड से बदलें। प्रिंट की गई ID टास्क की पहचान करती है; वह reCAPTCHA टोकन नहीं है। उस टास्क के लिए दी गई उसी प्रॉक्सी का इस्तेमाल करके, लौटाए गए userAgent और secChUa के साथ solution.token सबमिट करें।
सभी टोकन इकट्ठा करके उन्हें इस्तेमाल करने से पहले सबसे धीमे समाधान प्रयास की प्रतीक्षा न करें। हर तैयार परिणाम को मिलते ही संभालें। SDK CAPTCHA हल करता है; वह समाधान को आपके लक्ष्य पर सबमिट नहीं करता, और तैयार टास्क यह साबित नहीं करता कि लक्ष्य ने बाद का अनुरोध स्वीकार कर लिया।
एक बाधित टास्क रिकवर करें—पूरा बैच नहीं
वर्कर पैटर्न को छोटा रखने के लिए उदाहरण त्रुटि क्लास के नाम प्रिंट करते हैं। इंटीग्रेशन में, प्रभावित जॉब और SDK त्रुटियों में उपलब्ध रिकवरी ID सहेजकर रखें: Python में request_id और task_id हैं; JavaScript में requestId और taskId हैं।
- समाधान प्रयास टाइमआउट हो जाता है या उसका कनेक्शन टूट जाता है।
त्रुटि में टास्क ID या अनुरोध ID देखें। रिमोट टास्क अब भी मौजूद हो सकता है।
यह आज़माएँ: टास्क ID पता होने पर GET पोलिंग फिर शुरू करें। अन्यथा, बिल्कुल वही इनपुट उसी अनुरोध ID के साथ दोबारा भेजकर टास्क निर्माण रिकवर करें।
- SDK TaskFailedError उठाता है।
अंतिम स्थिति में पहुँचे टास्क के errorCode और error देखें।
यह आज़माएँ: उस टास्क की पोलिंग रोकें और दूसरा समाधान प्रयास शुरू करने से पहले बताए गए कारण को ठीक करें। बिना बदलाव वाले अमान्य इनपुट के साथ आँख मूँदकर दोबारा प्रयास न करें।
किसी भी उदाहरण को दोबारा चलाने पर नई अनुरोध ID बनती हैं और नए लॉजिकल टास्क शुरू होते हैं; यह रिकवरी नहीं है। दोनों SDK टास्क बनाने का प्रयास अपने-आप दोबारा नहीं करते, इसलिए पर्याप्त जानकारी रखें ताकि सफल काम दोबारा सबमिट करने के बजाय केवल बाधित जॉब रिकवर किया जा सके।
स्रोत और API संदर्भ
अपना पहला टास्क चलाएँ।
$5 वर्कस्पेस क्रेडिट के साथ शुरुआत करें।