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

Alibaba Cloud Captcha

Exemplos de tarefas

A seguir estão exemplos de tipos de tarefas do Alibaba CAPTCHA que atualmente são suportados pelo serviço CapMonster Cloud:

Slider CAPTCHA
Puzzle CAPTCHA
Image restoration CAPTCHA
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 requisição

type<string>required

CustomTask


class<string>required

alibaba


websiteURL<string>required

URL completo da página com o CAPTCHA.


sceneId (dentro de metadata)<string>required

Identificador do cenário do CAPTCHA, enviado no seguinte formato: "sceneId":"1ww7426c4" (veja a seção correspondente para saber como encontrar este valor)


prefix (dentro de metadata)<string>required

Parâmetro de inicialização do CAPTCHA, enviado na URL da requisição usada para carregar o texto da tarefa na página.
Por exemplo, se a URL for: https://dlw3kug.captcha-open.example.aliyuncs.com/, então o valor do parâmetro prefix corresponde ao subdomínio — dlw3kug.


Para alguns sites é necessário enviar parâmetros adicionais:

Utilize esses parâmetros apenas quando eles estiverem presentes no site (veja mais detalhes na seção Trabalhando com sites que contêm parâmetros estendidos).

userId (dentro de metadata)<string>optional

Identificador único do usuário ou da sessão no lado do site.


userUserId (dentro de metadata)<string>optional

Identificador adicional (secundário) do usuário.


verifyType (dentro de metadata)<string>optional

Versão ou tipo do mecanismo de verificação do captcha.


region (dentro de metadata)<string>optional

Região do servidor ou data center onde o captcha é processado.


UserCertifyId (dentro de metadata)<string>optional

ID único de verificação associado à sessão atual do captcha.


apiGetLib (dentro de metadata)<string>optional

Link para a biblioteca JS do captcha utilizada pelo site. O valor é gerado no lado do cliente e pode mudar dinamicamente a cada renderização da página.

userAgent<string>optional

User-Agent do navegador.
Utilize apenas um User-Agent atual do Windows. O recomendado é: userAgentPlaceholder


proxyType<string>optional

http - proxy padrão http/https;
https - tente essa opção se "http" não funcionar (necessário para alguns proxies personalizados);
socks4 - proxy socks4;
socks5 - proxy socks5.


proxyAddress<string>optional

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

  • uso de proxies transparentes (aqueles que revelam o IP do cliente);
  • uso de proxies locais.


proxyPort<integer>optional

Porta do proxy.


proxyLogin<string>optional

Login do proxy.


proxyPassword<string>optional

Senha do proxy.


Método de criação da tarefa

Variante padrão (sem parâmetros adicionais)

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

Requisição

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "alibaba",
"websiteURL": "https://www.example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"sceneId": "1ww7426c4",
"prefix": "dlw3kug"
}
}
}

Resposta

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

Variante com parâmetros estendidos (userId, userUserId, verifyType, etc.):

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

Requisição

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "alibaba",
"websiteURL": "https://www.example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"sceneId": "1ww7426c4",
"prefix": "dlw3kug",
"userId": "HpadJlQnz2zSKcSmjXBaqQvjYUvP4jMJIk/ZwGNDNiM=",
"userUserId": "/uSXKkVFuuwxXA21/MpXGxpLStWBEup1B3jjlMUWwNE=",
"verifyType": "1.0",
"region": "sgp",
"UserCertifyId": "0a03e59417757735511105780e2a5e",
"apiGetLib": "https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=2041"
}
}
}

Resposta

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

Método de obter resultado da tarefa

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

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

Requisição

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

Resposta

{
"errorId": 0,
"errorCode": null,
"errorDescription": null,
"status": "ready",
"solution": {
"data": {
"tokens": "{\"sceneId\":\"1ww7426c4\",\"certifyId\":\"kBjCxX2W2c\",\"deviceToken\":\"U0dfV0VCIzM3...wOGJkMjY=\",\"data\":\"JRMnX3B...EUQdCpLkqSj7THYNf3dn\"}"
}
}
}

