حل اختبارات CAPTCHA متعددة في Python وNode.js
حدّد عدد عمليات الحل النشطة، لا عدد الطلبات التي تبدأها فحسب. تشغّل الأمثلة أدناه ثماني مهام reCAPTCHA Enterprise مستقلة، بحد أقصى أربع عمليات حل نشطة في الوقت نفسه، مع معالجة كل نتيجة فور اكتمالها.
أربع عمليات هي إعداد نموذجي للتزامن، وليست حداً لسعة solvethree. اختر حداً يناسب السرعة التي يستطيع بها تطبيقك استخدام الحلول المُعادة.
في هذه الصفحة
جهّز SDK ومدخلات المهام
استخدم Python 3.10+ أو Node.js 22+. ثبّت SDK الرسمية من رابط التنزيل في الوثائق؛ استخدم التنزيل المباشر للحزمة. احتفظ بمفتاح API لمساحة العمل على الخادم.
- اضبط
SOLVETHREE_API_KEYوSOLVETHREE_PROXYفي بيئة الخادم. - استبدل
accounts.example.comوloginباسم المضيف والإجراء المستهدفَين. يجب أن يكون للموقع بالفعل ملف تعريف نشط متاح لمساحة عملك؛ فإرسال اسم مضيف لا يُنشئ ملف تعريف. - تعامل مع كل عنصر في
jobsعلى أنه مهمة منطقية منفصلة. تكرّر الأمثلة الموقع والإجراء والوكيل أنفسهم لتسهيل قراءة الدفعة، لكنها تمنح كل مهمةrequestIdمتميّزاً. - أبقِ مدخلات كل مهمة دون تغيير أثناء الاستعادة. تحتاج عملية الحل المستقلة الجديدة إلى معرّف جديد؛ أما استعادة عملية حل انقطعت فتحتاج إلى المعرّف الأصلي ومدخلات مطابقة.
شغّل دفعة محدودة التزامن
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 مهمة وينتظر نتيجة جاهزة أو يطلق استثناءً. لا يتوفّر عميل غير متزامن أصلي، لذا فإن استدعاءه مباشرة داخل دالة غير متزامنة سيظل يحجب خيط حلقة الأحداث لتلك الدالة. يستخدم المثال أربعة عاملين في تجمّع خيوط، لكل منهم عميله الخاص، ويعالج كائنات Future المكتملة دون انتظار الدفعة بأكملها.
يحدّ Node.js من التزامن عبر أربعة وعود لعاملين. ينتظر كل عامل اكتمال عملية حل واحدة قبل أخذ عمل آخر. ينتظر Promise.all هؤلاء العاملين؛ ولا يبدأ كل الأعمال دفعة واحدة. في المقابل، يؤدي ربط قائمة أعمال غير محدودة مباشرة باستدعاءات solve إلى بدء القائمة بأكملها فوراً، ولا يوفّر حداً مفيداً للتزامن.
يلتقط كلا المثالين الأخطاء لكل مهمة على حدة، حتى لا تتسبب عملية حل فاشلة واحدة في إيقاف الأعمال المتبقية. تنطبق المهلة البالغة 180 ثانية على كل استدعاء لـ solve، لا على الدفعة بأكملها.
استخدم كل نتيجة جاهزة فوراً
استبدل التعليق في مسار النجاح بشيفرة الإرسال إلى موقعك المستهدف قبل تشغيل دفعة فعلية. يحدّد المعرّف المطبوع المهمة؛ وليس رمز reCAPTCHA. أرسل solution.token مع userAgent وsecChUa المُعادين، باستخدام الوكيل نفسه الذي قُدّم لتلك المهمة.
لا تجمع كل الرموز وتنتظر أبطأ عملية حل قبل استخدامها. عالج كل نتيجة جاهزة فور وصولها. تحلّ SDK اختبار CAPTCHA؛ لكنها لا ترسل الحل إلى موقعك المستهدف، كما أن جاهزية المهمة لا تثبت أن الموقع المستهدف قبل الطلب اللاحق.
استعد مهمة واحدة انقطعت، لا الدفعة بأكملها
تطبع الأمثلة أسماء أصناف الأخطاء لإبقاء نمط العامل مختصراً. عند التكامل، احتفظ بالعمل المتأثر ومعرّفات الاستعادة التي توفّرها أخطاء SDK: تستخدم Python الحقلين request_id وtask_id؛ وتستخدم JavaScript الحقلين requestId وtaskId.
- تنتهي مهلة عملية حل أو ينقطع اتصالها.
افحص الخطأ بحثاً عن معرّف مهمة أو معرّف طلب. قد تظل المهمة البعيدة موجودة.
جرّب هذا: استأنف الاستقصاء عبر GET عندما تعرف معرّف المهمة. وإلا فاستعد الإنشاء بإعادة إرسال مدخلات مطابقة بمعرّف الطلب نفسه.
- تُطلق SDK الاستثناء TaskFailedError.
افحص errorCode وerror للمهمة التي وصلت إلى حالة نهائية.
جرّب هذا: توقّف عن استقصاء تلك المهمة وعالج السبب المُبلّغ عنه قبل بدء عملية حل أخرى. لا تُعد المحاولة عشوائياً بمدخلات غير صالحة دون تغييرها.
تؤدي إعادة تشغيل أيٍّ من المثالين إلى توليد معرّفات طلبات جديدة وبدء مهام منطقية جديدة؛ وليست استعادة. تتجنب كلتا حزمتَي SDK إعادة محاولة إنشاء المهمة تلقائياً، لذا احتفظ بمعلومات كافية لاستعادة العمل الذي انقطع فقط بدلاً من إعادة إرسال العمل الناجح.
المصادر ومرجع API
شغّل مهمتك الأولى.
ابدأ برصيد قدره $5 في مساحة العمل.