跳转到主要内容
获取令牌时遇到问题吗
联系支持

Amazon | AWS WAF 验证码与挑战

任务示例

下面展示了 CapMonster Cloud 当前支持的 Amazon AWS WAF 验证类型示例:

Click
Puzzle

解决 AWS WAF 中的验证码与挑战

更多相关内容,请访问我们的博客
注意!

CapMonster Cloud 默认通过内置代理工作——这些代理已包含在费用内。仅当网站不接受令牌或对内置服务的访问受限时,才需要指定您自己的代理。

如果代理按 IP 授权,请将地址 65.21.190.34 加入白名单。

请求参数


重要提示:某些参数的值是动态的,也就是说,在每次渲染包含 Amazon (AWS WAF) 的页面时都会发生变化。
请在创建任务前立即提取这些参数,以避免在解决过程中出现错误。
自动提取参数的示例请参见章节 如何查找任务创建所需的所有参数


选项 1

type<string>required

AmazonTask


websiteURL<string>required

解决验证码的主页面地址。


websiteKey<string>required

可在验证码渲染时的 apiKey 字段中找到。

示例:h15hX7brbaRTR...Za1_1


captchaScript<string>required

html 页面上的 jsapi.js 链接,格式为 <Integration URL\>jsapi.js


cookieSolution<boolean>optional

默认值为 false——响应中将返回 "captcha_voucher" 和 "existing_token"。如果您需要 "aws-waf-token" Cookie,请指定值 true


userAgent<string>optional

浏览器 User-Agent。请使用 CapMonster Cloud 当前支持的值:userAgentPlaceholder

可通过以下地址获取最新值:https://capmonster.cloud/api/useragent/actual


proxyType<string>optional

http - 普通 http/https 代理;
https - 仅当“http”不起作用时尝试此选项(某些自定义代理需要);
socks4 - socks4 代理;
socks5 - socks5 代理。


proxyAddress<string>optional

IPv4/IPv6 代理 IP 地址。不允许:

  • 使用透明代理(可看到客户端 IP 的代理);
  • 使用本地计算机上的代理。


proxyPort<integer>optional

代理端口。


proxyLogin<string>optional

代理服务器登录名。


proxyPassword<string>optional

代理服务器密码。


选项 2

type<string>required

AmazonTask


websiteURL<string>required

解决验证码的主页面地址。


challengeScript<string>required

challenge.js 的链接(参见下方说明)


websiteKey<string>required

可从包含验证码的 html 页面中获取,或通过执行 javascript window.gokuProps.key 获取的字符串

示例:AQIDA...wZwdADFLWk7XOA==


context<string>required

可从包含验证码的 html 页面中获取,或通过执行 javascript window.gokuProps.context 获取的字符串。

示例:qoJYgnKsc...aormh/dYYK+Y=


iv<string>required

可从包含验证码的 html 页面中获取,或通过执行 javascript window.gokuProps.iv 获取的字符串。

示例:CgAAXFFFFSAAABVk


captchaScript<string>optional

captcha.js 的链接(如果只有质询,则可能不存在)


cookieSolution<boolean>optional

默认值为 false——响应中将返回 "captcha_voucher" 和 "existing_token"。如果您需要 "aws-waf-token" Cookie,请指定值 true


proxyType<string>optional

http - 普通 http/https 代理;
https - 仅当“http”不起作用时尝试此选项(某些自定义代理需要);
socks4 - socks4 代理;
socks5 - socks5 代理。


proxyAddress<string>optional

代理 IPv4/IPv6 地址。禁止:

  • 透明代理(客户端 IP 可见);
  • 本地机器上的代理。


proxyPort<integer>optional

代理端口。


proxyLogin<string>optional

代理服务器登录名。


proxyPassword<string>optional

代理服务器密码。


选项 3

如果网站使用隐形验证码并且只加载 challenge.js,请使用此方案。在这种情况下,无需像方案 2 那样传递所有参数——这些值可以留空。仅传递 challenge.js 的值。

