Pular para o conteúdo principal
Está tendo problemas para obter o token?
Entre em contato com o suporte

Amazon | AWS WAF Captcha e Challenge

Exemplos de tarefas

Resolvendo CAPTCHA e Challenge no AWS WAF

Mais sobre o tema em nosso blog
Atenção!

O CapMonster Cloud, por padrão, funciona com proxies integrados — já incluídos no custo do serviço. É necessário especificar seus próprios proxies apenas nos casos em que o site não aceita o token ou quando o acesso aos serviços integrados está restrito.

Se o proxy utiliza autenticação por IP, é necessário adicionar o endereço 65.21.190.34 à lista de permissões (whitelist).

Parâmetros da solicitação

Opção 1

type<string>required

AmazonTask


websiteURL<string>required

Endereço da página principal onde o captcha é resolvido.


websiteKey<string>required

Pode ser encontrado no campo apiKey durante a renderização do captcha.


captchaScript<string>required

Link para o jsapi.js na página HTML, tem a forma <Integration URL>/jsapi.js.


cookieSolution<boolean>optional

O padrão é false — na resposta você receberá "captcha_voucher" e "existing_token".
Se precisar do cookie "aws-waf-token", defina como true.


userAgent<string>optional

User-Agent do navegador.
Transmita apenas o UA atual do sistema operacional Windows. No momento, o válido é: userAgentPlaceholder


proxyType<string>optional

http - proxy http/https padrão;
https - use esta opção apenas se "http" não funcionar (necessário para alguns proxies customizados);
socks4 - proxy socks4;
socks5 - proxy socks5.


proxyAddress<string>optional

Endereço IPv4/IPv6 do proxy. Não é permitido:

  • proxies transparentes (onde o IP do cliente pode ser visto);
  • uso de proxies em máquinas locais.


proxyPort<integer>optional

Porta do proxy.


proxyLogin<string>optional

Usuário do servidor proxy.


proxyPassword<string>optional

Senha do servidor proxy.


Opção 2

type<string>required

AmazonTask


websiteURL<string>required

O endereço da página principal onde o captcha é resolvido.


challengeScript<string>required

Link para o challenge.js (veja a descrição abaixo).


websiteKey<string>required

Uma string que pode ser obtida a partir da página HTML do captcha ou via JavaScript: window.gokuProps.key.


context<string>required

Uma string que pode ser obtida a partir da página HTML do captcha ou via JavaScript: window.gokuProps.context.


iv<string>required

Uma string que pode ser obtida a partir da página HTML do captcha ou via JavaScript: window.gokuProps.iv.


captchaScript<string>optional

Link para o captcha.js (pode estar ausente se houver apenas um challenge).


cookieSolution<boolean>optional

O padrão é false — na resposta você receberá "captcha_voucher" e "existing_token".
Se precisar do cookie "aws-waf-token", defina como true.


proxyType<string>optional

http - proxy http/https padrão;
https - use esta opção apenas se "http" não funcionar (necessário para alguns proxies customizados);
socks4 - proxy socks4;
socks5 - proxy socks5.


proxyAddress<string>optional

Endereço IPv4/IPv6 do proxy. Não é permitido:

  • proxies transparentes (onde o IP do cliente pode ser visto);
  • uso de proxies em máquinas locais.


proxyPort<integer>optional

Porta do proxy.


proxyLogin<string>optional

Usuário do servidor proxy.


proxyPassword<string>optional

Senha do servidor proxy.


Opção 3

Se o site usa um captcha invisível e somente challenge.js é carregado, use esta opção.
Nesse caso, não é necessário enviar todos os parâmetros da opção 2 — eles podem ficar vazios. Envie apenas o valor de challenge.js.

type<string>required

AmazonTask


websiteURL<string>required

Endereço da página principal onde o captcha é resolvido.


challengeScript<string>required

Link para o challenge.js.


captchaScript<string>required

Link para o captcha.js. Nesta opção, informe qualquer string.


websiteKey<string>required

Informe qualquer string.


context<string>required

Informe qualquer string.


iv<string>required

Informe qualquer string.


cookieSolution<boolean>optional

Defina como true para obter o "aws-waf token".


proxyType<string>optional

http - proxy http/https padrão;
https - use esta opção apenas se "http" não funcionar (necessário para alguns proxies customizados);
socks4 - proxy socks4;
socks5 - proxy socks5.


proxyAddress<string>optional

