点选验证码识别接口怎么接:文字图标提示词裁剪、坐标换算与按序点击实战

2026-10-20 66

在公开数据采集(如电商比价、SEO 排名监控)、QA 自动化回归测试以及 AI Agent 网页交互场景中,点选类验证码是最常见的交互式拦截手段之一。无论是要求“按顺序点击汉字”的语序点选,还是要求“点击图中所有指定目标”的图标/九宫格点选,一旦处理不当,自动化流水线就会卡死在校验弹窗上。

此前我们在《滑块验证码识别接口怎么接:坐标模式与Token模式选型、缩放换算与轨迹防拦截》中讨论了单轴滑动的距离计算。而点选验证码的难点在于:它不仅涉及二维平面(X/Y 轴)的多目标定位,还高度依赖“提示指令(Prompt)”与“背景大图”的语义关联,以及严格的点击先后顺序。

本文将从工程落地角度,完整拆解点选验证码识别接口的接入全流程:从图像与提示词的规范采集、接口调用、坐标空间换算,到模拟点击的防风控细节。


一、 为什么自建点选识别模型往往难以维护?

不少技术团队在初期会尝试使用开源视觉库(如基于 YOLO + 孪生网络的双阶段方案)或本地部署多模态大模型(VLM)来识别点选验证码。但在实际生产环境中,自建方案通常会遇到三个瓶颈:

  1. 字库与图标样本迭代极快:主流厂商(如极验 v3/v4、网易易盾、腾讯防水墙等)会定期更新艺术字体、生僻字、3D 扭曲图标以及背景干扰纹理,固定权重的开源模型每隔几周就会出现准确率断崖式下跌。
  2. 语义推理成本高:遇到“请点击图中可以用来喝水的物品”或复杂的成语语序还原时,传统 CV 模型无法理解语义,而本地部署多模态大模型不仅需要高昂的 GPU 显存成本,单次推理耗时也容易拖慢高并发采集队列。
  3. 多形态并存:同一个目标站点可能根据风控等级,动态切换通用图片点选、极验点选或旋转/滑块验证。

通过接入统一的验证码识别 API 服务,开发团队可以将底层复杂的目标检测与语义匹配交给云端接口处理,按次付费,任务失败或过期自动退回余额,从而把精力集中在核心业务逻辑上。


二、 点选验证码的两种接入路径:坐标模式 vs 协议 Token 模式

在调用点选验证码识别接口前,首先要明确目标页面使用的是哪一类防护,并选择对应的接入模式(可在 NexCaptcha 支持的验证码类型页 核对):

  • 路径 A:通用坐标识别模式(返回 [(x1, y1), (x2, y2), ...])
    适用于各类自研点选框、定制化图形点选,或希望直接通过 Playwright / Puppeteer / Selenium 模拟真实鼠标点击的场景。客户端截取验证码图片与提示信息传给接口,接口返回目标中心点坐标序列,由浏览器自动化脚本完成点击。
  • 路径 B:厂商协议 Token 模式(返回加密凭证 / Token)
    适用于标准的极验 v3/v4、腾讯、网易易盾、FunCaptcha/Arkose、hCaptcha 等商业验证码。对于这类组件,除了截图点选,也可以直接提取页面的初始化参数(如 websiteURL、gt、challenge 或 captchaId 等)传给接口,直接拿回校验通过后的 Token,随业务表单一起提交。(关于极验架构的详细对比,可参考《极验v3和v4区别:初始化、参数、二次校验与自动化接入的架构差异》)。

下文我们将重点拆解通用性最强、也最容易在工程细节上出错的坐标识别与模拟点击链路。

点选验证码识别接口的坐标模式与Token模式架构对比图


三、 核心痛点一:背景图与提示词(Prompt)怎么规范提取?

点选验证码识别失败,有一半以上的原因出在送检图片不规范。与纯字符图形验证码不同,点选验证码包含两个信息源:待点击的背景区域和告知点什么的提示区域。

在采集送检数据时,请遵循以下规范(详细编码要求可参考《图形验证码识别 API 怎么接:Base64 规范、参数配置与会话保持》):

