EveryInfra

Shein 图标框选

Shein 图标框选SHEIN图标点选 / 框选(按题干顺序在图上选出对应图标);同一套风控 SDK 还带滑块、九宫格、无感与纯 JS 挑战一个浮层,图上散布若干图标,题干要求「按顺序选择」,点错就整张换新。另一些情况下什么题都不出 —— 页面卡顿一两秒后直接放行或直接 403,那是无感 / JS 挑战分支在起作用。

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

接口规格

项目
typeshein
必填参数body
可选参数
返回一组矩形框solution.rects
怎么用这个解要框选的矩形区域
价格$2.36 / 千次 —— 按成功计费,没解出来退款
厂商或项目资料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_TYPE903 js_challenge904 slide905 click909 one_pass910 nine_captcha。页面直接注入 armor.ltwebstatic.com/she_dist/armor-libs/antiin/antiin.<ver>.min.jscsrandom.<ver>.min.js,另有按需下发的指纹模块 infp.<ver>.min.js;服务端下发 armorUuid Cookie 作为设备标识(与 sessionID_shein 并列)。业务接口上再叠一层签名请求头 —— 公开逆向资料称为 anti-insmdeviceidarmortokenx-gw-auth,其中 anti-in 与页面上的 antiin.js 对得上,其余三个未获官方确认。

容易搞混的

不是极验、不是网易易盾、不是 Cloudflare —— 脚本全部托管在 SHEIN 自有域 armor.ltwebstatic.com 下。也别和通用图标框选混:通用那条要你在 comment 里写清楚框什么,这条是站点专用模型,直接给图即可,反过来用两边都会不准。

去看 Cloudflare 那一条 →

常见部署场景

已知的坑

只对 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_TYPE903 js_challenge909 one_pass 是不出题的分支 —— 遇到这两类根本不需要调求解,白调一次。

网上流传的 x-gw-auth / armortoken / smdeviceid 三个请求头来自第三方逆向文章,未经官方确认,别当契约写死;anti-in 与页面注入的 antiin.js 对得上,可信度更高一些。

风控配置逐站下发(siteuid 字段控制),美国站与欧洲站的模块版本和降级开关不一定相同 —— 在哪个站遇到就在哪个站读配置。

走的是站点专用识别模型,不吃 comment —— 通用框选那条要你说「框出什么」,这条已经知道 Shein 的图标集,直接给图即可

只对 Shein 的图标题有效;别的站的框选题请用通用框选那条

参考资料

下列资料用于核对验证码厂商、题型和页面术语,不表示相关厂商对 EveryInfra 的授权或背书。 EverySolve 的参数、返回字段、可用状态和计费仍以本页接口契约及公开类型目录为准。

常见问题

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 / 千次。按成功计费 —— 没解出来一律退款,所以失败不花钱。账单按次记,标价按每千次是为了让量级读得出来。

开始接入

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