Endereço IPv4/IPv6 do proxy. Não é permitido:

  • proxies transparentes (onde o IP do cliente pode ser visto);
  • uso de proxies em máquinas locais.


proxyPort<integer>optional

Porta do proxy.


proxyLogin<string>optional

Usuário do servidor proxy.


proxyPassword<string>optional

Senha do servidor proxy.


Como obter os parâmetros websiteKey, context, iv e challengeScript

Ao navegar até o site, você recebe uma resposta 405 e uma página HTML com o captcha. É possível extrair todos os parâmetros dessa página:

Métodos de criação de tarefa

Opção 1

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

Requisição

{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com/index.html",
"websiteKey": "h15hX7brbaRTR...Za1_1",
"userAgent": "userAgentPlaceholder",
"captchaScript": "https://234324vgvc23.yejk.captcha-sdk.awswaf.com/234324vgvc23/jsapi.js",
"cookieSolution": true
}
}

Resposta

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

Opção 2

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

Requisição

{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com",
"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",
"websiteKey": "AQIDA...wZwdADFLWk7XOA==",
"context": "qoJYgnKsc...aormh/dYYK+Y=",
"iv": "CgAAXFFFFSAAABVk",
"cookieSolution": true
}
}

Resposta

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

Opção 3

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

Requisição

{
"clientKey": "API_KEY",
"task": {
"type": "AmazonTask",
"websiteURL": "https://example.com",
"challengeScript": "https://41bcdd4fb3cb.610cd090.us-east-1.token.awswaf.com/41bcdd4fb3cb/0d21de737ccb/cd77baa6c832/challenge.js",
"captchaScript": "",
"websiteKey": "",
"context": "",
"iv": "",
"cookieSolution": true
}
}

Resposta

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

Obter o resultado da tarefa

Use o método getTaskResult para obter a solução do AmazonTask.

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

Solicitação

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

Resposta

{
"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"
}
}

Como encontrar todos os parâmetros necessários para a criação da tarefa

Automaticamente

Para automatizar a extração dos parâmetros, eles podem ser obtidos via navegador (normal ou headless, por exemplo, usando Playwright) ou diretamente a partir de requisições HTTP. Como os valores dos parâmetros dinâmicos têm curta duração, recomenda-se utilizá-los imediatamente após a extração.

Importante!

Os trechos de código fornecidos são exemplos básicos para aprendizado sobre como extrair os parâmetros necessários. A implementação exata dependerá do seu site com captcha, sua estrutura e os elementos HTML e seletores utilizados.

Mostrar código (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 || "Não encontrado",
context: gokuProps.context || "Não encontrado",
iv: gokuProps.iv || "Não encontrado",
challengeScriptUrl:
scripts.find((script) => script.src.includes("challenge.js"))?.src ||
"Não encontrado",
captchaScriptUrl:
scripts.find((script) => script.src.includes("captcha.js"))?.src ||
"Não encontrado",
};
});

console.log("Parâmetros do Captcha:", captchaParams);

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

Usar biblioteca SDK

Mostrar Código (para navegador)
// https://github.com/ZennoLab/capmonstercloud-client-js

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

const API_KEY = "YOUR_API_KEY"; // Insira sua chave de API do CapMonster Cloud

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

// Exemplo básico sem proxy
// O CapMonster Cloud usa automaticamente seus próprios proxies
let amazonRequest = new AmazonRequest({
websiteURL: "https://example.com", // URL da página protegida pelo AWS WAF
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
});

// Exemplo de uso do seu próprio proxy
// Descomente este bloco se quiser usar um proxy personalizado
/*
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
});
*/

// Se necessário, você pode verificar o saldo
const balance = await client.getBalance();
console.log("Balance:", balance);

const result = await client.Solve(amazonRequest);
console.log("Solution:", result);
});
Mostrar Código (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js

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

const API_KEY = "YOUR_API_KEY"; // Insira sua chave de API do CapMonster Cloud

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

// Exemplo básico sem proxy
// O CapMonster Cloud usa automaticamente seus próprios proxies
let amazonRequest = new AmazonRequest({
websiteURL: "https://example.com", // URL da página protegida pelo AWS WAF
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
});

// Exemplo de uso do seu próprio proxy
// Descomente este bloco se quiser usar um proxy personalizado

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

amazonRequest = new AmazonRequest({
websiteURL: "https://example.com", // URL da página protegida pelo AWS WAF
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
});
*/

// Se necessário, você pode verificar o saldo
const balance = await client.getBalance();
console.log("Balance:", balance);

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

solveAwsWaf().catch(console.error);