Como encontrar todos os parâmetros necessários para criar uma tarefa

sceneId

O sceneId pode ser obtido após resolver o CAPTCHA com sucesso uma vez:

  1. Resolva o CAPTCHA manualmente no site.
  2. Abra o DevTools → aba Network.
  3. Encontre a requisição enviada após a verificação bem-sucedida (por exemplo: verify, check, validate).
  4. No Payload ou na Response, localize o parâmetro sceneId (CaptchaSceneId ou sId).

Este parâmetro também pode ser encontrado usando a busca nas requisições de rede:

  1. Abra a página com o CAPTCHA e vá para DevTools → aba Network.
  2. Use a busca (Ctrl + F) com a palavra-chave sceneId ou CaptchaSceneId.

prefix

O prefix pode ser obtido a partir da URL da requisição usada no site para carregar o texto da tarefa do CAPTCHA:

  1. Abra a página com o CAPTCHA.
  2. Encontre a requisição relacionada ao carregamento da tarefa (geralmente via DevToolsNetwork).


Trabalhando com sites que contêm parâmetros estendidos

Extração e preparação dos parâmetros de captcha

Esta seção descreve o processo geral de extração dos parâmetros necessários, resolução do captcha e reenvio da requisição de autenticação no site alvo.

  1. Requisição inicial de autenticação:
POST https://example.com/api/v2/auths/signin

Os dados do usuário são enviados:

{
"email": "[email protected]",
"password": "hashed_password"
}

Exemplos de headers estão disponíveis na seção Exemplos de resolução automática de captcha.

  1. Detecção da resposta do servidor. O servidor pode retornar dois tipos de resposta:
  • 2.1 JSON padrão (sem captcha):
{
"success": false,
"data": {
"code": "Bad_Request",
"details": "The email or password provided is incorrect..."
}
}

Isso significa que o captcha não é necessário e a requisição foi processada normalmente.

  • 2.2 Resposta com captcha (o servidor retorna uma página HTML em vez de JSON):
<!doctype html>
<meta charset="UTF-8">
<meta name="aliyun_waf_aa" content="...">
<meta name="aliyun_waf_bb" content="...">
...
  1. Dentro da página existe um objeto com os seguintes dados:
var requestInfo = {
data,
region,
sceneId,
token,
traceid,
type,
userId,
userUserId
}

Do objeto, devem ser extraídos os seguintes parâmetros usados para a resolução do captcha:

  • userId
  • userUserId
  • verifyType (corresponde a type)
  • region
  • UserCertifyId (corresponde a traceid)

Importante: além disso, é necessário armazenar os valores de autenticação token e traceid. Eles são usados nas requisições subsequentes de autenticação como u_atoken e u_asig, respectivamente.


  1. Exemplo de geração do link da biblioteca JS do captcha:
this.currentDate = new Date()

this.AliyunGeneratedDynamicJS =
`https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=${
this.currentDate.getFullYear() +
(this.currentDate.getMonth() + 1) +
this.currentDate.getDate() +
this.currentDate.getHours()
}`
  1. Construção de metadata e da requisição de resolução do captcha.

Esses dados são enviados ao nosso serviço de resolução de captcha:

{
"metadata": {
"sceneId": "1ww7426c4",
"prefix": "dlw3kug",
"userId": "HpadJlQnz2zSKcSmjXBaqQvjYUvP4jMJIk/ZwGNDNiM=",
"userUserId": "/uSXKkVFuuwxXA21/MpXGxpLStWBEup1B3jjlMUWwNE=",
"verifyType": "1.0",
"region": "sgp",
"UserCertifyId": "0a03e59417757735511105780e2a5e",
"apiGetLib": "https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=2041"
}
}
  1. Obtenção da solução do captcha e reenvio da requisição de autenticação com os parâmetros u_atoken e u_asig previamente salvos:
POST https://example.com/api/v2/auths/signin?u_atoken=...&u_asig=...&u_aref=undefined

Em caso de sucesso na resolução do captcha, o servidor retorna o resultado da autenticação (ver ponto 2.1).

