EveryInfra

AWS WAF 图像识别(九宫格 / 找目标)

AWS WAF 图像识别(九宫格 / 找目标)Amazon Web Services一组图 + 一个题目标识进,命中位置出(只识别,不过盾)AWS WAF 的人机验证页(标题常是「Human Verification」)。常见两种图形题:九宫格「选出所有含某物的图」,以及「给玩具车的行驶路径末端点一个点」的迷你游戏;另有音频题作为无障碍替代。

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

接口规格

项目
typeaws_waf_classify
必填参数imagesquestion
可选参数
返回一组坐标点solution.box
怎么用这个解命中目标的位置。⚠ 这是**识图**不是过盾 —— 它告诉你点哪里,拿到坐标后还要你自己去点
价格$0.97 / 1K 次 —— 按成功计费,没解出来退款
厂商文档Amazon Web Services 官方文档

参数去页面哪里取

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

先确认确实是 AWS WAF(这一步比取图更重要,它决定你该走识图还是走过盾):挑战页顶层会挂 window.gokuProps(三个字段 key / iv / context)和 window.awsWafCookieDomainList;脚本是 challenge.js + captcha.js(JS 集成模式则是 jsapi.js);渲染容器常见 <div id="captcha-container">;渲染入口是 CaptchaScript.renderCaptcha(container, cb)AwsWafCaptcha.renderCaptcha(...),提交走 ChallengeScript.submitCaptcha(voucher)。通行凭证是 Cookie aws-waf-token,跨域调用时改走请求头 x-aws-waf-token

一行全查:

JSON.stringify({goku:window.gokuProps,domains:window.awsWafCookieDomainList,scripts:[...document.scripts].map(s=>s.src).filter(s=>/challenge\.js|captcha\.js|jsapi\.js/.test(s)),container:!!document.querySelector('#captcha-container'),cookie:document.cookie.includes('aws-waf-token')})

取题图:题目渲染在 shadow DOM 里,普通 querySelectorAll 扫不到,穿透一层:

[...document.querySelectorAll('*')].flatMap(e=>e.shadowRoot?[...e.shadowRoot.querySelectorAll('img,canvas')]:[]).map(n=>n.tagName==='CANVAS'?n.toDataURL():n.src)

拿不到渲染结果时,图也可以从挑战 SDK 的 problem 端点响应里取 —— 在页面 HTML 里搜 visualSolutionsRequired 能定位到该端点,以及这道题需要提交几个解。

`question` 从页面题面对应过去:九宫格取 aws:grid:<物体>(一次传 9 张图),玩具车路径题取 aws:toycarcity:carcity(一张图)。已知的九宫格物体:bag bed belts binocular bucket chair clock cooking pot curtain fork hat scissors seat spoon suitcase umbrella。题面说 “Select all images containing a bag” 就传 aws:grid:bag

调用示例

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

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

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

只做图像识别,返回该点哪里 / 哪几张命中。**不产出 `aws-waf-token`** —— 点击、由页面脚本走完提交、让通行 Cookie 落地,全部仍在调用方的浏览器里发生。

容易搞混的

AWS WAF 挑战(aws_waf,端到端交付通行 Cookie)与 AWS WAF 的静默 Challenge(无界面、纯浏览器指纹校验)。

去看 AWS WAF 挑战 那一条 →

常见部署场景

已知的坑

这条不过盾。aws_waf 的分工:那条给页面 URL,端到端交付带 aws-waf-token 的 Cookie 串,连 JS 指纹挑战一起跑完;这条只回「点哪里」。什么时候要这条:① 你已经在真浏览器里跑,会话、代理、指纹都是自己的 —— token 与浏览器指纹和出口 IP 绑定,换一套环境拿回来的 token 目标站不认;② 单价低一个量级;③ 你要自己控制点击节奏与轨迹。

`question` 必须与页面题型对上,自己编一个不存在的值会直接失败。

九宫格一次传 9 张images 是数组),玩具车路径题只传 1 张。

答案形态按题型不同:九宫格返回的是「命中的图片序号」(0 基,对应你传进来的数组下标),路径题返回的是一个坐标点。接入前按你实际会遇到的题型确认要取哪个字段。

gokuProps 里的 key / iv / context 取一次就过期,每次挑战都要现读;缓存复用必然报「参数已过期」。

跨子域场景(页面在 app.example.com、API 在 api.example.com)必须配好 window.awsWafCookieDomainList,否则即使题解对了也会被记成 token 域不匹配。

AWS WAF 还有一种「拖滑块把两半形状对齐」的题(图固定 320×160,答案是一个 0–255 的偏移值),以及纯音频题,都不在这条覆盖范围内。

另有一种 Challenge 动作是静默的(无 UI、纯 JS 指纹),用户根本看不到题 —— 遇到那种别去找图。

与 AWS WAF 挑战(aws_waf)不是一回事:那条直接交付通行 Cookie,这条只做图像识别、交付坐标,适合你自己驱动浏览器的场景

常见问题

AWS WAF 图像识别(九宫格 / 找目标) 要传哪些参数?

必填 images、question,没有可选参数。请求里 type 传 aws_waf_classify。

解出来的东西怎么用?

返回一组坐标点,取 solution.box。命中目标的位置。⚠ 这是识图不是过盾 —— 它告诉你点哪里,拿到坐标后还要你自己去点

window.awsWafCookieDomainList 要去页面的哪里找?

重点找 window.awsWafCookieDomainList、visualSolutionsRequired、querySelectorAll。本页「参数去页面哪里取」一节写了全部位置与取法,含可直接粘进控制台的一行命令。

怎么确认目标站用的就是 AWS WAF 图像识别(九宫格 / 找目标)?

AWS WAF 挑战(aws_waf,端到端交付通行 Cookie)与 AWS WAF 的静默 Challenge(无界面、纯浏览器指纹校验)。

有什么容易踩的坑?

这条不过盾。aws_waf 的分工:那条给页面 URL,端到端交付带 aws-waf-token 的 Cookie 串,连 JS 指纹挑战一起跑完;这条只回「点哪里」。什么时候要这条:① 你已经在真浏览器里跑,会话、代理、指纹都是自己的 —— token 与浏览器指纹和出口 IP 绑定,换一套环境拿回来的 token 目标站不认;② 单价低一个量级;③ 你要自己控制点击节奏与轨迹。

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

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

开始接入

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