القاعدة التي تحسم الأمر جملة واحدة: بدّل عنوان IP بين المهام، لا داخل المهمة الواحدة. أغلب حالات CAPTCHA المتكرر سببها تبديل العنوان بين تحميل الصفحة وإرسال الرمز، لا قلة العناوين.
الوكيل السكني يمنح طلبك عنواناً يخصّ مشتركاً منزلياً حقيقياً، فيقلّ التحدي كثيراً لكنه لا يختفي: نماذج الدخول والدفع تعرض reCAPTCHA أو Cloudflare Turnstile لكل زائر. ذلك الجزء الباقي تتولاه CaptchaAI.
لماذا يقلّل العنوان السكني التحديات
يبدأ reCAPTCHA حكمه من سمعة عنوان IP قبل سلوك المتصفح: العناوين السكنية سجلها نظيف لأنها لمشتركين حقيقيين، ونطاقات مراكز البيانات مصنّفة سلفاً.
تنبيه: النسب أدناه مؤشرات مرصودة وتقارير مستخدمين، وتتغير بحسب نوع التحدي والموقع وحجم العمل. قِس عندك أولاً.
| نوع الوكيل | مصدر العنوان | نسبة ظهور CAPTCHA | السبب |
|---|---|---|---|
| مركز بيانات | استضافة أو سحابة | مرتفعة 30-70% | نطاقات معروفة ومصنّفة |
| سكني | إنترنت منزلي حقيقي | منخفضة 5-15% | يبدو كمستخدم عادي |
| جوّال | شبكات الهاتف المحمول | منخفضة جداً 1-5% | يتشاركه آلاف المشتركين |
| ISP ثابت | ثابت بجودة سكنية | منخفضة 5-10% | سرعة مع ثقة |
متى يستحق الوكيل السكني تكلفته
الوكيل السكني أغلى بكثير من مركز البيانات، فوجّهه إلى المسارات الحساسة وحدها. وباقات CaptchaAI تُحتسب بعدد الـ Threads المتزامنة لا بعدد عمليات الحل — تبدأ من BASIC بسعر $15 شهرياً مع 5 threads.
| الإجراء | الأثر |
|---|---|
| قصره على المواقع كثيفة التحديات | توفير 50-70% |
| تسخين الجلسة قبل الصفحة المحمية | استدعاءات أقل |
| تجميع الصفحات المفتوحة أولاً | جلسات ثابتة أقل |
| استبعاد التجمّعات الضعيفة | نجاح أعلى مبكراً |
اضبط إيقاع الطلبات أولاً
عالج السبب الأشيع أولاً: السرعة. تجمّع ممتاز بإيقاع منتظم ينتج تحديات أكثر من تجمّع متوسط بإيقاع بشري.
| الإيقاع | احتمال ظهور CAPTCHA |
|---|---|
| طلب/ثانية | مرتفع — نمط آلي |
| طلب كل 5-10 ثوانٍ | متوسط |
| طلب كل 10-30 ثانية | منخفض |
| فاصل عشوائي 3-15 ثانية | منخفض جداً |
ثلاثة أنماط للتناوب
1. التناوب مع كل طلب
import requests
proxies = {
"http": "http://user:[email protected]:7777",
"https": "http://user:[email protected]:7777",
}
# Each request gets a new IP
for url in urls:
resp = requests.get(url, proxies=proxies, timeout=30)
# New IP after each request
البوابة تعطيك عنواناً جديداً مع كل طلب دون إدارة منك.
- يناسب: المرور على صفحات مفتوحة عبر مواقع متعددة.
- الخطر: لا جلسة تُحفظ، فأي مسار من خطوتين ينكسر.
2. الجلسة الثابتة
import random
import string
def get_sticky_session(duration_min=10):
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
return {
"http": f"http://user-session-{session_id}:[email protected]:7777",
"https": f"http://user-session-{session_id}:[email protected]:7777",
}
# Same IP for the whole CAPTCHA workflow
session_proxy = get_sticky_session(duration_min=10)
# Step 1: Load page
resp = requests.get("https://target.com/form", proxies=session_proxy)
# Step 2: Solve CAPTCHA (same IP)
token = solve_captcha("https://target.com/form", sitekey)
# Step 3: Submit (same IP — required for token validity)
resp = requests.post("https://target.com/submit", proxies=session_proxy, data={
"g-recaptcha-response": token,
})
معرّف الجلسة داخل اسم المستخدم يثبّت العنوان، فتبقى خطوات الفتح والحل والإرسال عليه.
- يناسب: النماذج المحمية وسير العمل متعدد الخطوات.
- الخطر: منخفض جداً؛ الثبات نفسه يبني الثقة.
3. التناوب حسب النطاق
خيار وسط: عنوان ثابت لكل نطاق، فيبقى لكل موقع تاريخ زيارات متسق.
domain_sessions = {}
def get_domain_proxy(domain):
"""Same IP per domain, different IP per domain."""
if domain not in domain_sessions:
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
domain_sessions[domain] = get_sticky_session()
return domain_sessions[domain]
# site-a.com always uses the same IP
proxy_a = get_domain_proxy("site-a.com")
# site-b.com gets a different IP
proxy_b = get_domain_proxy("site-b.com")
خمس ممارسات تخفض التحديات
طابق الدولة مع الهدف
# Target site is US-based? Use US residential IP
us_proxy = "http://user-country-us:[email protected]:7777"
# Target is Germany? Use DE residential IP
de_proxy = "http://user-country-de:[email protected]:7777"
الوصول إلى متجر سعودي من عنوان أوروبي يرفع احتمال التحدي ولو كان العنوان نظيفاً؛ اطلب الدولة صراحة.
باعد بين الطلبات عشوائياً
import time
import random
def human_pace_requests(urls, proxy):
results = []
for url in urls:
resp = requests.get(url, proxies=proxy, timeout=30)
results.append(resp)
# Random delay between requests
delay = random.uniform(2, 8)
time.sleep(delay)
return results
الفاصل العشوائي أهم من الفاصل الطويل: الانتظام نفسه يُقرأ كنمط آلي.
أرسل رؤوساً متسقة
الرؤوس يجب أن تتفق فيما بينها ومع العنوان؛ رأس شاذ واحد يُسقط ثقة عشرات الطلبات.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/126.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
}
resp = requests.get(url, proxies=proxy, headers=headers)
تعامل مع الحظر بهدوء
def fetch_with_retry(url, max_retries=3):
for attempt in range(max_retries):
# New proxy for each retry
proxy = get_sticky_session()
try:
resp = requests.get(url, proxies=proxy, timeout=30)
if resp.status_code == 403:
print(f"IP banned, rotating... (attempt {attempt + 1})")
time.sleep(5)
continue
if resp.status_code == 429:
print(f"Rate limited, backing off...")
time.sleep(30)
continue
return resp
except requests.exceptions.ProxyError:
print(f"Proxy failed, rotating...")
continue
raise Exception(f"Failed after {max_retries} retries")
استجابة 403 تعني عنواناً محترقاً فبدّله، و429 تعني إيقاعاً سريعاً فالمعالجة انتظار لا تبديل.
سخّن العناوين الجديدة
def warm_up_proxy(proxy):
"""Visit neutral sites before target to build session trust."""
warm_urls = [
"https://www.google.com",
"https://www.wikipedia.org",
]
for url in warm_urls:
try:
requests.get(url, proxies=proxy, timeout=15)
time.sleep(random.uniform(2, 5))
except Exception:
pass
زيارة موقعين محايدين قبل الهدف تمنح الجلسة تاريخاً بسيطاً بدل الظهور المفاجئ على صفحة حساسة.
مثال تطبيقي من الخليج
فريق تسعير في الرياض يتابع أسعاراً معلنة على متاجر خليجية. البداية من مركز بيانات أوروبي أنتجت تحدياً على كل صفحة، فتغيّر ثلاثة أشياء:
- عناوين سكنية داخل السعودية والإمارات بدل أوروبا.
- جلسة ثابتة عشر دقائق لكل مسار ينتهي بنموذج.
- فاصل عشوائي 4-12 ثانية بدل طلب في الثانية.
نمط التكامل مع CaptchaAI
المسار كله في دالة واحدة: افتح الصفحة عبر جلسة ثابتة، استخرج مفتاح الموقع، أرسل المهمة إلى in.php، استطلع النتيجة من res.php، ثم أرسل النموذج.
import requests
import time
import re
import random
import string
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_recaptcha(site_url, sitekey):
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
"key": CAPTCHAAI_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": site_url,
"json": 1,
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
return data["request"]
raise TimeoutError("Timeout")
def scrape_url(url, proxy_config):
"""Complete scrape with proxy + CAPTCHA solving."""
session_id = "".join(random.choices(string.ascii_lowercase, k=8))
proxy = {
"http": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
"https": f"http://user-session-{session_id}:{proxy_config['pass']}@{proxy_config['host']}",
}
resp = requests.get(url, proxies=proxy, timeout=30)
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if match:
token = solve_recaptcha(url, match.group(1))
resp = requests.post(
url.replace("/form", "/submit"),
proxies=proxy,
data={"g-recaptcha-response": token},
)
return resp.text
الوسيط نفسه يُستخدم في الطلبين؛ أي تبديل للعنوان بين الحل والإرسال يجعل الرمز g-recaptcha-response مرفوضاً.
الأسئلة الشائعة
هل أحتاج خدمة حل مع بروكسي سكني؟
نعم. العنوان السكني يقلّل تكرار التحدي ولا يلغيه؛ صفحات التسجيل والدفع تعرضه لكل زائر تقريباً.
ما المدة المناسبة للجلسة الثابتة؟
أطول قليلاً من أطول مسار لديك؛ عشر دقائق تكفي غالباً. مدة أقصر من زمن الحل تُفقدك الرمز.
هل يؤثر بلد العنوان على عدد التحديات؟
بوضوح. عدم تطابق دولة العنوان مع دولة الموقع إشارة سلبية قوية، وأثرها أكبر على المواقع المحلية.
كيف أعرف أن تجمّع العناوين تدهور؟
راقب نسبة الصفحات التي طلبت تحدياً وأخطاء 403 لكل ألف طلب؛ ارتفاعهما معاً يعني تجمّعاً محترقاً.
استكشاف الأعطال
| العَرَض | السبب المرجّح | المعالجة |
|---|---|---|
| تحدٍّ على كل صفحة | تجمّع ضعيف | غيّر المزوّد أو المنطقة |
| الرمز مرفوض | تبدّل العنوان | ثبّت الجلسة للنهاية |
| أخطاء 407 | صيغة مصادقة خاطئة | راجع تنسيق المصادقة |
| استجابات بطيئة | بوابة محمّلة | جرّب خارج الذروة |
| انتهاء الجلسة مبكراً | مدة قصيرة | اطلب مدة أطول |
اقرأ أيضاً
اضبط تناوب العناوين ليقلّ عدد التحديات، ثم احصل على مفتاح CaptchaAI لحل ما يتبقى منها.