Exemplos de resolução automática de captcha

Importante

Os exemplos são apenas demonstrativos e mostram a lógica geral de funcionamento do seu site que utiliza proteção Alibaba Cloud Captcha. Em projetos reais, o código pode precisar de adaptação para um site específico, seus endpoints e headers.

Dados sensíveis (API keys, configurações de proxy, etc.) devem ser armazenados em .env ou em variáveis de ambiente.

Mostrar código (Node.js)
import "dotenv/config";
import fs from "fs";

import { gotScraping } from "got-scraping";

function parse(text, start, end, isJson = true) {
const startIndex = text.indexOf(start);
if (startIndex === -1) return null;

const contentStart = startIndex + start.length;
const endIndex = text.indexOf(end, contentStart);
if (endIndex === -1) return null;

let extracted = text.substring(contentStart, endIndex).trim();

extracted = extracted.replace(/\n/g, "").trim();

let jsonStr = extracted
.replace(/(['"])?([a-zA-Z0-9_]+)(['"])?:/g, '"$2":')
.replace(/'/g, '"');

try {
return isJson ? JSON.parse(jsonStr) : jsonStr;
} catch (err) {
console.error("Não foi possível fazer o parse do JSON:", err.message);
console.error("Tentativa de parse:", jsonStr);
return null;
}
}

function buildProxyLine(proxyUrl) {
if (!proxyUrl) return undefined;

const parts = proxyUrl.split(":");

// Tratamento do formato protocol:ip:port (3 partes)
if (parts.length === 3) {
const [protocol, ip, port] = parts;
return { proxyLine: `${protocol}://${ip}:${port}`, protocol, ip, port };
}

// Tratamento do formato protocol:username:password:ip:port (5 partes)
if (parts.length === 5) {
const [protocol, username, password, ip, port] = parts;
return {
proxyLine: `${protocol}://${username}:${password}@${ip}:${port}`,
protocol,
ip,
port,
username,
password,
};
}

// Formato inválido
return undefined;
}

const proxyUrl =
process.env.proxyUrl || "http:username:password:127.0.0.1:9029"; // Substitua pelos dados do seu proxy ou defina no arquivo .env
const proxyLine = buildProxyLine(proxyUrl);
const delay = (ms) => new Promise((res) => setTimeout(res, ms));

class Worker {
constructor() {
this.providerVendorSolverUrl = "https://api.capmonster.cloud";
this.API_KEY = process.env.apiKey || "YOUR_API_KEY"; // Substitua pela sua API key do CapMonster Cloud

this.currentDate = new Date();
// Aqui é gerado o link dinâmico da biblioteca JS do captcha
this.AliyunGeneratedDynamicJS = `https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=${this.currentDate.getFullYear() + (this.currentDate.getMonth() + 1) + this.currentDate.getDate() + this.currentDate.getHours()}`;

this.websiteUrl = "https://example.com/auth"; // Substitua pela URL da página com captcha
this.userAgent =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
}

async executor() {
console.log(`Obtendo parâmetros do captcha....`);

const RequireAuthorizationResponses =
await this.getAuthorizationResponses();

console.log("Páginas com captcha recebidas com sucesso");

const requireParamsCaptchas = await this.requireParamsCaptchasData(
RequireAuthorizationResponses,
);

console.log(`Parâmetros do captcha: `, requireParamsCaptchas);

const AlibabaSolvedResult = await this.requireAlibabaSolverResponse(
requireParamsCaptchas,
);

console.log(
`Resultado da resolução do captcha: `,
AlibabaSolvedResult?.solution?.data?.tokens,
);

const RequireAuthorizationResponsesAfterCaptchaBypass =
await this.sendAuthrozationsRequest();

console.log(RequireAuthorizationResponsesAfterCaptchaBypass);
}

async sendAuthrozationsRequest() {
const response = await gotScraping.post(
`https://example.com/api/v2/auths/signin?u_atoken=${this.AuthorizationParams.u_atoken}&u_asig=${this.AuthorizationParams.u_asig}&u_aref=undefined`,
{
body: JSON.stringify({
email: "[email protected]",
password:
"e2577eeb61dc2197dfe94816d731f2941ccd0b66de8dc97aacb377bfe8476970",
}),
headers: {
Accept: "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "en-US,en;q=0.9",
"Content-Type": "application/json",
Origin: "https://example.com",
Pragma: "no-cache",
Referer: "https://example.com/auth",
Timezone: "Thu Apr 09 2026 23:29:23 GMT+0300",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
Version: "0.2.36",
"X-Request-Id": "2b4a7a52-d273-4049-a826-156aae856fe5",
"bx-v": "2.5.36",
"sec-ch-ua":
'"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
source: "web",
},
},
);

return response.body;
}

async getAuthorizationResponses() {
const response = await gotScraping.post(
`https://example.com/api/v2/auths/signin`, // Substitua pela URL correta de autenticação que aciona o captcha
{
body: JSON.stringify({
email: "[email protected]",
password:
"e2577eeb61dc2197dfe94816d731f2941ccd0b66de8dc97aacb377bfe8476970",
}),
headers: {
Accept: "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "en-US,en;q=0.9",
"Content-Type": "application/json",
Origin: "https://example.com", // Substitua pelo Origin correto do site
Pragma: "no-cache",
Referer: "https://example.com/auth", // Substitua pelo Referer correto do site
Timezone: "Thu Apr 09 2026 23:29:23 GMT+0300",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
Version: "0.2.36",
"X-Request-Id": "2b4a7a52-d273-4049-a826-156aae856fe5",
"bx-v": "2.5.36",
"sec-ch-ua":
'"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
source: "web",
},
},
);

if (response.body.includes("requestInfo")) {
console.log("Resposta com captcha recebida com sucesso:");
fs.writeFileSync("./baseResponse.txt", response.body);
console.log(response.body.substring(0, 150));
return response.body;
}

console.log(response.body);
return await this.getAuthorizationResponses();
}

async requireAlibabaSolverResponse(captchaMetadataParams) {
let cmReqData = {
type: "CustomTask",
class: "alibaba",
websiteURL: this.websiteUrl,
websiteKey: "customTask",
userAgent: this.userAgent,
};

if (captchaMetadataParams) {
cmReqData.metadata = captchaMetadataParams;
}

const response = await gotScraping.post(
`${this.providerVendorSolverUrl}/createTask`,
{
body: JSON.stringify({ clientKey: this.API_KEY, task: cmReqData }),
headers: {
"Content-Type": "application/json",
},
},
);

let JSON_responseData = JSON.parse(response.body);

if (JSON_responseData.errorId) throw new Error("JSON.TaskId.error");

let taskId = JSON_responseData.taskId;
let responseData;

while (true) {
let cmTaskRes = { clientKey: this.API_KEY, taskId: taskId };

let task_response = await gotScraping.post(
`${this.providerVendorSolverUrl}/getTaskResult`,
{
body: JSON.stringify(cmTaskRes),
headers: {
"Content-Type": "application/json",
},
},
);

let JSON_responseDataTaskResponse = JSON.parse(task_response.body);

if (JSON_responseDataTaskResponse.status !== "processing") {
responseData = JSON_responseDataTaskResponse;
break;
}

await delay(5000);
}

return responseData;
}

async requireParamsCaptchasData(responsesCaptchaPage) {
const JsonData = parse(
responsesCaptchaPage,
':none">var requestInfo = ',
";",
true,
);

// Salve os parâmetros de autorização para uso posterior na nova requisição de login
this.AuthorizationParams = {
u_atoken: JsonData.token,
u_asig: JsonData.traceid,
};

return {
prefix: "57d98d02303c01e7d2f7814c75224396",
sceneId: JsonData.sceneId,
userId: JsonData.userId,
userUserId: JsonData.userUserId,
verifyType: "1.0",
region: JsonData.region,
UserCertifyId: JsonData.traceid,
apiGetLib: this.AliyunGeneratedDynamicJS,
};
}
}

new Worker().executor();