Troubleshooting

BLS 验证码错误和故障排除

BLS 验证码总是报 ERROR_BAD_PARAMETERSERROR_CAPTCHA_UNSOLVABLE,或者图片选对了表单还是提交失败?多数不是 CaptchaAI 接口本身的问题,而是图像提取或轮询逻辑出了岔子——BLS 用自定义实现,图片常渲染在 <canvas> 里还带防盗链。在签证预约类系统上做 BLS 自动化的开发者,踩坑率都不低。按报错阶段对照下表排查,多数问题几分钟内就能定位。


先看这张表:报错对应哪个环节

检查项 排查动作
说明文字提取了? 打印出来核对是否和页面一致
图片有效? base64 存成文件打开看一眼
图片数量对? 比较发送张数和显示张数
图片顺序对? 确认 DOM 顺序等于显示顺序
前缀删干净? 检查有没有残留 data:image/...;base64,
结果格式解析对? 逗号分隔、从 1 开始的索引
索引转换了? 再减 1 才是 0 基索引

排查小技巧:国内环境先用清华 TUNA 镜像装好 selenium、requests,排除“依赖没装对”这种假报错。


API 提交阶段的报错

ERROR_BAD_PARAMETERS:缺少必填参数

报错原因通常是漏传了 instructions 或图片参数,对比下面两段代码就能看出区别:

# WRONG — missing instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY, "method": "bls",
    "image_base64_1": img1, "json": 1
})

# CORRECT — include instructions
response = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY, "method": "bls",
    "instructions": "Select all images with a car",
    "image_base64_1": img1, "json": 1
})

ERROR_WRONG_FILE_EXTENSION:图片格式有问题

图片数据不是有效 base64,或格式不受支持——确认是 base64 编码的 PNG/JPEG,去掉 data:image/...;base64, 前缀,且字符串没被截断:

import base64

# Strip the data URI prefix
src = img_element.get_attribute("src")
if src.startswith("data:image"):
    b64 = src.split(",")[1]
else:
    # Download and encode
    img_data = requests.get(src).content
    b64 = base64.b64encode(img_data).decode()

ERROR_CAPTCHA_UNSOLVABLE:识别失败

多数是图片太模糊或说明文字不完整——用全分辨率截图,确认说明文字提取完整;如果只是挑战本身偏难,直接重试即可。


图像提取阶段的坑

图片是异步加载的

图片首次加载时常还没进 DOM——等验证码完全渲染再提取:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Wait for captcha images to load
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".captcha-image img"))
)

图片画在 canvas 上,不是 img 标签

部分 BLS 实现把图片画在 <canvas> 而非 <img> 上,需要把 canvas 内容导出成 base64 再提交:

canvas_elements = driver.find_elements(By.CSS_SELECTOR, ".captcha-canvas")
for i, canvas in enumerate(canvas_elements, 1):
    b64 = driver.execute_script(
        "return arguments[0].toDataURL('image/png').split(',')[1];",
        canvas
    )
    payload[f"image_base64_{i}"] = b64

图片有防盗链保护

浏览器外部单独请求图片 URL 会返回 403,说明有防盗链——直接在浏览器上下文里提取,不用额外发请求:

# Get image data from within the browser
b64 = driver.execute_script("""
    var img = arguments[0];
    var canvas = document.createElement('canvas');
    canvas.width = img.naturalWidth;
    canvas.height = img.naturalHeight;
    canvas.getContext('2d').drawImage(img, 0, 0);
    return canvas.toDataURL('image/png').split(',')[1];
""", img_element)

提交结果之后出错:选错图 / 索引错位 / 表单提交失败

选错图或索引对不上

提取顺序和页面显示顺序不一致会选错图,确保两者顺序一致:

# Ensure images are indexed in display order
captcha_imgs = driver.find_elements(By.CSS_SELECTOR, ".captcha-image img")
# The order of find_elements matches DOM order = display order
for i, img in enumerate(captcha_imgs, 1):
    payload[f"image_base64_{i}"] = extract_base64(img)

CaptchaAI 返回的索引从 1 开始,数组下标从 0 开始时记得转换:

solution = result["request"]  # e.g., "1,3,5"
indices = [int(i) for i in solution.split(",")]

# Convert to 0-based for array access
for idx in indices:
    captcha_imgs[idx - 1].click()  # 1-based → 0-based

选对了图片,表单还是提交失败

通常是漏了额外表单字段或隐藏 token——检查有没有需要和验证码结果一起提交的隐藏字段:

# Look for hidden captcha tokens
hidden_fields = driver.find_elements(By.CSS_SELECTOR, "input[type='hidden']")
for field in hidden_fields:
    name = field.get_attribute("name")
    value = field.get_attribute("value")
    print(f"Hidden field: {name}={value}")

超时和轮询报错

验证码过期与轮询卡住

BLS 验证码有效期很短:提取后要立即提交,超过 60 秒基本已过期,刷新重来更快。

轮询迟迟没结果时,先确认轮询逻辑本身没写错:

# Standard polling pattern
for _ in range(30):  # 30 attempts × 5 seconds = 150 seconds max
    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") == "ERROR_CAPTCHA_UNSOLVABLE":
        # Don't keep polling — start over
        raise Exception("Unsolvable")

常见问题

ERROR_CAPTCHA_UNSOLVABLE 总是出现,是哪里的问题?

多数不是接口问题,而是图片质量或说明文字不完整。先核对分辨率、数量和说明文字,再决定要不要重试。

轮询等了很久还是没结果,是不是卡住了?

正常几秒到几十秒返回。超过 150 秒(30 次 × 5 秒)还没结果,基本是验证码已过期,刷新重提取更快。

一次验证码要发送几张图片给 CaptchaAI?

发送验证码里显示的全部图片,通常 3–9 张,用 image_base64_1image_base64_9 传参。

说明文字不是英文(比如中文)要怎么处理?

原样发送,不用翻译,CaptchaAI 能处理多语言说明文字。

CaptchaAI 除了 BLS 还能识别哪些验证码?

reCAPTCHA v2/v3、Cloudflare Turnstile、GeeTest v3、图片/OCR、九宫格图片验证码都支持;CaptchaFox、Friendly Captcha、Lemin 目前均为测试版。


相关指南

该文章已禁用评论。