复杂图像验证码使用连接的字母、重叠的字符、不同的字体和噪声来防止 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 开头.