1. 分清“文本提示”与“图片提示”

  • 文本指令提示:例如 DOM 节点中直接包含明文 请依次点击:“春”、“花”、“秋”、“月”。此时只需截取纯净的背景大图转为 Base64,并将提示文字作为文本参数传入 adapter 即可。
  • 小图/图标提示:为了防止提示词被直接从 DOM 提取,很多点选验证码会将提示词也渲染成一张独立的小图片(如底部的 3~4 个小图标或艺术字切片)。此时通常有两种传参方式(具体以控制台产品目录中对应产品编码的模型说明为准):

    • 将背景大图与底部提示区域合并截取为一张完整图片送检;
    • 或者按照接口字段要求,分别传入主图 Base64 与提示图 Base64。

2. 优先拿原图或对容器节点精准截图

  • 避免全屏截图裁剪失真:不要截取整个浏览器视口再去估算像素裁剪。应当直接使用自动化框架定位到验证码背景图的 <img> 或 <canvas> 元素,调用元素级截图(如 Playwright 的 locator.screenshot())。
  • 剔除无关遮罩:截图前确保验证码图片已完全加载,且没有“加载中”旋转动画或鼠标悬停产生的半透明遮罩挡住目标文字。

四、 接口实战:使用 create.cgi 与 query.cgi 获取点击坐标

NexCaptcha 采用统一的异步任务架构:通过 create.cgi 创建识别任务,再通过 query.cgi 轮询结果(或使用 WebSocket 接收推送),API Key 统一放在 HTTP 请求头中鉴权。

注意:NexCaptcha 的打码接口只负责识别并返回结果,客户自己的业务请求、Session 和 Cookie 均保留在本地会话中,不经过打码服务端,保障业务环境隔离与安全。

以下是使用 Python 调用点选验证码识别接口并配合 Playwright 点击的参考代码框架:

import time
import base64
import requests

API_KEY = "YOUR_NEXCAPTCHA_API_KEY"
BASE_URL = "https://app.nexcaptcha.net/openapi"

def solve_click_captcha(image_bytes: bytes, prompt_text: str, product_code: str) -> list:
    """
    提交点选验证码图片并获取坐标列表
    :param image_bytes: 验证码截图二进制数据
    :param prompt_text: 提示词,如 '请依次点击:山,水,风'
    :param product_code: 控制台对应的点选产品编码(请以官网接口文档为准)
    """
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    
    img_b64 = base64.b64encode(image_bytes).decode("utf-8")
    
    # 1. 创建识别任务 (create.cgi)
    create_payload = {
        "productCode": product_code,
        "adapter": {
            "body": img_b64,
            "comment": prompt_text  # 具体字段名请参照控制台对应类型的参数模型
        }
    }
    
    resp = requests.post(f"{BASE_URL}/create.cgi", headers=headers, json=create_payload, timeout=15)
    resp_data = resp.json()
    task_id = resp_data.get("taskId")
    if not task_id:
        raise RuntimeError(f"创建任务失败: {resp_data}")
        
    # 2. 轮询识别结果 (query.cgi)
    for _ in range(20):
        time.sleep(1.5)
        query_resp = requests.post(
            f"{BASE_URL}/query.cgi",
            headers=headers,
            json={"taskId": task_id},
            timeout=10
        )
        result_data = query_resp.json()
        status = result_data.get("status")
        
        if status == "success":
            # 返回解析后的坐标列表,例如 [{'x': 120, 'y': 85}, {'x': 210, 'y': 160}]
            return result_data.get("solution", {}).get("coordinates", [])
        elif status in ("failed", "expired"):
            # 任务失败或过期会自动退回余额
            raise RuntimeError(f"识别未通过,状态: {status}")
            
    raise TimeoutError("查询验证码结果超时")

在正式写代码前,开发者可以直接打开 NexCaptcha 控制台,每种类型都配有在线测试台,填入 API Key 并上传一张样本图即可发起真实任务,直观确认返回的数据结构。具体的产品编码与 adapter 字段定义请查阅官方接口文档。


五、 核心痛点二:明明拿到了坐标,为什么点下去还是验证失败?

很多开发者反馈:“我把接口返回的 (x, y) 画在本地保存的截图上,位置分毫不差,但让浏览器去点却一直报错。” 这通常是由坐标空间不一致和交互风控引起的。

点选验证码高分屏DPR缩放坐标换算与按序点击示意图

1. DPR(设备像素比)与 CSS 渲染尺寸缩放换算

当你在 Retina 屏幕、高分屏或设置了 deviceScaleFactor > 1 的无头浏览器中使用元素截图时,截出来的图片实际像素宽度(naturalWidth / 截图分辨率)往往是页面 CSS 布局宽度(clientWidth)的 1.5 倍或 2 倍。

