CAPTCHA hình ảnh lưới hiển thị một hình ảnh lớn được chia thành một lưới (thường là 3 × 3 hoặc 4 × 4) và yêu cầu người dùng chọn các ô phù hợp với mô tả. Mặc dù reCAPTCHA sử dụng định dạng này nhưng nhiều trang web sử dụng thử thách lưới tùy chỉnh không thuộc hệ thống của Google.
Hướng dẫn này đề cập đến việc giải quyết các thách thức về hình ảnh lưới không phải reCAPTCHA bằng cách sử dụng điểm cuối method=grid của CaptchaAI.
Yêu cầu
| Mục | Giá trị |
|---|---|
| Khóa API CaptchaAI | Từcaptchaai.com |
| Hình ảnh lưới | Ảnh chụp màn hình hoặc base64 của toàn bộ lưới |
| Ngôn ngữ | Python 3.7+ hoặc Node.js 14+ |
Bước 1: Chụp ảnh lưới
Cách A: Chụp màn hình phần tử captcha
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/protected-form")
# Screenshot just the captcha container
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
captcha_element.screenshot("captcha_grid.png")
Cách B: Trích xuất hình ảnh từ thuộc tính src
import base64
import requests
captcha_img = driver.find_element(By.CSS_SELECTOR, ".grid-captcha img")
src = captcha_img.get_attribute("src")
if src.startswith("data:image"):
image_b64 = src.split(",")[1]
else:
image_data = requests.get(src).content
image_b64 = base64.b64encode(image_data).decode()
Bước 2: Gửi hình ảnh tới CaptchaAI
Sử dụng tải lên tệp (Python)
import requests
import time
API_KEY = "YOUR_API_KEY"
with open("captcha_grid.png", "rb") as f:
response = requests.post("https://ocr.captchaai.com/in.php",
data={
"key": API_KEY,
"method": "post",
"recaptcha": 1,
"json": 1
},
files={"file": f}
)
data = response.json()
task_id = data["request"]
print(f"Task: {task_id}")
Sử dụng base64 (Python)
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "post",
"body": image_b64,
"recaptcha": 1,
"json": 1
})
task_id = response.json()["request"]
Node.js
const axios = require('axios');
const fs = require('fs');
async function submitGridCaptcha(imagePath) {
const imageB64 = fs.readFileSync(imagePath).toString('base64');
const { data } = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'post',
body: imageB64,
recaptcha: 1,
json: 1
}
});
return data.request;
}
Bước 3: Thăm dò ý kiến giải pháp
def get_grid_solution(task_id):
for _ 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") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
raise Exception("Timeout")
solution = get_grid_solution(task_id)
print(f"Solution: {solution}")
# Returns click coordinates or cell indices
Bước 4: Áp dụng giải pháp
Nhấp theo chỉ mục ô
# If solution returns cell indices (e.g., "2,5,6")
selected = [int(i) for i in solution.split(",")]
cells = driver.find_elements(By.CSS_SELECTOR, ".grid-cell")
for idx in selected:
cells[idx - 1].click()
time.sleep(0.2)
driver.find_element(By.CSS_SELECTOR, ".verify-button").click()
Bấm theo tọa độ
from selenium.webdriver.common.action_chains import ActionChains
# If solution returns coordinates (e.g., "x=120,y=80;x=250,y=200")
captcha_element = driver.find_element(By.CSS_SELECTOR, "#captcha-container")
actions = ActionChains(driver)
for coord in solution.split(";"):
parts = dict(p.split("=") for p in coord.split(","))
x, y = int(parts["x"]), int(parts["y"])
actions.move_to_element_with_offset(captcha_element, x, y).click()
actions.perform()
Khắc phục sự cố
| Lỗi | nguyên nhân | sửa chữa |
|---|---|---|
ERROR_WRONG_FILE_EXTENSION |
Định dạng hình ảnh không hợp lệ | Sử dụng PNG hoặc JPEG; xác minh base64 là hợp lệ |
ERROR_CAPTCHA_UNSOLVABLE |
Hình ảnh quá nhỏ hoặc mờ | Chụp ở độ phân giải đầy đủ |
| Đã chọn sai ô | Định dạng giải pháp không khớp | Kiểm tra xem giải pháp có phải là chỉ số so với tọa độ không |
ERROR_TOO_BIG_CAPTCHA_FILESIZE |
Hình ảnh vượt quá giới hạn kích thước | Thay đổi kích thước xuống dưới 600KB |
Ví dụ đầy đủ có thể chạy được
Bạn cần một dự án hoạt động hoàn chỉnh với thiết lập môi trường, bỏ phiếu, thử lại và xử lý lỗi?
Xem ví dụ có thể chạy đầy đủ trên GitHub →
Câu hỏi thường gặp
Khi nào tôi nên sử dụng giải quyết lưới và giải quyết bằng mã thông báo?
Sử dụng tính năng giải mã thông báo (method=userrecaptcha) cho các thử thách reCAPTCHA tiêu chuẩn — cách này đơn giản và đáng tin cậy hơn. Sử dụng tính năng giải lưới (method=post với recaptcha=1) cho các thử thách lưới không reCAPTCHA hoặc lưới hình ảnh độc lập.
Kích thước lưới nào được hỗ trợ?
CaptchaAI xử lý bố cục lưới 3×3, 4×4 và không chuẩn. Hình ảnh được phân tích tổng thể, bất kể cấu trúc lưới.
Giải quyết lưới chính xác đến mức nào?
Độ chính xác phụ thuộc vào chất lượng hình ảnh. Hình ảnh có độ phân giải cao, rõ nét đạt được kết quả tốt nhất. Thời gian giải quyết trung bình là 15–30 giây.
Tôi có thể giải quyết các lưới động nơi các ô thay đổi không?
Đối với lưới động reCAPTCHA (nơi thay thế các ô được nhấp vào), hãy sử dụng phương thức mã thông báo (method=userrecaptcha). Phương pháp lưới giải quyết một hình ảnh tĩnh duy nhất.