type<string>required

AmazonTask


websiteURL<string>required

解决验证码的主页面地址。


challengeScript<string>required

challenge.js 的链接。


context<string>required

请指定空字符串。


iv<string>required

请指定空字符串。


cookieSolution<boolean>optional

请指定值 true 以获取 "aws-waf token"。


proxyType<string>optional

http - 标准 http/https 代理;
https - 仅在 "http" 无效时尝试(某些自定义代理需要);
socks4 - socks4 代理;
socks5 - socks5 代理。


proxyAddress<string>optional

代理 IPv4/IPv6 地址。禁止:

  • 透明代理(客户端 IP 可见);
  • 本地机器上的代理。


proxyPort<integer>optional

代理端口。


proxyLogin<string>optional

代理服务器登录名。


proxyPassword<string>optional

代理服务器密码。


如何获取 websiteKeycontextivchallengeScript 参数

访问网站时,您会收到 405 响应和一个包含验证码的 html 页面。所有参数都可以从该页面中提取:

任务创建方法

选项 1

POST
https://api.capmonster.cloud/createTask

请求示例

{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com/page-with-aws-waf",
"websiteKey": "your-website-key",
"userAgent": "userAgentPlaceholder",
"captchaScript": "https://example.captcha-sdk.awswaf.com/jsapi.js",
"cookieSolution": true
}
}

响应示例

{
"errorId": 0,
"taskId": 407533072
}

选项 2

POST
https://api.capmonster.cloud/createTask

请求示例

{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com/page-with-aws-waf",
"challengeScript": "https://example.token.awswaf.com/challenge.js",
"captchaScript": "https://example.captcha.awswaf.com/captcha.js",
"websiteKey": "your-website-key",
"context": "your-context",
"iv": "your-iv",
"cookieSolution": true
}
}

响应示例

{
"errorId": 0,
"taskId": 407533072
}

选项 3

POST
https://api.capmonster.cloud/createTask

请求示例

{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com/page-with-aws-waf",
"challengeScript": "https://example.token.awswaf.com/challenge.js",
"context": "",
"iv": "",
"cookieSolution": true
}
}

响应示例

{
"errorId": 0,
"taskId": 407533072
}

获取任务结果方法

使用getTaskResult方法获取 AmazonTask 的解决方案。

POST
https://api.capmonster.cloud/getTaskResult

请求示例

{
"clientKey":"API_KEY",
"taskId": 407533072
}

响应示例

{
"errorId": 0,
"status": "ready",
"solution": {
"cookies": {
"aws-waf-token": "10115f5b-ebd8-45c7-851e-cfd4f6a82e3e:EAoAua1QezAhAAAA:dp7sp2rXIRcnJcmpWOC1vIu+yq/A3EbR6b6K7c67P49usNF1f1bt/Af5pNcZ7TKZlW+jIZ7QfNs8zjjqiu8C9XQq50Pmv2DxUlyFtfPZkGwk0d27Ocznk18/IOOa49Rydx+/XkGA7xoGLNaUelzNX34PlyXjoOtL0rzYBxMAQy0D1tn+Q5u97kJBjs5Mytqu9tXPIPCTSn4dfXv5llSkv9pxBEnnhwz6HEdmdJMdfur+YRW1MgCX7i3L2Y0/CNL8kd8CEhTMzwyoXekrzBM="
},
"userAgent": "userAgentPlaceholder"
}
}

如何查找任务创建所需的所有参数

自动方法

为了自动化获取所需参数,可以通过 浏览器(普通模式或 headless 模式,例如使用 Playwright)进行提取,或直接从 HTTP 请求中获取。由于动态参数的有效时间较短,建议在获取后尽快使用。

重要

所提供的代码片段仅作为获取必要参数的基础示例。具体实现方式取决于包含验证码的网站、本身的页面结构,以及所使用的 HTML 元素和选择器。

显示代码 (Node.js)
import { chromium } from "playwright";

const CAPTCHA_URL = "https://example.com";

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();