而自动化测试工具(Playwright / Puppeteer / Selenium)的鼠标点击 API 使用的是页面 CSS 视口坐标系。如果直接拿基于高分截图算出的坐标去点击,必然会点偏到右下角。

标准换算公式:

// 假设 imgElement 为页面上的验证码图片 DOM 节点
const rect = imgElement.getBoundingClientRect();

// 计算 CSS 渲染尺寸与送检图片实际宽高(imgRealWidth / imgRealHeight)的比例
const scaleX = rect.width / imgRealWidth;
const scaleY = rect.height / imgRealHeight;

// 换算为相对于元素左上角的 CSS 偏移量
const clickOffsetX = apiCoord.x * scaleX;
const clickOffsetY = apiCoord.y * scaleY;

// 若使用全页面绝对坐标点击,需加上元素自身的左上角视口偏移
const pageClickX = rect.left + clickOffsetX;
const pageClickY = rect.top + clickOffsetY;

2. 严格遵守点击顺序与时间间隔

对于语序点选或图标顺序点选,接口返回的坐标数组是严格按照提示词顺序排列的。在遍历数组执行点击时要注意:

  • 切忌 0 毫秒瞬时连点:人类在寻找并点击第 1 个字和第 2 个字之间,通常会有 250ms ~ 600ms 的视觉搜寻停顿。如果脚本在 5 毫秒内瞬间点完 4 个坐标,前端行为采集脚本会直接判定为自动化工具。
  • 加入微小随机抖动:目标文字或图标通常有 30px × 30px 左右的点击热区。可以在中心点坐标基础上增加 ±2px ~ ±4px 的高斯随机偏移,避免每次点击都死板地落在绝对几何中心。
  • 留意“确认”按钮:部分点选验证码在点满指定数量后会自动提交;而另一部分则需要再点击底部的“确认/提交”按钮。在点击“确认”前,建议同样预留 200ms ~ 400ms 的间隔。

六、 AI Agent 与跨平台迁移的便捷方案

除了传统的爬虫与 QA 自动化脚本,如果你正在构建具备自主网页操作能力的 AI Agent(相关架构设计可参考《AI Agent 遇到验证码怎么处理:工具边界、会话一致与防死循环设计》),或者正计划从其他打码平台迁移过来,NexCaptcha 提供了两项工程提效特性:

  1. 托管 MCP 服务接入:NexCaptcha 提供了免本地部署的托管 MCP 服务,支持 Claude Code、Claude Desktop、Cursor、VS Code、Gemini CLI 等客户端直接配置 API Key 接入。内置查产品、查参数模型、创建任务、查任务、查余额五个标准工具,让 AI 助手在自动化调试过程中自主调用点选识别能力。
  2. 平滑迁移参照:如果你此前使用的是 2Captcha 或 Anti-Captcha 等平台,虽然 NexCaptcha 的外层路由为 create.cgi / query.cgi(不能仅靠替换域名迁移),但我们在接口文档的每种类型下都标注了对应的通行 task type 名称,且 adapter 内部参数尽量沿用了行业熟悉的字段命名。迁移时只需改写外层请求封装与 Header 鉴权,按小流量双跑验证无误后即可全量切换。

结语

接好点选验证码识别接口,核心在于做好三件事:截取清晰且包含完整提示语义的图片、正确换算送检图片像素与页面 CSS 坐标的缩放比例、以及模拟自然的按序点击节奏。

NexCaptcha 采用按次扣费机制,余额永不过期,无月租与最低消费门槛,且任务失败或过期自动退回余额(详细规则见价格说明页)。现在前往 NexCaptcha 注册页面 即可免费领取测试额度(无需绑卡),在在线测试台中快速跑通你的第一个点选验证码识别任务。如果遇到特殊定制的点选样本,也欢迎直接联系 Telegram 客服 发送样本询价支持。

相关文章

Cloudflare Turnstile识别实战:Siteverify强制校验、Pre-Clearance通行证与会话一致性架构
公开价格监控验证码处理实战:多平台比价采集的拦截分流、会话对齐与高并发调度
reCAPTCHA识别API实战:GCP全面收编后的Enterprise评估体系、v3低分诊断与高并发调度
复杂图形验证码识别 API 实战:应对算术逻辑、粘连干扰与 RPA 自动化长尾场景
2Captcha替代方案怎么选:从众包延迟到WebSocket推送与Adapter平滑迁移实战
Python 验证码识别 API 怎么接:异步 httpx 封装、WebSocket 推送与 Playwright 联调实战