滑块验证码(算出要拖多远)
滑块验证码(算出要拖多远) 是 不限单一厂商(题型能力)——腾讯 TCaptcha、极验 GeeTest、网易易盾、顶象、阿里云等都产出这种题 的两张图进、一个像素距离出:带缺口的背景图 + 缺口小块,返回要把小块横向拖多远。一张风景或商品照片,上面被挖掉一小块拼图形状的缺口;下方一条滑轨,把左端那个小拼图块往右拖,拖到缺口里对齐就通过。
接口规格
| 项目 | 值 |
|---|---|
| type | slider |
| 必填参数 | 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;这条只回一个像素数,拖动和提交都在你手上。
常见部署场景
- 腾讯天御 TCaptcha(滑动拼图 / 滑块混淆)
- 极验 GeeTest v3 / v4 滑动拼图
- 网易易盾行为式验证码
- 顶象、阿里云等国内自研滑块
- 电商登录注册、票务抢购、社交平台发帖、金融开户等高频人机验证场景
已知的坑
返回的 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 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。