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 | 字符串 | 可选 | 包含 problem 、num_solutions_required 等关键字的 problem 端点 URL |
awsApiKey | 字符串 | 可选 | problem 端点的 api_key 值 |
awsExistingToken | 字符串 | 可选 | 用于上次验证的 aws-waf-token |
我应该使用哪些参数?
如果您不确定应该向 CapSolver 传递哪些参数,请参考以下不同参数组合的场景。如果您的具体情况未涵盖,请联系我们的客服寻求帮助。
场景 | 传递参数 | 前提条件 |
---|---|---|
场景 1 | websiteURL | AWS 验证码页面响应代码可能为 405,并且在 HTML 中可以找到以下参数:window.gokuProps = {"key":"AQID...","iv":"A6we...","context":"rGXm.."} |
场景 2 | websiteURL 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-1 | websiteURL awsChallengeJS | 当页面找不到 key、iv、context,但有 challenge.js 时,将 challenge.js 作为 awsChallengeJS 的值传递给 CapSolver。 |
场景 3-2 | websiteURL awsApiJs | 在场景 3-1 的基础上,如果 challenge.js 的来源不明确,但页面有 jsapi.js,这意味着 challenge.js 是由 jsapi.js 的代码组装而成的,那么可以直接将 jsapi.js 作为 awsApiJs 的值传递给 CapSolver。 |
场景 4 | websiteURL awsProblemUrl | 在特殊情况下,当页面找不到 key、iv、context、challenge.js,且只有 captcha.js 时,您需要将 problem 端点 URL 传递给 CapSolver。awsProblemUrl 应包含 problem 和 num_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 |
场景 5 | websiteURL 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 中有说明。
根据系统负载,您将在 5
到 30
秒内获得结果。
请求示例
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)