تعمل اختبارات CAPTCHA لصور الشبكة (تحديات الصور reCAPTCHA v2) على إرجاع مؤشرات الخلايا كحل. عندما تكون الخلايا التي تم إرجاعها خاطئة - عند النقر على المربعات الخاطئة أو الحصول على ERROR_CAPTCHA_UNSOLVABLE - تكمن المشكلة عادةً في كيفية إرسال الصورة أو معلمة حجم الشبكة أو نص التعليمات.
أسرع طريقة لتشخيص هذا النوع من الأخطاء هي البدء من الأثر الظاهر: هل النقرات مزاحة بمربع واحد؟ هل جميع الخلايا خاطئة؟ هل الحل غير قابل للاستخدام من الأساس؟ كل عرض من هذه الأعراض يشير عادةً إلى طبقة مختلفة من المشكلة.
تشخيص سريع قبل الدخول في التفاصيل
| العرض | السبب المرجح أولًا | ما الذي تتحقق منه فورًا؟ |
|---|---|---|
| جميع النقرات تبدو في أماكن خاطئة | حجم الشبكة أو صورة غير أصلية | grid_size وطريقة التقاط الصورة |
| الانحراف ثابت بمقدار خلية واحدة | فهرسة 1-based مقابل 0-based | منطق التحويل قبل النقر |
الحل يعود ERROR_CAPTCHA_UNSOLVABLE |
تعليمات غير دقيقة أو صورة رديئة | نص التعليمات وجودة الصورة الفعلية |
| الحل يعمل أحيانًا ويفشل أحيانًا | اختبار CAPTCHA مختلف أو جلسة غير مستقرة | ثبات الجلسة والتقاط الصورة لكل تحدٍّ |
كيف يعمل حل الصور الشبكية
يتلقى CaptchaAI صورة الشبكة الخاصة بك، ويحلل كل خلية، ويعيد مجموعة من المؤشرات المطابقة للتعليمات. يتم ترقيم الخلايا من اليسار إلى اليمين ومن الأعلى إلى الأسفل:
3×3 Grid: 4×4 Grid:
1 2 3 1 2 3 4
4 5 6 5 6 7 8
7 8 9 9 10 11 12
13 14 15 16
تبدو الاستجابة كما يلي: [1, 3, 6, 9] - مما يعني أن الخلايا 1 و3 و6 و9 تحتوي على الكائنات المستهدفة.
الأخطاء والإصلاحات الشائعة
حجم الشبكة خاطئ
خطأ الإحداثيات الأكثر شيوعا. إذا كان اختبار CAPTCHA عبارة عن شبكة 4×4 لكنك أرسلت grid_size=3x3، فسيكون ترقيم الخلايا خاطئًا وسيتم تحديد المربعات الخاطئة.
# WRONG — 4×4 grid sent as 3×3
data = {
"key": "YOUR_API_KEY",
"method": "post",
"grid_size": "3x3", # Wrong!
"img_type": "recaptcha",
"instructions": "traffic lights",
"json": 1
}
# CORRECT — match the actual grid
data = {
"key": "YOUR_API_KEY",
"method": "post",
"grid_size": "4x4", # Correct
"img_type": "recaptcha",
"instructions": "traffic lights",
"json": 1
}
كيفية اكتشاف حجم الشبكة برمجياً:
from PIL import Image
img = Image.open("grid_captcha.png")
width, height = img.size
# reCAPTCHA grids are square. 3×3 tiles are ~100px each, 4×4 tiles are ~75px each
tile_width = width // 3
if width % 4 == 0 and (width // 4) < 100:
grid_size = "4x4"
else:
grid_size = "3x3"
print(f"Detected grid size: {grid_size}")
الصورة التي تم اقتصاصها أو تعديلها
يؤدي إرسال صورة تم اقتصاصها أو تغيير حجمها أو لقطة شاشة إلى تغيير محاذاة الشبكة. يحتاج CaptchaAI إلى صورة CAPTCHA الأصلية تمامًا كما تم تقديمها.
الإصلاح: التقط الصورة مباشرةً من إطار reCAPTCHA iframe، وليس من لقطة شاشة بملء الصفحة.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com")
# Switch to reCAPTCHA iframe
iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[title*="recaptcha"]')
driver.switch_to.frame(iframe)
# Get the grid image element
grid_img = driver.find_element(By.CSS_SELECTOR, "img.rc-image-tile-wrapper img")
grid_img.screenshot("grid_captcha.png") # Captures just the grid, not the whole page
تعليمات خاطئة أو غامضة
يجب أن يتطابق نص التعليمات مع ما يطلبه اختبار CAPTCHA. تؤدي التعليمات الغامضة إلى اختيارات خاطئة للخلايا.
# WRONG — too vague
data["instructions"] = "select images"
# CORRECT — specific instruction from the CAPTCHA
data["instructions"] = "crosswalks"
قيم التعليمات الشائعة: crosswalks، traffic lights، cars، buses، motorcycles، bicycles، fire hydrants، stairs، bridges، parking meters.
إزاحة فهرس الخلية (المستند إلى 0 مقابل المستند إلى 1)
تقوم CaptchaAI بإرجاع مؤشرات الخلايا ** المستندة إلى **. إذا كان كود الأتمتة الخاص بك يستخدم الفهرسة المستندة إلى 0، فستحتاج إلى طرح 1.
import json
# CaptchaAI returns 1-based indices
solution = json.loads(result["request"]) # e.g., [1, 3, 6, 9]
# Convert to 0-based for Selenium click automation
zero_based = [cell - 1 for cell in solution]
# Click grid cells using 0-based index
tiles = driver.find_elements(By.CSS_SELECTOR, ".rc-image-tile-wrapper img")
for idx in zero_based:
tiles[idx].click()
مشاكل في تنسيق الصورة
يدعم CaptchaAI JPG، JPEG، PNG، وGIF. التنسيقات الأخرى ترجع ERROR_WRONG_FILE_EXTENSION.
# WRONG — WebP or BMP
files = {"file": open("grid.webp", "rb")} # Not supported
# CORRECT — convert to PNG first
from PIL import Image
img = Image.open("grid.webp")
img.save("grid.png", "PNG")
files = {"file": open("grid.png", "rb")}
شجرة القرار
Grid cells are wrong
↓
Is grid_size correct (3x3 or 4x4)? → No → Fix grid_size parameter
↓ Yes
Is the image the original CAPTCHA (not cropped)? → No → Capture directly from iframe
↓ Yes
Is instruction text specific? → No → Use exact CAPTCHA instruction text
↓ Yes
Using 1-based indexing for clicks? → No → Convert solution to 0-based
↓ Yes
Image in supported format (JPG/PNG)? → No → Convert image format
↓ Yes
Report tiles to CaptchaAI via reportbad
الإبلاغ عن الحلول غير الصحيحة
إذا كانت الإحداثيات خاطئة باستمرار على الرغم من المعلمات الصحيحة، فأبلغ عن الحل:
requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "reportbad",
"id": task_id,
"json": 1
})
يساعد هذا CaptchaAI على تحسين الدقة وقد يسترد تكلفة الحل.
الأسئلة الشائعة
ما هي أحجام الشبكة التي يدعمها CaptchaAI؟
شبكات 3×3 و4×4. هذه هي التنسيقات القياسية لتحدي صور reCAPTCHA.
لماذا أحصل على ERROR_CAPTCHA_UNSOLVABLE لصور الشبكة؟
جودة الصورة منخفضة جدًا، أو نص التعليمات غير صحيح، أو أن الصورة ليست عبارة عن شبكة CAPTCHA يمكن التعرف عليها. تأكد من أنك ترسل الصورة الأصلية غير المقصوصة مع التعليمات الصحيحة.
يتم تعويض خلاياي بواحدة. ما هو الخطأ؟
تقوم CaptchaAI بإرجاع المؤشرات المستندة إلى 1. إذا كانت التعليمات البرمجية الخاصة بك تتوقع أن تكون مستندة إلى 0، فاطرح 1 من كل فهرس.
استخدم CaptchaAI بعد التأكد من حجم الشبكة، ونص التعليمات، والفهرسة، لأن معظم أخطاء هذا النوع تأتي من الإرسال نفسه لا من عملية الحل وحدها.