API 教程

多字符图像验证码解决策略

复杂图像验证码使用连接的字母、重叠的字符、不同的字体和噪声来防止 OCR。以下是如何使用 CaptchaAI 来处理它们。


常见的复杂性类型

类型 描述 困难
干净的文字 不变形,字体统一 简单的
扭曲的文字 字母单独旋转/scaled 中等的
连接的字母 字符重叠或接触 难的
多种字体 每个字符有不同的字体 难的
噪音+线条 背景噪音、删除线 中等的
颜色变化 每个角色有不同的颜色 中等的
数学表达式 数字+运算符,预期结果 中等的

提交复杂的验证码

对于标准多字符验证码,请通过带有适当提示的 base64 提交:

import requests
import base64
import time
import os

API_KEY = os.environ["CAPTCHAAI_API_KEY"]


def solve_complex_image(image_b64, hints=None):
    """Solve a complex multi-character image CAPTCHA."""
    payload = {
        "key": API_KEY,
        "method": "base64",
        "body": image_b64,
        "json": 1,
    }

    if hints:
        payload.update(hints)

    resp = requests.post(
        "https://ocr.captchaai.com/in.php",
        data=payload,
        timeout=30,
    )
    result = resp.json()

    if result.get("status") != 1:
        raise RuntimeError(f"Submit failed: {result.get('request')}")

    task_id = result["request"]

    time.sleep(8)
    for _ in range(24):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }, timeout=15)
        data = resp.json()
        if data.get("status") == 1:
            return data["request"]
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("Solve timeout")

策略:相连的字母

连接字母对于基本 OCR 来说是最难的,但对于 CaptchaAI 来说则不然:

def solve_connected_letters(image_path):
    """Solve CAPTCHA with connected/overlapping characters."""
    with open(image_path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode("ascii")

    return solve_complex_image(b64, hints={
        "textinstructions": "Characters may be connected or overlapping",
        "minLen": 4,
        "maxLen": 8,
    })

策略:混合情况与噪声

def solve_noisy_mixed(image_path):
    """Solve CAPTCHA with background noise and mixed case."""
    with open(image_path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode("ascii")

    return solve_complex_image(b64, hints={
        "regsense": 1,         # Case-sensitive
        "language": 2,         # Latin characters
        "textinstructions": "Ignore background lines and noise",
    })

策略:多字体文本

def solve_multi_font(image_path):
    """Solve CAPTCHA using multiple fonts per character."""
    with open(image_path, "rb") as f:
        b64 = base64.b64encode(f.read()).decode("ascii")

    return solve_complex_image(b64, hints={
        "textinstructions": "Each character may use a different font or style",
        "minLen": 5,
        "maxLen": 7,
    })

图像预处理以获得更好的结果

提交前的预处理可以提高准确性:

# preprocess.py
from PIL import Image, ImageFilter, ImageEnhance
import io
import base64


def preprocess_for_ocr(image_path):
    """Preprocess image to improve OCR accuracy."""
    img = Image.open(image_path)

    # Convert to grayscale
    img = img.convert("L")

    # Increase contrast
    enhancer = ImageEnhance.Contrast(img)
    img = enhancer.enhance(2.0)

    # Sharpen
    img = img.filter(ImageFilter.SHARPEN)

    # Binarize (threshold)
    threshold = 128
    img = img.point(lambda p: 255 if p > threshold else 0)

    # Encode back to base64
    buffer = io.BytesIO()
    img.save(buffer, format="PNG")
    return base64.b64encode(buffer.getvalue()).decode("ascii")

重试策略与报告

# retry_strategy.py


def solve_with_retry(image_b64, hints, max_retries=3):
    """Retry solving with fallback strategies."""
    strategies = [
        hints,                                          # Original hints
        {**hints, "textinstructions": ""},              # Without instructions
        {**hints, "numeric": 0, "regsense": 0},        # Relaxed constraints
    ]

    for i, strategy in enumerate(strategies[:max_retries]):
        try:
            result = solve_complex_image(image_b64, strategy)
            return {"text": result, "strategy": i, "success": True}
        except RuntimeError:
            continue

    return {"text": None, "strategy": -1, "success": False}


def report_bad_answer(task_id):
    """Report incorrect answer for quality feedback."""
    requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "reportbad",
        "id": task_id,
    }, timeout=10)

故障排除

问题 原因 处理方式
缺少字符 连接的字母读错了 添加关于连接文本的 textinstructions
额外字符 噪音被解释为文本 预处理:提交前去除噪音
错误的情况 案例未保存 设置 regsense=1
数学结果作为表达式返回 缺少 calc=1 启用数学验证码的计算模式
特定网站上始终错误 站点特定字体 报告错误答案以改进模型

常问问题

我应该在提交之前对图像进行预处理吗?

仅当您的结果不佳时。 CaptchaAI 可以原生处理大多数失真。预处理有助于处理非常嘈杂或低对比度的图像。

如果相同的图像类型一直失败怎么办?

使用 reportbad 报告错误答案以帮助提高准确性。还可以尝试添加描述验证码特征的特定 textinstructions

图像验证码有字符数限制吗?

CaptchaAI 可以处理最多约 20 个字符的验证码。大多数为 4-8 个字符。


相关指南


解决复杂的图像验证码 -以 CaptchaAI 开头.

该文章已禁用评论。