由于图像质量、格式不匹配或解决方案应用不正确,网格图像验证码解决可能会失败。以下是最常见的错误以及解决方法。
图片提交错误
错误_错误_文件_扩展
原因: 上传的文件不是有效的图像格式。
使固定:
- 仅使用 PNG 或 JPEG 格式
- 验证 Base64 字符串是否正确编码
- 发送前去掉
data:image/...;base64,前缀
# WRONG — includes data URI prefix
body = "data:image/png;base64,iVBORw0KGgo..."
# CORRECT — raw base64 only
body = "iVBORw0KGgo..."
ERROR_TOO_BIG_CAPTCHA_FILESIZE
原因: 图像超出最大文件大小(通常为 600KB)。
使固定:
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()
ERROR_ZERO_CAPTCHA_FILESIZE
原因: 文件为空或图像提取失败。
使固定:
- 提取之前验证图像元素已加载
- 检查
src属性不为空 - 等待延迟加载的图像
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"
)
解决错误
ERROR_CAPTCHA_UNSOLVABLE
原因: 图像太模糊、扭曲或无法识别物体。
使固定:
- 以全分辨率捕获图像 - 不要缩小尺寸
- 确保没有覆盖层或水印遮挡网格
- 使用新的验证码重试(有些挑战本质上是不明确的)
识别出错误的细胞
原因: 图像质量低或部分捕获。
使固定:
- 截取整个验证码元素,包括边框
- 不要裁剪得太紧——包括几个像素的边距
- 通过保存捕获的图像并手动查看进行验证
# 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()
解决应用错误
相差一索引错误
原因: 基于 1 的 API 响应与基于 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
单元格不响应点击
原因: 点击目标错误 — 覆盖、iframe 或 Shadow DOM。
使固定:
# 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")
动态网格——点击后图块会发生变化
原因: reCAPTCHA 风格的动态网格取代了图块。
修复: 使用 token 方法而不是 reCAPTCHA 的图像方法:
# 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
})
超时错误
验证码在解决方案返回之前过期
原因: 网格验证码通常会在 2-3 分钟内过期。
使固定:
- 捕获后立即提交图像
- 如果求解时间超过 60 秒,请刷新并重试
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")
调试清单
| 查看 | 行动 |
|---|---|
| 图片格式? | PNG 或 JPEG,正确编码 |
| 图片尺寸? | 600KB以下 |
| 全网格捕获? | 包括带有边距的整个网格 |
| 图像质量? | 清晰、不模糊或按比例缩小 |
| 解决方案格式? | 正确解析逗号分隔的索引 |
| 指数基础? | 将数组从 1 转换为从 0 |
| iframe 上下文? | 切换到验证码 iframe(如果存在) |
| 验证码已过期? | 捕获后立即提交 |
常问问题
什么图像格式可以提供最佳效果?
PNG 可以产生最好的结果,因为它是无损的。 JPEG 可以工作,但过度压缩会模糊单元格边界并降低准确性。
我应该在说明文本中包含网格图像吗?
对于 method=post 和 recaptcha=1,不需要指令 - 解算器以视觉方式识别对象。对于 method=bls,请始终包含说明文本。
我可以并行解决多个网格验证码吗?
是的。每个解决方案都是独立的。提交多项任务并分别轮询每一项。
如果网格尺寸不标准怎么办?
CaptchaAI 按原样分析图像。非标准网格(例如 5×3、2×4)是基于视觉分析而不是固定网格假设来处理的。
相关指南
- 如何自动解决Grid Image CAPTCHA
- Grid Image CAPTCHA 挑战如何运作
- CaptchaAI 错误代码参考