故障排查

常见网格图像验证码错误和修复

由于图像质量、格式不匹配或解决方案应用不正确,网格图像验证码解决可能会失败。以下是最常见的错误以及解决方法。


图片提交错误

错误_错误_文件_扩展

原因: 上传的文件不是有效的图像格式。

使固定:

  • 仅使用 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=postrecaptcha=1,不需要指令 - 解算器以视觉方式识别对象。对于 method=bls,请始终包含说明文本。

我可以并行解决多个网格验证码吗?

是的。每个解决方案都是独立的。提交多项任务并分别轮询每一项。

如果网格尺寸不标准怎么办?

CaptchaAI 按原样分析图像。非标准网格(例如 5×3、2×4)是基于视觉分析而不是固定网格假设来处理的。


相关指南

该文章已禁用评论。