Shein 图标框选
Shein 图标框选 是 SHEIN 的图标点选 / 框选(按题干顺序在图上选出对应图标);同一套风控 SDK 还带滑块、九宫格、无感与纯 JS 挑战。一个浮层,图上散布若干图标,题干要求「按顺序选择」,点错就整张换新。另一些情况下什么题都不出 —— 页面卡顿一两秒后直接放行或直接 403,那是无感 / JS 挑战分支在起作用。
接口规格
| 项目 | 值 |
|---|---|
| type | shein |
| 必填参数 | body |
| 可选参数 | 无 |
| 返回 | 一组矩形框(solution.rects) |
| 怎么用这个解 | 要框选的矩形区域 |
| 价格 | $2.36 / 1K 次 —— 按成功计费,没解出来退款 |
| 厂商文档 | SHEIN 官方文档 |
参数去页面哪里取
下面全部是可以直接照做的定位方法 —— DOM 属性名、JS 全局变量名、script 上的 query 参数。
这条只要一张图:body = 挑战图的 base64,返回 rects 是要框选的矩形区域。走的是 Shein 专用识别模型,不吃 `comment` —— 不用告诉它「框出什么」,它已经认识 Shein 那套图标集。
第一步确认是 Shein 风控挑战、并判断落在哪一类:
[ gbCommonInfo.RISK_SDK_TYPE, // {903:'js_challenge',904:'slide',905:'click',909:'one_pass',910:'nine_captcha'}
gbCommonInfo.ARMOR_CDN, // '//armor.ltwebstatic.com'
gbCommonInfo.GB_RISK_JS_CHALLEGE, // 注意站方拼写:CHALLEGE,少一个 N
gbCommonInfo.RISK_SDK_CONFIG, // {sm, anti, infp, armorUuid, csrandom, ...}
document.cookie.match(/armorUuid=[^;]+/),
[...document.scripts].map(s=>s.src).filter(s=>/armor\.ltwebstatic\.com/.test(s)) ]第二步取图(同样避开 canvas 跨域污染):
const el=[...document.querySelectorAll('img,canvas')]
.filter(e=>(e.naturalWidth||e.width)>100&&(e.naturalHeight||e.height)>100).pop();
fetch(el.currentSrc||el.src).then(r=>r.blob()).then(b=>{const f=new FileReader();
f.onload=()=>{window.__body=String(f.result).split(',')[1];console.log('body len',window.__body.length)};
f.readAsDataURL(b);});拿到 rects 后取每个矩形的中心点,按返回顺序依次点击。
调用示例
一个端点解全部验证码类型 —— 换一种验证码只改 type 这一个字段。
curl -X POST https://api.everyinfra.com/api/v1/captcha \ -H "Authorization: Bearer omg_你的KEY" \ -H "Content-Type: application/json" \ -d '{"type":"shein","body":"<body>"}'
{ "solution": { "rects": "…" }, "billing": { "charged": true, "credits": 170 }}
怎么确认目标站用的就是它
整套风控配置就写在首页 HTML 的全局对象 `gbCommonInfo` 里(2026-08-30 直接抓取 `us.shein.com` 首页所见):`ARMOR_CDN: "//armor.ltwebstatic.com"`、`GB_RISK_JS_CHALLEGE: 1`(站方自己把 CHALLENGE 拼少了一个 N)、`RISK_SDK_CONFIG`(含 `sm` / `anti` / `infp` / `armorUuid` / `csrandom` 各模块版本与降级开关),以及**挑战类型表** `RISK_SDK_TYPE`:`903 js_challenge`、`904 slide`、`905 click`、`909 one_pass`、`910 nine_captcha`。页面直接注入 `armor.ltwebstatic.com/she_dist/armor-libs/antiin/antiin.<ver>.min.js` 与 `csrandom.<ver>.min.js`,另有按需下发的指纹模块 `infp.<ver>.min.js`;服务端下发 `armorUuid` Cookie 作为设备标识(与 `sessionID_shein` 并列)。业务接口上再叠一层签名请求头 —— 公开逆向资料称为 `anti-in`、`smdeviceid`、`armortoken`、`x-gw-auth`,其中 `anti-in` 与页面上的 `antiin.js` 对得上,其余三个未获官方确认。
容易搞混的
不是极验、不是网易易盾、不是 Cloudflare —— 脚本全部托管在 SHEIN 自有域 armor.ltwebstatic.com 下。也别和通用图标框选混:通用那条要你在 comment 里写清楚框什么,这条是站点专用模型,直接给图即可,反过来用两边都会不准。
常见部署场景
- `shein.com` 各国站(`us.` / `www.` / `de.` / `uk.` / `es.` 等,同一套配置下发给 20 多个站点)
- 浏览商品列表、搜索翻页、商品详情高频访问
- 登录、注册、加购、下单
- 数据中心 IP、代理出口、高并发访问下最容易触发
已知的坑
只对 SHEIN 的图标题有效;别的站的框选题请走通用框选那条。
gbCommonInfo 是 PC 站的全局变量名,移动站 / App WebView 下未必同名 —— 先 Object.keys(window).filter(k=>/gb|armor|risk/i.test(k)) 找一下。
SHEIN 自己把 key 拼成了 GB_RISK_JS_CHALLEGE(少一个 N),照正确拼写去读会得到 undefined。
RISK_SDK_TYPE 里 903 js_challenge 与 909 one_pass 是不出题的分支 —— 遇到这两类根本不需要调求解,白调一次。
网上流传的 x-gw-auth / armortoken / smdeviceid 三个请求头来自第三方逆向文章,未经官方确认,别当契约写死;anti-in 与页面注入的 antiin.js 对得上,可信度更高一些。
风控配置逐站下发(siteuid 字段控制),美国站与欧洲站的模块版本和降级开关不一定相同 —— 在哪个站遇到就在哪个站读配置。
走的是站点专用识别模型,不吃 comment —— 通用框选那条要你说「框出什么」,这条已经知道 Shein 的图标集,直接给图即可
只对 Shein 的图标题有效;别的站的框选题请用通用框选那条
常见问题
Shein 图标框选 要传哪些参数?
必填 body,没有可选参数。请求里 type 传 shein。
解出来的东西怎么用?
返回一组矩形框,取 solution.rects。要框选的矩形区域
rects 要去页面的哪里找?
重点找 rects、GB_RISK_JS_CHALLEGE、RISK_SDK_TYPE。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。
怎么确认目标站用的就是 Shein 图标框选?
不是极验、不是网易易盾、不是 Cloudflare —— 脚本全部托管在 SHEIN 自有域 armor.ltwebstatic.com 下。也别和通用图标框选混:通用那条要你在 comment 里写清楚框什么,这条是站点专用模型,直接给图即可,反过来用两边都会不准。
有什么容易踩的坑?
只对 SHEIN 的图标题有效;别的站的框选题请走通用框选那条。
多少钱一次,失败扣不扣?
$2.36 / 1K 次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。