يتضمن كل حل لاختبار CAPTCHA طلبات HTTP متعددة: إرسال واحد و3 إلى 10 استطلاعات. بدون إعادة استخدام الاتصال، يدفع كل طلب تكلفة مصافحة TCP جديدة وتفاوض TLS - 100 إلى 300 مللي ثانية لكل اتصال. يوضح هذا الدليل كيفية التخلص من هذا الحمل باستخدام الاتصالات المستمرة وتعدد إرسال HTTP/2 معCaptchaAI.
لماذا تعتبر إعادة استخدام الاتصال مهمة؟
يتطلب حل reCAPTCHA v2 النموذجي ما يلي:
- 1 أرسل الطلب إلى
in.php - 4-6 طلبات استطلاع إلى
res.php - الإجمالي: 5-7 طلبات HTTP
دون البقاء على قيد الحياة:
- 5 × (مصافحة TCP ~50 مللي ثانية + TLS ~100 مللي ثانية) = 750 مللي ثانية الحمل
مع البقاء على قيد الحياة:
- 1 Ó (TCP + TLS) + 4 Ó (~5 مللي ثانية إعادة الاستخدام) = 170 مللي ثانية حمل
التوفير: ~580 مللي ثانية لكل حل. عند 10,000 حل/day، يمثل ذلك 1.6 ساعة من زمن الوصول المحفوظ.
بايثون: استخدام الطلبات.الجلسة
تدعم مكتبة requests البقاء على قيد الحياة بشكل افتراضي عند استخدام كائن Session:
# keepalive_solver.py
import os
import time
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
# Create a session — reuses TCP connections across requests
session = requests.Session()
session.headers.update({"Connection": "keep-alive"})
def solve_captcha(sitekey, pageurl):
"""Solve reCAPTCHA v2 using a persistent connection."""
# Submit — uses existing connection if available
resp = session.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": "1",
})
result = resp.json()
if result.get("status") != 1:
raise Exception(f"Submit failed: {result.get('request')}")
task_id = result["request"]
# Poll — reuses the same connection
time.sleep(15)
for _ in range(25):
poll = session.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
return poll_result["request"]
if poll_result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {poll_result.get('request')}")
time.sleep(5)
raise Exception("Timeout")
# Solve multiple CAPTCHAs reusing the same connection
for i in range(5):
token = solve_captcha(
"6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"https://www.google.com/recaptcha/api2/demo"
)
print(f"Solve {i+1}: {token[:30]}...")
بايثون: HTTP/2 مع httpx
للحصول على دعم HTTP/2، استخدم httpx:
# http2_solver.py
import os
import time
import httpx
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
BASE_URL = "https://ocr.captchaai.com"
# HTTP/2 client with connection pooling
client = httpx.Client(http2=True, timeout=30.0)
def solve_captcha(sitekey, pageurl):
"""Solve using HTTP/2 multiplexed connections."""
resp = client.get(f"{BASE_URL}/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": "1",
})
result = resp.json()
if result.get("status") != 1:
raise Exception(f"Submit failed: {result.get('request')}")
task_id = result["request"]
time.sleep(15)
for _ in range(25):
poll = client.get(f"{BASE_URL}/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
return poll_result["request"]
if poll_result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {poll_result.get('request')}")
time.sleep(5)
raise Exception("Timeout")
# Multiple solves over a single HTTP/2 connection
for i in range(5):
token = solve_captcha(
"6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"https://www.google.com/recaptcha/api2/demo"
)
print(f"Solve {i+1}: {token[:30]}...")
client.close()
JavaScript: استخدام مثيل Axios مع Keep-Alive
// keepalive_solver.js
const axios = require('axios');
const http = require('http');
const https = require('https');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
// Create agents with keep-alive enabled
const httpAgent = new http.Agent({ keepAlive: true, maxSockets: 10 });
const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 10 });
// Axios instance with persistent connections
const api = axios.create({
baseURL: 'https://ocr.captchaai.com',
httpAgent,
httpsAgent,
timeout: 30000,
});
async function solveCaptcha(sitekey, pageurl) {
// Submit — reuses connection
const submit = await api.get('/in.php', {
params: {
key: API_KEY, method: 'userrecaptcha',
googlekey: sitekey, pageurl, json: '1',
},
});
if (submit.data.status !== 1) throw new Error(submit.data.request);
const taskId = submit.data.request;
// Poll — reuses same connection
await new Promise(r => setTimeout(r, 15000));
for (let i = 0; i < 25; i++) {
const poll = await api.get('/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: '1' },
});
if (poll.data.status === 1) return poll.data.request;
if (poll.data.request !== 'CAPCHA_NOT_READY') throw new Error(poll.data.request);
await new Promise(r => setTimeout(r, 5000));
}
throw new Error('Timeout');
}
(async () => {
for (let i = 0; i < 5; i++) {
const token = await solveCaptcha(
'6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
'https://www.google.com/recaptcha/api2/demo'
);
console.log(`Solve ${i + 1}: ${token.slice(0, 30)}...`);
}
// Clean up agents
httpAgent.destroy();
httpsAgent.destroy();
})();
HTTP/2 مقابل HTTP/1.1 لحل اختبار CAPTCHA
| ميزة | HTTP/1.1 البقاء على قيد الحياة | HTTP/2 |
|---|---|---|
| إعادة استخدام الاتصال | نعم (تسلسلي) | نعم (متعدد) |
| التدفقات المتزامنة | 1 لكل اتصال | ما يصل إلى 100+ لكل اتصال |
| ضغط الرأس | لا | ضغط HPACK |
| تقليل الكمون | ~60% | ~70% |
| دعم المتصفح مطلوب | لا | لا (استدعاءات واجهة برمجة التطبيقات) |
| الأفضل ل | حلول متتابعة | يحل الموازي |
للحل المتسلسل (اختبار CAPTCHA واحد في كل مرة)، يعد استمرار HTTP/1.1 كافيًا. بالنسبة للحل المتوازي (اختبارات CAPTCHA المتعددة في وقت واحد)، يوفر تعدد إرسال HTTP/2 فائدة إضافية من خلال مشاركة اتصال واحد.
تحجيم تجمع الاتصال
قم بمطابقة حجم مجموعتك مع مستوى التزامن الخاص بك:
| الحلول المتزامنة | حجم حمام السباحة الموصى به |
|---|---|
| 1-5 | 5 اتصالات |
| 5-20 | 10 اتصالات |
| 20-50 | 25 اتصالات |
| 50-100 | 50 اتصالات |
| 100+ | استخدم HTTP/2 (اتصال واحد) |
حمامات السباحة كبيرة الحجم تهدر الذاكرة تفرض حمامات السباحة الصغيرة الحجم اتصالات جديدة، مما يلغي فوائد البقاء على قيد الحياة.
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
| يُنشأ الرمز المميز لكن الجهة المستهدفة ترفضه | مفتاح الموقع أو الصفحة أو سياق الجلسة لا يتطابق | التقط المعلمات من جديد وأعد استخدام الرمز داخل جلسة HTTP أو المتصفح نفسها |
| تنتهي عملية الاستطلاع بمهلة | الفاصل الزمني أو وقت الانتظار أو معالجة الأخطاء صارمة أكثر من اللازم | استطلع كل 5 إلى 10 ثوانٍ وافصل بين انتهاء المهلة والأخطاء الفعلية وسجّل السبب |
| ينجح المثال محليًا لكنه يفشل داخل سير العمل | رد النداء أو حقل النموذج أو حقن الرمز مفقود في السلسلة الفعلية | تحقق من المسار الكامل بين أداة الحل والطلب النهائي إلى الموقع المستهدف |
الخطوات التالية
- البدء السريع مع CaptchaAI: حلّ أول كابتشا في 5 دقائق
- كيفية حلّ reCAPTCHA v2 عبر الـ API: دليل خطوة بخطوة
- كيفية حل Cloudflare Turnstile باستخدام واجهة API
- كيفية حل GeeTest v3 باستخدام API