Amazon | AWS WAF Captcha и Challenge
Примеры заданий
Ниже представлены примеры типов заданий Amazon AWS WAF, которые на данный момент поддерживаются сервисом CapMonster Cloud:


Решение капчи и челленджа в AWS WAF
CapMonster Cloud по умолчанию работает через встроенные прокси — они уже включены в стоимость. Указывать собственные прокси требуется только в тех случаях, когда сайт не принимает токен или доступ к встроенным сервисам ограничен.
Если прокси с авторизацией по IP, то необходимо добавить адрес 65.21.190.34 в белый список.
Параметры запроса
ВАЖНО: значения некоторых параметров являеются динамическими, т.е. изменяются при каждом рендеринге страницы с Amazon (AWS WAF).
Извлекайте их непосредственно перед созданием задачи, чтобы избежать ошибок при решении. Примеры автоматического извлечения параметров см. в разделе Как найти все нужные параметры для создания задачи.
Вариант 1
type<string>requiredAmazonTask
websiteURL<string>requiredАдрес основной страницы, на которой решается капча.
websiteKey<string>requiredМожно найти в поле apiKey при рендеринге капчи.
Пример: h15hX7brbaRTR...Za1_1
captchaScript<string>requiredСсылка на jsapi.js на html странице, имеет вид <Integration URL\>jsapi.js
cookieSolution<boolean>optionalПо умолчанию false — в ответ вы получите "captcha_voucher" и "existing_token". Если вам требуются куки "aws-waf-token", то укажите значение true.
userAgent<string>optionalUser-Agent браузера. Используйте текущее значение, поддерживаемое CapMonster Cloud: userAgentPlaceholder
Получить актуальное значение можно по адресу: https://capmonster.cloud/api/useragent/actual.
proxyType<string>optionalhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>optionalIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>optionalПорт прокси.
proxyLogin<string>optionalЛогин прокси-сервера.
proxyPassword<string>optionalПароль прокси-сервера.
Вариант 2
type<string>requiredAmazonTask
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", то укажите значение true.
proxyType<string>optionalhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>optionalIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>optionalПорт прокси.
proxyLogin<string>optionalЛогин прокси-сервера.
proxyPassword<string>optionalПароль прокси-сервера.
Вариант 3
Если на сайте используется невидимая капча и загружается только challenge.js, используйте этот вариант. В этом случае передавать все параметры, как в варианте 2, не требуется — значения можно оставить пустыми. Передавайте только значение challenge.js.
type<string>requiredAmazonTask
websiteURL<string>requiredАдрес основной страницы, на которой решается капча.
challengeScript<string>requiredСсылка на challenge.js.
context<string>requiredУказывайте пустую строку.
iv<string>requiredУказывайте пустую строку.
cookieSolution<boolean>optionalУказывайте значение true для получения "aws-waf token".
proxyType<string>optionalhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>optionalIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>optionalПорт прокси.
proxyLogin<string>optionalЛогин прокси-сервера.
proxyPassword<string>optionalПароль прокси-сервера.
Как получить параметры websiteKey, context, iv и challengeScript
При переходе на сайт вы получаете ответ 405 и html страницу с капчей. Именно из неё можно извлечь все параметры:

Методы создания задачи
https://api.capmonster.cloud/createTask
Для пользователей из России также доступен:
https://ru.api.capmonster.cloud/createTask
Подробнее в разделе createTask.
Вариант 1
- AmazonTask (без прокси)
- AmazonTask (с прокси)
Пример запроса
{
"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
}
Пример запроса
{
"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,
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Пример ответа
{
"errorId": 0,
"taskId": 407533072
}
Вариант 2
- AmazonTask (без прокси)
- AmazonTask (с прокси)
Пример запроса
{
"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
}
Пример запроса
{
"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,
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Пример ответа
{
"errorId": 0,
"taskId": 407533072
}
Вариант 3
- AmazonTask (без прокси)
- AmazonTask (с прокси)
Пример запроса
{
"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
}
Пример запроса
{
"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,
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Пример ответа
{
"errorId": 0,
"taskId": 407533072
}
Метод получения результата задачи
Используйте метод getTaskResult, чтобы получить решение AmazonTask.
https://api.capmonster.cloud/getTaskResult
Для пользователей из России также доступен:
https://ru.api.capmonster.cloud/getTaskResult
Подробнее в разделе 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-элементов и селекторов.
- JavaScript
- Python
- C#
Показать код (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 || "Not found",
context: gokuProps.context || "Not found",
iv: gokuProps.iv || "Not found",
challengeScriptUrl:
scripts.find((script) => script.src.includes("challenge.js"))?.src ||
"Not found",
captchaScriptUrl:
scripts.find((script) => script.src.includes("captcha.js"))?.src ||
"Not found",
};
});
console.log("Captcha params:", captchaParams);
await browser.close();
})();
Показать код
import asyncio
from playwright.async_api import async_playwright
CAPTCHA_URL = "https://example.com"
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto(CAPTCHA_URL)
captcha_params = await page.evaluate("""
() => {
const gokuProps = window.gokuProps || {};
const scripts = Array.from(document.querySelectorAll('script'));
return {
websiteKey: gokuProps.key || "Not found",
context: gokuProps.context || "Not found",
iv: gokuProps.iv || "Not found",
challengeScriptUrl: scripts.find(script => script.src.includes('challenge.js'))?.src ||
"Not found",
captchaScriptUrl: scripts.find(script => script.src.includes('captcha.js'))?.src ||
"Not found"
};
}
""")
print("Captcha params:", captcha_params)
await browser.close()
asyncio.run(main())
Показать код
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Playwright;
class Program
{
public static async Task Main(string[] args)
{
const string CAPTCHA_URL = "https://example.com";
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
Headless = false
});
var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
await page.GotoAsync(CAPTCHA_URL);
var captchaParams = await page.EvaluateAsync<Dictionary<string, string>>(@"
(() => {
const gokuProps = window.gokuProps || {};
const scripts = Array.from(document.querySelectorAll('script'));
return {
websiteKey: gokuProps.key || 'Not found',
context: gokuProps.context || 'Not found',
iv: gokuProps.iv || 'Not found',
challengeScriptUrl: scripts.find(script => script.src.includes('challenge.js'))?.src ||
'Not found',
captchaScriptUrl: scripts.find(script => script.src.includes('captcha.js'))?.src ||
'Not found'
};
})()
");
Console.WriteLine("Captcha params:");
foreach (var param in captchaParams)
{
Console.WriteLine($"{param.Key}: {param.Value}");
}
await browser.CloseAsync();
}
}
Используйте библиотеку SDK
- JavaScript / TypeScript
- Python
- C#
Показать код (для браузера)
// https://github.com/CapMonsterCloud/capmonster-nodejs-captcha-solver
import {
CapMonsterCloudClientFactory,
ClientOptions,
AmazonRequest
} from "@zennolab_com/capmonstercloud-client";
document.addEventListener("DOMContentLoaded", async () => {
const API_KEY = "YOUR_API_KEY"; // Укажите ваш API-ключ CapMonster Cloud
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
let amazonRequest = new AmazonRequest({
websiteURL: "https://yourwebsite.com/page-with-aws-waf",
websiteKey: "your-website-key",
challengeScript: "your-challenge-script-url",
captchaScript: "your-captcha-script-url",
context: "your-context",
iv: "your-iv",
// Укажите false, чтобы получить existingToken и captchaVoucher
// Укажите true, чтобы получить cookies
cookieSolution: false,
});
// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password",
};
amazonRequest = new AmazonRequest({
websiteURL: "https://yourwebsite.com/page-with-aws-waf",
websiteKey: "your-website-key",
challengeScript: "your-challenge-script-url",
captchaScript: "your-captcha-script-url",
context: "your-context",
iv: "your-iv",
proxy,
userAgent: "userAgentPlaceholder",
// Укажите false, чтобы получить existingToken и captchaVoucher
// Укажите true, чтобы получить cookies
cookieSolution: false,
});
*/
// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);
const result = await client.Solve(amazonRequest);
console.log("Solution:", result.solution);
});
Показать код (Node.js)
// https://github.com/CapMonsterCloud/capmonster-nodejs-captcha-solver
const {
CapMonsterCloudClientFactory,
ClientOptions,
AmazonRequest,
} = require("@zennolab_com/capmonstercloud-client");
const API_KEY = "YOUR_API_KEY"; // Укажите ваш API-ключ CapMonster Cloud
async function solveAwsWaf() {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY }),
);
// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
let amazonRequest = new AmazonRequest({
websiteURL: "https://yourwebsite.com/page-with-aws-waf",
websiteKey: "your-website-key",
challengeScript: "your-challenge-script-url",
captchaScript: "your-captcha-script-url",
context: "your-context",
iv: "your-iv",
// Укажите false, чтобы получить existingToken и captchaVoucher
// Укажите true, чтобы получить cookies
cookieSolution: false,
});
// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password",
};
amazonRequest = new AmazonRequest({
websiteURL: "https://yourwebsite.com/page-with-aws-waf",
websiteKey: "your-website-key",
challengeScript: "your-challenge-script-url",
captchaScript: "your-captcha-script-url",
context: "your-context",
iv: "your-iv",
proxy,
userAgent: "userAgentPlaceholder",
// Укажите false, чтобы получить existingToken и captchaVoucher
// Укажите true, чтобы получить cookies
cookieSolution: false,
});
*/
// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);
const result = await client.Solve(amazonRequest);
console.log("Solution:", result.solution);
}
solveAwsWaf().catch(console.error);
Показать код
# https://github.com/CapMonsterCloud/capmonster-python-captcha-solver
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import AmazonWafRequest
# Импортируйте ProxyInfo, если планируете использовать собственный прокси
from capmonstercloudclient.requests.proxy_info import ProxyInfo
API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
async def solve_aws_waf():
client = CapMonsterClient(
options=ClientOptions(api_key=API_KEY)
)
# Базовый пример без прокси
# CapMonster Cloud автоматически использует собственные прокси
amazon_request = AmazonWafRequest(
websiteUrl="https://yourwebsite.com/page-with-aws-waf",
websiteKey="your-website-key",
challengeScript="your-challenge-script-url",
captchaScript="your-captcha-script-url",
context="your-context",
iv="your-iv",
# Укажите False, чтобы получить ExistingToken и CaptchaVoucher.
# Укажите True, чтобы получить Cookies.
cookieSolution=False,
)
# Пример с использованием вашего прокси
# Раскомментируйте этот блок, если хотите использовать свой прокси
"""
proxy = ProxyInfo(
proxyType="http",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password",
)
amazon_request = AmazonWafRequest(
websiteUrl="https://yourwebsite.com/page-with-aws-waf",
websiteKey="your-website-key",
challengeScript="your-challenge-script-url",
captchaScript="your-captcha-script-url",
context="your-context",
iv="your-iv",
proxy=proxy,
userAgent="userAgentPlaceholder",
# Укажите False, чтобы получить ExistingToken и CaptchaVoucher.
# Укажите True, чтобы получить Cookies.
cookieSolution=False,
)
"""
# При необходимости можно проверить баланс
balance = await client.get_balance()
print("Balance:", balance)
result = await client.solve_captcha(amazon_request)
print("Solution:", result)
asyncio.run(solve_aws_waf())
Показать код
// https://github.com/CapMonsterCloud/capmonster-dotnet-captcha-solver
using System;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Укажите ваш API-ключ CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY"
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
var amazonWafRequest = new AmazonWafRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-aws-waf",
WebsiteKey = "your-website-key",
ChallengeScript = "your-challenge-script-url",
CaptchaScript = "your-captcha-script-url",
Context = "your-context",
Iv = "your-iv",
// Укажите false, чтобы получить ExistingToken и CaptchaVoucher.
// Укажите true, чтобы получить Cookies.
CookieSolution = false
};
// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
amazonWafRequest = new AmazonWafRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-aws-waf",
WebsiteKey = "your-website-key",
ChallengeScript = "your-challenge-script-url",
CaptchaScript = "your-captcha-script-url",
Context = "your-context",
Iv = "your-iv",
// Укажите false, чтобы получить ExistingToken и CaptchaVoucher.
// Укажите true, чтобы получить Cookies.
CookieSolution = false,
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
*/
// При необходимости можно проверить баланс
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var amazonWafResult = await cmCloudClient.SolveAsync(amazonWafRequest);
// Для CookieSolution = false
Console.WriteLine("ExistingToken: " + amazonWafResult.Solution.ExistingToken);
Console.WriteLine("CaptchaVoucher: " + amazonWafResult.Solution.CaptchaVoucher);
// Для CookieSolution = true используйте:
// Console.WriteLine("Cookies: " + amazonWafResult.Solution.Cookies);
}
}
