第三方打码平台API是目前最稳定、成本可控的图形验证码识别方案,关键在于正确传图、解析返回字段、处理失败重试及区分真图形与token类验证码。

直接调用第三方打码平台 API 是目前最稳定、成本可控的图形验证码识别方案,比自己训练 OCR 模型或硬啃 tesserocr 调参靠谱得多。关键不在于“能不能识别”,而在于“怎么把图片传过去、怎么拿到结果、怎么避免被平台拒绝”。
怎么选打码平台和 SDK:别只看价格,先看返回字段是否一致
超级鹰(chaojiying)、云打码(已停运)、极验(geetest 仅限其自家滑块)、以及近年较稳的 passxapi 都提供 HTTP 接口。但它们返回的 JSON 结构差异很大:
-
chaojiying返回{"pic_id": "123", "pic_str": "abc4"},识别结果在pic_str -
passxapi返回{"status": "success", "data": {"text": "k7m9"}},结果藏在data.text - 有些小平台甚至直接返回纯文本(如
"8x2q"),没 JSON 包裹
你得先用 curl 或 Postman 测一次接口,确认字段名再写代码。否则 resp.json().get("text") 可能永远是 None。
上传图片前必须做三件事:压缩、转 RGB、控制大小
很多平台明确要求图片为 JPEG/PNG 格式、尺寸 ≤ 1000×1000、体积 ≤ 1MB。但实际中常见坑是:
立即学习“Python免费学习笔记(深入)”;
- 截图保存为 PNG 后含 alpha 通道 → 上传后识别失败(返回空或报错)→ 用
PIL.Image.convert("RGB")强制转三通道 - 验证码图本身很小(如 120×40),但用
cv2.imread()读取后默认 BGR → 直接传 bytes 会色偏 → 改用PIL.Image.open().convert("RGB")再.tobytes() - 原始图带透明背景或深色噪点 → 上传前先做简单二值化(
cv2.threshold)反而降低识别率 → 大部分平台内部已优化,**原始图直传效果更好**
怎么处理识别失败或超时:别死等,要设重试+降级逻辑
打码平台不是 100% 成功率,尤其遇到扭曲严重、粘连、中文验证码时。不能让整个爬虫卡在 post_pic() 这一步:
- 设置请求超时:
requests.post(..., timeout=(5, 15))(连接 5 秒,读取 15 秒) - 识别失败时(如
pic_str为空、err_no != 0),最多重试 2 次,每次间隔随机 1–3 秒 - 若连续失败,降级为手动输入(弹出
input("请输入验证码:"))或跳过当前任务,避免阻塞流程 - 别忘了调用
report_error(pic_id)(如果平台支持)——这能提升你账号的后续识别准确率
为什么 sitekey 提取和打码平台无关,但必须提前做?
因为很多人混淆了两类验证码:一类是纯图片(如知网、老系统),直接传图识别;另一类是 reCAPTCHA/hCaptcha,它们根本**不暴露原始图**,而是靠 sitekey + token 机制。如果你在目标页面看到 data-sitekey,说明它走的是前端验证流,此时上传图片毫无意义——你该用 passxapi 这类专门解决 token 的服务,而不是往超级鹰塞图。
所以第一步永远是:用正则先扫一遍 HTML,确认是「真图形验证码」还是「假图形、真 token」。漏掉这步,后面所有识别逻辑都是白忙。


















