指南
任务(令牌)
AWS WAF

AwsWafCaptcha: 解决 AWS WAF

TIP

使用 createTask 方法创建任务,并使用 getTaskResult 方法获取结果。

我们支持的任务类型 types

  • AntiAwsWafTask 此任务类型需要您自己的代理。
  • AntiAwsWafTaskProxyLess 此任务类型不需要您自己的代理。

创建任务

使用 createTask 方法创建识别任务。

任务对象结构

属性类型必需描述
type字符串必需AntiAwsWafTask
AntiAwsWafTaskProxyLess
proxy字符串可选了解 如何使用代理
websiteURL字符串必需返回验证码相关信息的页面URL
awsKey字符串可选验证码页面返回的 key
awsIv字符串可选验证码页面返回的 iv
awsContext字符串可选验证码页面返回的 context
awsChallengeJS字符串可选验证码页面返回的 challenge.js 链接
awsApiJs字符串可选验证码页面返回的 jsapi.js 链接
awsProblemUrl字符串可选包含 problemnum_solutions_required 等关键字的 problem 端点 URL
awsApiKey字符串可选problem 端点的 api_key
awsExistingToken字符串可选用于上次验证的 aws-waf-token
我应该使用哪些参数?

如果您不确定应该向 CapSolver 传递哪些参数,请参考以下不同参数组合的场景。如果您的具体情况未涵盖,请联系我们的客服寻求帮助。

场景传递参数前提条件
场景 1websiteURLAWS 验证码页面响应代码可能为 405,并且在 HTML 中可以找到以下参数:
window.gokuProps = {"key":"AQID...","iv":"A6we...","context":"rGXm.."}
场景 2websiteURL
awsKey
awsIv
awsContext
awsChallengeJS
在场景 1 的前提下,如果 CapSolver 返回错误消息:Captcha render unexpect status code XXX, please pass in the awsKey, awsIv, awsContext and awsChallengeJs parameters,则表示服务器未触发验证码。请手动解析 key、iv 和 context 参数并将其传递给 CapSolver。
特别注意
如果您收到错误消息 timeout metering, your parameters have expired, please update awsKey, awsIv, awsContext or awsChallengeJS.,则表示您提供的这四个参数不对应或已过期。建议对每个请求实时解析所有参数。
场景 3-1websiteURL
awsChallengeJS
当页面找不到 key、iv、context,但有 challenge.js 时,将 challenge.js 作为 awsChallengeJS 的值传递给 CapSolver。
场景 3-2websiteURL
awsApiJs
在场景 3-1 的基础上,如果 challenge.js 的来源不明确,但页面有 jsapi.js,这意味着 challenge.js 是由 jsapi.js 的代码组装而成的,那么可以直接将 jsapi.js 作为 awsApiJs 的值传递给 CapSolver。
场景 4websiteURL
awsProblemUrl
在特殊情况下,当页面找不到 key、iv、context、challenge.js,且只有 captcha.js 时,您需要将 problem 端点 URL 传递给 CapSolver。awsProblemUrl 应包含 problemnum_solutions_required 等值。这些值可以通过在页面 HTML 中搜索 visualSolutionsRequired 找到。

awsProblemUrl 完整示例:https://ait.2608283a.us-east-1.captcha.awswaf.com/ait/ait/ait/problem?kind=visual&domain=www.amazon.com&locale=en-us&problem=gridcaptcha-5-0.15-0&num_solutions_required=2
场景 5websiteURL
awsApiKey
awsApiJs
awsExistingToken
这通常发生在需要二次验证的情况下。problem 端点包含一个 api_key(其值对于每个网站通常是固定的)作为 awsApiKey。页面有一个 jsapi.js 作为 awsApiJs,并且前一次验证的 aws-waf-token 作为 awsExistingToken 传递给 CapSolver。

请求示例

POST https://api.capsolver.com/createTask
Host: api.capsolver.com
Content-Type: application/json
 
