Grid Image CAPTCHA báo lỗi vì bốn nhóm nguyên nhân: sai định dạng ảnh, ảnh quá mờ để nhận diện vật thể, chỉ mục ô bị lệch giữa API và mảng code, hoặc request hết hạn trước khi có kết quả. Bài viết liệt kê từng mã lỗi CaptchaAI thực tế và cách sửa — không phải tổng quan lý thuyết.
Một đội QA thuê ngoài tại TP.HCM tích hợp CaptchaAI vào pipeline theo dõi giá trên Shopee và Lazada từng mất gần một tuần mới tìm ra vì sao ERROR_CAPTCHA_UNSOLVABLE lặp lại — hoá ra do proxy nội bộ nén ảnh trước khi gửi, làm mờ ranh giới các ô, không phải do CAPTCHA khó. Phần lớn lỗi Grid Image CAPTCHA có nguyên nhân đơn giản tương tự.
Bảng chẩn đoán nhanh
Xem nhanh trước khi đọc chi tiết từng lỗi bên dưới:
| Kiểm tra | Hành động |
|---|---|
| Định dạng ảnh | PNG hoặc JPEG, mã hoá base64 đúng chuẩn |
| Kích thước ảnh | Dưới 600KB |
| Đã chụp toàn bộ lưới chưa? | Chụp trọn khung CAPTCHA, có chừa lề |
| Chất lượng ảnh | Rõ nét, không mờ hoặc bị thu nhỏ |
| Định dạng kết quả trả về | Parse đúng chuỗi chỉ mục cách nhau bằng dấu phẩy |
| Cơ sở chỉ mục | Chuyển từ 1-based (API) sang 0-based (mảng) |
| Ngữ cảnh iframe | Chuyển vào đúng iframe chứa CAPTCHA nếu có |
| CAPTCHA đã hết hạn chưa? | Gửi ngay sau khi chụp, đừng trì hoãn |
Lỗi khi gửi và xử lý ảnh CAPTCHA hình ảnh lưới
Bốn lỗi sau xảy ra ở hai giai đoạn: trước khi solver kịp đọc ảnh (định dạng/dung lượng sai), hoặc sau khi đọc nhưng không nhận diện được nội dung (chất lượng chụp).
Sai định dạng hoặc dung lượng ảnh
Nguyên nhân: ERROR_WRONG_FILE_EXTENSION khi file không phải định dạng ảnh hợp lệ; ERROR_TOO_BIG_CAPTCHA_FILESIZE khi ảnh vượt dung lượng tối đa (thường 600KB).
- Chỉ dùng PNG hoặc JPEG
- Kiểm tra base64 đúng chuẩn, bỏ tiền tố
data:image/...;base64, - Resize ảnh nếu vượt 600KB
# WRONG — includes data URI prefix
body = "data:image/png;base64,iVBORw0KGgo..."
# CORRECT — raw base64 only
body = "iVBORw0KGgo..."
Vẫn lỗi dung lượng dù đúng định dạng — resize trước khi encode:
from PIL import Image
import io
import base64
# Resize if too large
img = Image.open("captcha.png")
if img.width > 600:
ratio = 600 / img.width
img = img.resize((600, int(img.height * ratio)), Image.LANCZOS)
buffer = io.BytesIO()
img.save(buffer, format="PNG")
b64 = base64.b64encode(buffer.getvalue()).decode()
File rỗng khi trích xuất ảnh
Nguyên nhân: File rỗng hoặc trích xuất thất bại — thường do trang lazy-load và ảnh chưa tải xong lúc script chụp.
- Kiểm tra phần tử ảnh đã tải xong
- Xác nhận thuộc tính
srckhông rỗng - Đợi ảnh tải xong nếu trang lazy-load
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Wait for image to load
WebDriverWait(driver, 10).until(
lambda d: d.find_element(By.CSS_SELECTOR, ".captcha img").get_attribute("complete") == "true"
)
Vì sao báo ERROR_CAPTCHA_UNSOLVABLE
Nguyên nhân: Ảnh đúng định dạng nhưng quá mờ, méo, hoặc vật thể không thể nhận diện — đúng tình huống proxy nén ảnh ở đầu bài.
- Chụp ở độ phân giải gốc, không thu nhỏ
- Không để lớp phủ hay watermark che lưới
- Vẫn lỗi thì thử ảnh mới — một số thử thách vốn mơ hồ
Xác định sai ô lưới
Nguyên nhân: Ảnh chất lượng thấp hoặc chụp thiếu, khiến solver nhận nhầm ranh giới ô.
- Chụp toàn bộ phần tử CAPTCHA, kể cả viền
- Đừng crop quá sát — chừa vài pixel lề
- Lưu ảnh và xem thủ công để xác minh
# Take a proper element screenshot
captcha_el = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
captcha_el.screenshot("debug_captcha.png")
# Open and check manually
from PIL import Image
Image.open("debug_captcha.png").show()
Áp dụng sai kết quả và request hết hạn
Solver trả đúng kết quả không có nghĩa code dùng đúng — nhóm lỗi này chiếm phần lớn sự cố khi CAPTCHA đã giải xong nhưng client vẫn fail.
Lệch chỉ số 1-based / 0-based
Nguyên nhân: API trả về chỉ mục đánh số từ 1, trong khi mảng trong code đánh số từ 0.
# API returns "1,3,5" (1-based)
solution = "1,3,5"
indices = [int(i) for i in solution.split(",")]
# DON'T: use directly as array index
# cells[1], cells[3], cells[5] ← WRONG (off by one)
# DO: convert to 0-based
for idx in indices:
cells[idx - 1].click() # 1→0, 3→2, 5→4
Click sai ô hoặc lưới đổi vị trí liên tục
Nguyên nhân: Cùng biểu hiện "click không ăn" nhưng khác gốc rễ: target sai do lớp phủ, iframe hoặc shadow DOM — hoặc lưới kiểu reCAPTCHA đổi ô ngay sau mỗi lần chọn.
Target sai — kiểm tra iframe trước khi tìm phần tử:
# Check if captcha is in an iframe
iframes = driver.find_elements(By.TAG_NAME, "iframe")
for iframe in iframes:
if "captcha" in iframe.get_attribute("src").lower():
driver.switch_to.frame(iframe)
break
# Now find and click cells
cells = driver.find_elements(By.CSS_SELECTOR, ".grid-cell")
Lưới động kiểu reCAPTCHA — dùng phương thức token thay vì ảnh:
# Token method handles dynamic grids automatically
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": "https://example.com",
"json": 1
})
Request hết hạn hoặc CAPCHA_NOT_READY lặp mãi
Nguyên nhân: CAPTCHA dạng lưới hết hạn sau 2–3 phút; nếu không giới hạn số lần polling, task fail âm thầm phía server nhưng code vẫn cứ chờ mãi.
- Gửi ảnh ngay sau khi chụp
- Giải vượt 60 giây thì refresh và gửi lại
- Đặt giới hạn số lần thử, dừng khi gặp lỗi thật (không phải
CAPCHA_NOT_READY)
for attempt in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") not in ["CAPCHA_NOT_READY"]:
break # Actual error, stop polling
raise Exception("Grid captcha solve failed — refresh and retry")
Câu hỏi thường gặp
CaptchaAI có báo mã lỗi cụ thể khi Grid Image CAPTCHA thất bại không?
Có. res.php trả mã lỗi rõ ràng (ERROR_CAPTCHA_UNSOLVABLE, CAPCHA_NOT_READY...) — tra theo bảng chẩn đoán ở trên là cách nhanh nhất xác định nguyên nhân.
Gặp ERROR_CAPTCHA_UNSOLVABLE thì nên retry ngay hay đợi?
Retry ngay với ảnh mới — lỗi này gần như luôn do chất lượng ảnh, không phải tải hệ thống. Vẫn lỗi sau 2–3 lần thì kiểm tra lại bước capture.
Có cần gửi kèm văn bản hướng dẫn cho ảnh dạng lưới không?
Với method=post kèm recaptcha=1 thì không — solver tự nhận diện bằng thị giác. Với method=bls, luôn gửi kèm hướng dẫn.
Giải nhiều Grid Image CAPTCHA song song có ảnh hưởng tốc độ từng task không?
Không. Mỗi lần giải độc lập — gửi nhiều task, polling riêng từng ID; thông lượng chỉ giới hạn bởi số thread trong gói.
Chi phí giải Grid Image CAPTCHA khối lượng lớn tính theo gói nào?
CaptchaAI tính phí theo thread chạy đồng thời, không theo từng lần giải. Gói BASIC ($15/tháng, 5 thread) đủ cho khối lượng nhỏ; scrape liên tục khối lượng lớn thì cân nhắc ADVANCE ($90/tháng, 50 thread) trở lên.