EveryInfra

Shein 图标框选

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

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

接口规格

项目
typeshein
必填参数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 里写清楚框什么,这条是站点专用模型,直接给图即可,反过来用两边都会不准。

去看 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 的图标题有效;别的站的框选题请用通用框选那条

常见问题

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

开始接入

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