EveryInfra

滑块验证码(算出要拖多远)

滑块验证码(算出要拖多远)不限单一厂商(题型能力)——腾讯 TCaptcha、极验 GeeTest、网易易盾、顶象、阿里云等都产出这种题两张图进、一个像素距离出:带缺口的背景图 + 缺口小块,返回要把小块横向拖多远一张风景或商品照片,上面被挖掉一小块拼图形状的缺口;下方一条滑轨,把左端那个小拼图块往右拖,拖到缺口里对齐就通过。

正在查询可用性…$2.36 / 1K 次按成功计费,失败退款

接口规格

项目
typeslider
必填参数bodypiece
可选参数
返回一个数字solution.distance
怎么用这个解要拖动的像素距离(整数)
价格$2.36 / 1K 次 —— 按成功计费,没解出来退款

参数去页面哪里取

下面全部是可以直接照做的定位方法 —— DOM 属性名、JS 全局变量名、script 上的 query 参数。

背景图与缺口小图在 DOM 上通常是两个独立节点,按厂商定位:

  • 腾讯 TCaptcha:整套跑在 <iframe id="tcaptcha_iframe"> 里(源站 turing.captcha.gtimg.com,跨域 —— DevTools 控制台顶部要先把执行上下文切到这个 frame,否则什么都查不到)。背景图 #slideBg、拼图块 #slideBlock,两者都是 <img>,直接读 .src。下发的背景原图是 672×390,页面上常按约一半渲染;接口里 fg_elem_list[0].init_pos 就是拼图块的起始坐标。
  • 极验 GeeTest v3:三个 <canvas> —— .geetest_canvas_bg(带缺口)、.geetest_canvas_slice(拼图块)、.geetest_canvas_fullbg(无缺口原图),用 .toDataURL('image/png') 取;滑柄是 .geetest_slider_button
  • 极验 v4.geetest_bg.geetest_slice_bg,图藏在 inline style 的 `background-image: url(...)` 里,不是 src
  • 网易易盾img.yidun_bg-img(背景)与 img.yidun_jigsaw(拼图块),都读 .src;滑柄 .yidun_slider__icon

一行同时拿到「图 + 原图尺寸 + 显示尺寸」(后两个数就是换算比例,只复制图是不够的):

[...document.querySelectorAll('img,canvas')].map(e=>({id:e.id,cls:e.className,natural:[e.naturalWidth||e.width,e.naturalHeight||e.height],shown:[e.clientWidth,e.clientHeight],data:e.tagName==='CANVAS'?e.toDataURL():e.src}))

提交时把 data:image/png;base64, 前缀和所有换行去掉:背景图放 body,拼图块放 piece

调用示例

一个端点解全部验证码类型 —— 换一种验证码只改 type 这一个字段。

请求
curl -X POST https://api.everyinfra.com/api/v1/captcha \  -H "Authorization: Bearer omg_你的KEY" \  -H "Content-Type: application/json" \  -d '{"type":"slider","body":"<body>","piece":"<piece>"}'
响应
{  "solution": {    "distance": "…"  },  "billing": { "charged": true, "credits": 170 }}

怎么确认目标站用的就是它

用小块的 alpha 通道做掩码,在背景图上做模板匹配(NCC 一类),算出缺口的水平位置,再减去小块的起始位置,得到需要的水平位移。识别只解决「拖多远」这一半;「怎么拖」仍在调用方手上 —— 厂商同时在采集鼠标轨迹、耗时与加速度曲线,距离算对但轨迹是匀速直线一样会被判为机器。

容易搞混的

DataDome 滑块与 GeeTest 端到端过盾 —— 那两条是给 URL 和代理、直接交付通行 Cookie 或 token;这条只回一个像素数,拖动和提交都在你手上。

去看 DataDome 滑块 那一条 →

常见部署场景

已知的坑

返回的 distance 是「你提交的那张背景图」的像素,不是屏幕像素 —— 这是本类型最大的坑。页面几乎总在缩放(腾讯原图 672 宽、常按约一半渲染),把返回值直接当鼠标位移会稳定偏大一倍、永远对不上。换算:屏幕位移 = distance × (bg.clientWidth / bg.naturalWidth)。上面那条一行命令把两个尺寸一起打出来就是为了这个。

拼图块的初始位置通常不在 x=0:它离左边框有固定内缩(常见 5–10px)。真正要拖的是「缺口 x − 小块起始 x」,不是缺口 x 本身。腾讯的 init_pos 就是这个值;没有接口可读时截图量一次即可,同一站点通常固定。

拖动轨迹要你自己造,我们只给距离。厂商同时在看鼠标轨迹、总耗时和加减速;匀速直线一拖到底,即使距离完全正确也会被判机器。

canvas 取图会被跨域污染:图片来自第三方域且没带 CORS 头时 toDataURL()SecurityError,这时改成在服务端 fetch(img.src) 取原图。

别提交屏幕截图 —— 缩放后的截图丢掉高频细节,缺口边缘匹配精度直接掉一个量级。取 src 指向的原图。

极验较老的实现把背景切成 52 片乱序渲染(每片一个带 background-position 的 div),直接截屏拿到的是乱序图,必须先按位移还原;canvas 版(.geetest_canvas_bg)已经是还原好的,优先取 canvas。

返回的是像素距离,不是坐标也不是百分比 —— 拖动轨迹要你自己生成,我们只给距离

常见问题

滑块验证码(算出要拖多远) 要传哪些参数?

必填 body、piece,没有可选参数。请求里 type 传 slider。

解出来的东西怎么用?

返回一个数字,取 solution.distance。要拖动的像素距离(整数)

fg_elem_list[0].init_pos 要去页面的哪里找?

重点找 fg_elem_list[0].init_pos、img.yidun_jigsaw、piece。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。

怎么确认目标站用的就是 滑块验证码(算出要拖多远)?

DataDome 滑块与 GeeTest 端到端过盾 —— 那两条是给 URL 和代理、直接交付通行 Cookie 或 token;这条只回一个像素数,拖动和提交都在你手上。

有什么容易踩的坑?

返回的 distance 是「你提交的那张背景图」的像素,不是屏幕像素 —— 这是本类型最大的坑。页面几乎总在缩放(腾讯原图 672 宽、常按约一半渲染),把返回值直接当鼠标位移会稳定偏大一倍、永远对不上。换算:屏幕位移 = distance × (bg.clientWidth / bg.naturalWidth)。上面那条一行命令把两个尺寸一起打出来就是为了这个。

多少钱一次,失败扣不扣?

$2.36 / 1K 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。

开始接入

一个端点覆盖全部验证码类型,按成功计费,失败与空结果一律退款。