Khắc Phục Sự Cố

Lỗi tọa độ hình ảnh lưới: Chẩn đoán và khắc phục

Grid image trả sai ô, hoặc báo ERROR_CAPTCHA_UNSOLVABLE? Nguyên nhân gần như luôn nằm ở một trong năm chỗ dưới đây — kiểm tra lần lượt trước khi nghi ngờ engine giải:

  1. grid_size không khớp ảnh thực tế
  2. Ảnh gửi lên không phải ảnh gốc
  3. instructions mơ hồ
  4. Lệch chỉ số 0-based/1-based
  5. Sai định dạng file
# Nguyên nhân Cách sửa nhanh
1 grid_size sai Khớp đúng 3x3 hoặc 4x4
2 Ảnh đã crop/resize Chụp trực tiếp từ iframe
3 instructions chung chung Dùng đúng chỉ dẫn hiển thị
4 Lệch chỉ số ô Trừ 1 nếu code dùng 0-based
5 Định dạng không hỗ trợ Convert sang PNG/JPG

CaptchaAI đánh số ô lưới như thế nào

CaptchaAI nhận ảnh grid image bạn gửi lên, phân tích từng ô rồi trả về danh sách chỉ mục khớp với chỉ dẫn. Cách đánh số ô luôn theo thứ tự trái sang phải, trên xuống dưới:

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

Kết quả trả về có dạng [1, 3, 6, 9] — tức các ô 1, 3, 6 và 9 chứa đối tượng cần chọn. Nếu response không khớp với ảnh gốc trong mắt bạn, gần như chắc chắn lỗi nằm ở bước gửi ảnh hoặc tham số, không phải ở engine giải.


1. grid_size không khớp ảnh thực tế

CAPTCHA là lưới 4×4 nhưng code gửi grid_size=3x3 (hoặc ngược lại): số ô lệch hoàn toàn, hệ thống chọn nhầm.

# 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
}

Phát hiện kích thước lưới bằng code, thay vì đoán

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}")

2. Ảnh gửi lên không phải ảnh gốc

Cắt ảnh, resize, hoặc bọc trong ảnh chụp toàn trang đều làm lệch căn chỉnh lưới. CaptchaAI cần đúng ảnh CAPTCHA gốc, không hơn không kém.

Cách sửa: chụp trực tiếp từ iframe reCAPTCHA, không chụp toàn trang

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

3. instructions mơ hồ hoặc sai

Giá trị instructions phải khớp chính xác với nội dung CAPTCHA yêu cầu. Chỉ dẫn chung chung khiến engine chọn sai nhóm ô.

# WRONG — too vague
data["instructions"] = "select images"

# CORRECT — specific instruction from the CAPTCHA
data["instructions"] = "crosswalks"

Các giá trị instructions thường gặp:

  • crosswalks, traffic lights, cars, buses
  • motorcycles, bicycles, fire hydrants
  • stairs, bridges, parking meters

4. Lệch chỉ số ô: 0-based vs 1-based

CaptchaAI luôn trả về chỉ số dựa trên 1 (1-based). Nếu code của bạn dùng 0-based (Selenium, mảng thường), trừ đi 1 trước khi click.

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()

5. Định dạng ảnh không được hỗ trợ

CaptchaAI chỉ nhận JPG, JPEG, PNG và GIF. Định dạng khác trả về 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")}

Sơ đồ chẩn đoán nhanh

Dừng ở bước đầu tiên trả lời "không":

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

Khi nào nên báo cáo giải sai qua reportbad

Đã kiểm tra hết 5 nguyên nhân mà tọa độ vẫn sai? Đừng thử lại thủ công — báo cáo trực tiếp:

requests.get("https://ocr.captchaai.com/res.php", params={
    "key": "YOUR_API_KEY",
    "action": "reportbad",
    "id": task_id,
    "json": 1
})

reportbad giúp CaptchaAI cải thiện độ chính xác, và nhiều trường hợp được hoàn phí giải.


Câu hỏi thường gặp

grid_size sai có tự phát hiện được không?

Không chính xác 100% chỉ dựa vào pixel, nhưng đo width // 4 như ở trên đúng trong phần lớn trường hợp. Chắc chắn nhất là đọc số ô thực tế từ DOM trước khi gửi.

Ảnh chụp toàn trang (full-page screenshot) có dùng được không?

Không nên — đây là lỗi rất thường gặp ở các team QA outsourcing tại Việt Nam khi debug nhanh bằng ảnh chụp toàn trang: ảnh grid co giãn theo tỷ lệ trang chứ không phải iframe gốc, nên gần như luôn lệch ô.

Vì sao vẫn nhận ERROR_CAPTCHA_UNSOLVABLE dù tham số đã đúng?

Ảnh chất lượng quá thấp, instructions không khớp, hoặc ảnh không phải CAPTCHA dạng lưới có thể nhận dạng được. Kiểm tra lại rằng ảnh gửi lên là ảnh gốc chưa qua crop, đi kèm đúng chỉ dẫn hiển thị trên CAPTCHA.

Ô của tôi bị lệch đúng một vị trí. Nguyên nhân là gì?

CaptchaAI trả về chỉ số dựa trên 1. Nếu code của bạn kỳ vọng chỉ số dựa trên 0, trừ 1 từ mỗi phần tử trong mảng kết quả trước khi click.

Checklist trước khi gửi kết quả

  1. Xác nhận grid_size khớp đúng với lưới thật của CAPTCHA.
  2. Chuẩn hóa tỷ lệ ảnh để tọa độ click không lệch khi trình duyệt đổi device pixel ratio.
  3. Từ chối phản hồi có chỉ số nằm ngoài phạm vi lưới đã khai báo, thay vì âm thầm gửi tiếp tọa độ sai.

Giải grid image chính xác với CaptchaAI

Lấy API key tại captchaai.com và áp dụng checklist ở trên ngay trong lần chạy tiếp theo.


Đọc thêm

Os comentários estão desativados para este artigo.