await page.goto(CAPTCHA_URL);

const captchaParams = await page.evaluate(() => {
const gokuProps = window.gokuProps || {};
const scripts = Array.from(document.querySelectorAll("script"));

return {
websiteKey: gokuProps.key || "未找到",
context: gokuProps.context || "未找到",
iv: gokuProps.iv || "未找到",
challengeScriptUrl:
scripts.find((script) => script.src.includes("challenge.js"))?.src ||
"未找到",
captchaScriptUrl:
scripts.find((script) => script.src.includes("captcha.js"))?.src ||
"未找到",
};
});

console.log("验证码参数:", captchaParams);

await browser.close();
})();

使用 SDK 库

显示代码(用于浏览器)
// https://github.com/ZennoLab/capmonstercloud-client-js

import { CapMonsterCloudClientFactory, ClientOptions, AmazonRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY"; // 输入您的 CapMonster Cloud API 密钥

document.addEventListener("DOMContentLoaded", async () => {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);

// 基本示例,无需代理
// CapMonster Cloud 会自动使用其代理
let amazonRequest = new AmazonRequest({
websiteURL: "https://example.com", // 受 AWS WAF 保护的页面 URL
websiteKey: "websiteKey",
// 替换为您自己的值
challengeScript: "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/challenge.js",
captchaScript: "https://41bcdd4fb3cb.610cd090.us-east-1.captcha.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/captcha.js",
context: "qoJYgnKsc...aormh/dYYK+Y=",
iv: "CgAAXFFFFSAAABVk",
cookieSolution: false
});

// 使用您自己的代理的示例
// 如果想使用自己的代理,请取消注释以下代码块
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};

amazonRequest = new AmazonRequest({
websiteURL: "https://example.com",
websiteKey: "websiteKey",
// 替换为您自己的值
challengeScript: "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/challenge.js",
captchaScript: "https://41bcdd4fb3cb.610cd090.us-east-1.captcha.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/captcha.js",
context: "qoJYgnKsc...aormh/dYYK+Y=",
iv: "CgAAXFFFFSAAABVk",
proxy,
userAgent: "userAgentPlaceholder",
cookieSolution: false
});
*/

// 如有必要,可以检查余额
const balance = await client.getBalance();
console.log("Balance:", balance);

const result = await client.Solve(amazonRequest);
console.log("Solution:", result);
});
显示代码 (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js

import { CapMonsterCloudClientFactory, ClientOptions, AmazonRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY"; // 输入您的 CapMonster Cloud API 密钥

async function solveAwsWaf() {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);

// 基本示例,无需代理
// CapMonster Cloud 会自动使用它们的代理
let amazonRequest = new AmazonRequest({
websiteURL: "https://example.com", // 受 AWS WAF 保护的页面 URL
websiteKey: "websiteKey",
// 替换为您自己的值
challengeScript: "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/challenge.js",
captchaScript: "https://41bcdd4fb3cb.610cd090.us-east-1.captcha.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/captcha.js",
context: "qoJYgnKsc...aormh/dYYK+Y=",
iv: "CgAAXFFFFSAAABVk",
cookieSolution: false
});

// 使用您自己的代理的示例
// 如果想使用自己的代理,请取消注释以下代码块

/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};

amazonRequest = new AmazonRequest({
websiteURL: "https://example.com", // 受 AWS WAF 保护的页面 URL
websiteKey: "websiteKey",
// 替换为您自己的值
challengeScript: "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/challenge.js",
captchaScript: "https://41bcdd4fb3cb.610cd090.us-east-1.captcha.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/captcha.js",
context: "qoJYgnKsc...aormh/dYYK+Y=",
iv: "CgAAXFFFFSAAABVk",
proxy,
userAgent: "userAgentPlaceholder",
cookieSolution: false
});
*/

// 如有必要,可以检查余额
const balance = await client.getBalance();
console.log("Balance:", balance);

const result = await client.Solve(amazonRequest);
console.log("Solution:", result);
}

solveAwsWaf().catch(console.error);