{
    "clientKey": "YOUR_API_KEY",
    "task": {
        "type": "AntiAwsWafTask", // AntiAwsWafTaskProxyLess
        "websiteURL": "https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest", // 必需
        "awsKey": "AQIDAHjcYu/GjX+QlghicBg......shMIKvZswZemrVVqA==",  // 可选
        "awsIv": "CgAAFDIlckAAAAid",  // 可选
        "awsContext": "7DhQfG5CmoY90ZdxdHCi8WtJ3z......njNKULdcUUVEtxTk=",  // 可选
        "awsChallengeJS": "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb......a6c832/challenge.js",  // 可选
        "awsApiJs": "https://9175c2fd4189.edge.captcha-sdk.awswaf.com/9175c2fd4189/jsapi.js",  // 可选
        "awsProblemUrl": "https://ait...awswaf.com/ait/ait/ait/problem?kind=visual&...&problem=gridcaptcha-5-0.1-0&num_solutions_required=2",  // 可选
        "awsApiKey": "Sps+L2gV...",  // 可选
        "awsExistingToken": "5na16dg6-216a-...",  // 可选
        "proxy": "http:ip:port:user:pass" // socks5:ip:port:user:pass
    }
}

成功向我们提交任务后,您将在响应中收到一个 ‘taskId’。如果您未收到任务 ID,请阅读 errorCode: 错误列表。欲了解更多信息,您还可以参考这篇博客文章 如何解决 AWS Amazon 验证码令牌

响应示例

{
    "errorId": 0,
    "errorCode": "",
    "errorDescription": "",
    "taskId": "61138bb6-19fb-11ec-a9c8-0242ac110006"
}

获取结果

获得 taskId 后,您需要提交 taskId 以检索解决方案。响应结构在 getTaskResult 中有说明。

根据系统负载,您将在 530 秒内获得结果。

请求示例

POST https://api.capsolver.com/getTaskResult
Host: api.capsolver.com
Content-Type: application/json
 
{
    "clientKey": "YOUR_API_KEY",
    "taskId": "61138bb6-19fb-11ec-a9c8-0242ac110006"
}

响应示例

{
  "errorId": 0,
  "taskId": "646825ef-9547-4a29-9a05-50a6265f9d8a",
  "status": "ready",
  "solution": {
    "cookie": "223d1f60-0e9f-4238-ac0a-e766b15a778e:EQoAf0APpGIKAAAA:AJam3OWpff1VgKIJxH4lGMMHxPVQ0q0R3CNtgcMbR4VvnIBSpgt1Otbax4kuqrgkEp0nFKanO5oPtwt9+Butf7lt0JNe4rZQwZ5IrEnkXvyeZQPaCFshHOISAFLTX7AWHldEXFlZEg7DjIc="
  }
}

使用 SDK 请求

# pip install --upgrade capsolver
# export CAPSOLVER_API_KEY='...'
 
import capsolver
 
# capsolver.api_key = "..."
solution = capsolver.solve({
    "type": "AntiAwsWafTask",
    "websiteURL": "https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest",
    "proxy": "ip:port:user:pass"
})

示例代码

# pip install requests
import requests
import time
 
api_key = "YOUR_API_KEY"  # TODO: 您的 CapSolver API 密钥
site_url = "https://efw47fpad9.execute-api.us-east-1.amazonaws.com/latest"  # TODO: 您网站的页面 URL
 
 
def capsolver():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": 'AntiAwsWafTaskProxyLess',
            "websiteURL": site_url
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("Failed to create task:", res.text)
        return
    print(f"Got taskId: {task_id} / Getting result...")
 
    while True:
        time.sleep(1)  # delay
        payload = {"clientKey": api_key, "taskId": task_id}
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('cookie')
        if status == "failed" or resp.get("errorId"):
            print("Solve failed! response:", res.text)
            return
 
 
token = capsolver()
print(token)