Перейти к основному содержимому
Возникают проблемы с получением токена?
Свяжитесь с поддержкой

Alibaba Cloud Captcha

Примеры заданий

Ниже представлены примеры типов заданий Alibaba Captcha, которые на данный момент поддерживаются сервисом CapMonster Cloud:

Puzzle
Image restoration
Click
Slider
Checkbox
Внимание!

CapMonster Cloud по умолчанию работает через встроенные прокси — они уже включены в стоимость. Указывать собственные прокси требуется только в тех случаях, когда сайт не принимает токен или доступ к встроенным сервисам ограничен.

Если прокси с авторизацией по IP, то необходимо добавить адрес 65.21.190.34 в белый список.

Параметры запроса

type<string>required

CustomTask


class<string>required

alibaba


websiteURL<string>required

Полный URL страницы с капчей.


sceneId (внутри metadata)<string>required

Идентификатор сценария капчи, передаётся в следующем формате: "sceneId":"1ww7426c4"значение указано в качестве примера.
Используйте собственное значение — инструкции по его получению приведены в соответствующем разделе


prefix (внутри metadata)<string>required

Параметр инициализации капчи, передаётся в URL запроса, используемого для загрузки текста задания на странице.
Например, если URL имеет вид: https://dlw3kug.captcha-open.example.aliyuncs.com/, то значение параметра prefix соответствует поддомену — dlw3kug.


Для некоторых сайтов требуется передавать дополнительные параметры:

Указывайте данные параметры только при их наличии на сайте (см. подробнее в разделе Работа с сайтами, содержащими расширенные параметры).

userId (внутри metadata)<string>optional

Уникальный идентификатор пользователя или сессии на стороне сайта.
Пример: HpadJlQnz2zSKcSmjXBaqQvjYUvP4jMJIk/ZwGNDNiM=


userUserId (внутри metadata)<string>optional

Дополнительный (вторичный) идентификатор пользователя.
Пример: /uSXKkVFuuwxXA21/MpXGxpLStWBEup1B3jjlMUWwNE=


verifyType (внутри metadata)<string>optional

Версия или тип механизма проверки капчи.
Пример: 1.0


region (внутри metadata)<string>optional

Регион сервера или дата-центра, через который обрабатывается капча.
Пример: sgp


UserCertifyId (внутри metadata)<string>optional

Уникальный ID проверки, связанный с текущей сессией капчи.
Пример: 0a03e59417757735511105780e2a5e


apiGetLib (внутри metadata)<string>optional

Ссылка на JS-библиотеку капчи, используемую сайтом. Значение формируется на стороне клиента и может генерироваться динамически при каждом рендеринге страницы.
Пример: https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=2041


punishUrl (внутри metadata)<string>optional

Полная ссылка на страницу проверки, полученная от целевого сайта.

Параметр используется для сайтов, где Alibaba возвращает отдельную ссылку /punish для прохождения проверки. Передавайте ссылку полностью, включая параметры запроса.

Пример: https://example.com:443//api/example/testlogin/_____tmd_____/punish?x5secdata=xgf6888e6c4d5d8115ka6bba95967ab87aa13767f97ccadf409d1782833032a-388365139a1244837524abakc3dafclick33ba7696f04104647438bcba5be532d2833__bx__example.com:443/api/example/testlogin/&x5step=2&action=captchaclick&pureCaptcha=

Инструкции по получению ссылки см. в разделе Как найти все нужные параметры для создания задачиpunishUrl.


cookieRequired (внутри metadata)<boolean>optional

Возвращает cookies вместе с результатом решения CAPTCHA.

Используйте значение true только для сайтов, использующих Alibaba WAF или Amazon WAF, где после успешного прохождения проверки требуется получить cookies.

По умолчанию параметр не используется.


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

IP адрес прокси IPv4/IPv6. Не допускается:

  • использование прозрачных прокси (там где можно видеть IP клиента);
  • использование прокси на локальных машинах.


proxyPort<integer>optional

Порт прокси.


proxyLogin<string>optional

Логин прокси-сервера.


proxyPassword<string>optional

Пароль прокси-сервера.


Метод создания задачи

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

Альтернативный адрес метода

Для пользователей из России также доступен:

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

Подробнее в разделе createTask.

Обычный вариант (без дополнительных параметров)

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "alibaba",
"websiteURL": "https://www.example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"sceneId": "your-scene-id",
"prefix": "your-prefix"
}
}
}

Пример ответа

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

Вариант с расширенными параметрами (userId, userUserId, verifyType и др.):

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "alibaba",
"websiteURL": "https://www.example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"sceneId": "your-scene-id",
"prefix": "your-prefix",
"userId": "your-user-id",
"userUserId": "your-user-user-id",
"verifyType": "your-verify-type",
"region": "your-region",
"UserCertifyId": "your-user-certify-id",
"apiGetLib": "https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=2041"
}
}
}

Пример ответа

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

Вариант с punishUrl

На некоторых сайтах с защитой Alibaba проверка вызывается через отдельную ссылку /punish. В этом случае передайте полученный URL в параметре punishUrl (внутри metadata).

Внутри Alibaba Punish могут использоваться такие варианты проверок, как выбор подходящих изображений или слайдер.

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "alibaba",
"websiteURL": "https://www.example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"punishUrl": "https://example.com/_____tmd_____/punish?x5secdata=your-x5secdata&x5step=2"
}
}
}

Пример ответа

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

Вариант с возвратом cookies (cookieRequired)

Для некоторых сайтов, использующих Alibaba WAF или Amazon WAF, после успешного решения необходимо получить cookies, которые затем используются при последующих запросах.

Для этого добавьте в объект metadata параметр:

{
"cookieRequired": true
}

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "alibaba",
"websiteURL": "https://example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"prefix": "your-prefix",
"sceneId": "your-scene-id",
"userId": "your-user-id",
"userUserId": "your-user-user-id",
"verifyType": "1.0",
"region": "sgp",
"UserCertifyId": "your-user-certify-id",
"apiGetLib": "https://o.example.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js?t=2041",
"cookieRequired": true
}
}
}

Пример ответа

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

Метод получения результата задачи

Используйте метод getTaskResult, чтобы получить решение Alibaba CAPTCHA.

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

Альтернативный адрес метода

Для пользователей из России также доступен:

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

Подробнее в разделе getTaskResult.

Пример запроса

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

Пример ответа

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

Если в запросе было указано "cookieRequired": true, ответ дополнительно содержит cookies, сгруппированные по доменам. Это также относится к задачам с punishUrl. Используйте cookies из объекта solution.domains при последующих запросах к соответствующему домену вместе с результатом решения CAPTCHA.

Пример ответа

{
"errorId": 0,
"errorCode": null,
"errorDescription": null,
"status": "ready",
"solution": {
"domains": {
"example.com": {
"cookies": {
"arms_uid": "23906d34-14da-4ddb-b651-b4d72d5376e1",
"sca": "ec12103d",
"atpsida": "b8cd8cc0185b...1196_1",
"cna": "vJsNIxNBKGMCAax0zMDiXVu1",
"cbc": "T2gAde24vOm4...wkkwYA=",
"x5sec": "7b2274223a...227d",
"tfstk": "gPEnRZi0vyuB...ECvCA."
}
}
}
}
}

Как найти все нужные параметры для создания задачи

sceneId

Можно получить после одного успешного прохождения капчи:

  1. Пройдите капчу вручную на сайте.
  2. Откройте DevTools → вкладка Network.
  3. Найдите запрос, отправляемый после успешного решения (например: verify, check, validate).
  4. В Payload или Response найдите параметр sceneId (CaptchaSceneId или sId).

Также данный параметр можно найти с помощью поиска по сетевым запросам:

  1. Откройте страницу с капчей, перейдите в DevTools → вкладка Network.
  2. Выполните поиск (Ctrl + F) по ключу sceneIdили CaptchaSceneId.


prefix

Можно получить из URL запроса, который используется на сайте для передачи текста задания капчи:

  1. Откройте страницу с капчей.
  2. Найдите запрос, связанный с загрузкой задания (обычно через DevToolsNetwork).



punishUrl

punishUrl — это URL проверки Alibaba, который возвращается при срабатывании защиты на целевом сайте.

Обычно такой URL можно получить из сетевого запроса, в ответе которого присутствует ошибка:

FAIL_SYS_USER_VALIDATE

Получение через DevTools

  1. Откройте целевую страницу и выполните действие, которое вызывает проверку Alibaba.
  2. Откройте DevToolsNetwork.
  3. Найдите запрос, отправленный в момент срабатывания защиты. Для поиска можно ориентироваться на ответ с ошибкой FAIL_SYS_USER_VALIDATE.
  4. Откройте найденный запрос и перейдите на вкладку Preview. В ответе найдите поле data — оно содержит URL проверки, который необходимо использовать как punishUrl.


  1. Также целевой URL можно найти во вкладке Response.


  1. Скопируйте URL полностью и передайте его в параметре punishUrl (внутри metadata) при создании задачи.

Полученный URL должен содержать порт (например, 443), путь _____tmd_____/punish, а также параметры x5secdata, x5step, action и pureCaptcha.

Формат ссылки:

https://example.com:443//api/example/testlogin/_____tmd_____/punish?x5secdata=xgf6888e6c4d5d8115ka6bba95967ab87aa13767f97ccadf409d1782833032a-388365139a1244837524abakc3dafclick33ba7696f04104647438bcba5be532d2833__bx__example.com:443/api/example/testlogin/&x5step=2&action=captchaclick&pureCaptcha=

Автоматическое получение punishUrl

punishUrl также можно получить программно одним из следующих способов:

  • через HTTP-запросы — если известны URL API, метод, header и другие параметры запроса;
  • через Playwright — если необходимо отследить запрос непосредственно в браузере.

В некоторых случаях сначала возвращается промежуточный URL с x5secdata и x5step, а после его обработки — итоговый punishUrl с параметрами action и pureCaptcha.

Для HTTP-запросов используйте параметры фактического запроса целевого сайта. В браузерном сценарии укажите нужную страницу и выполните действие, вызывающее Alibaba Punish.

Важно

Примеры показывают общий принцип получения punishUrl. Замените URL, headers и другие значения на актуальные данные целевого сайта.

Показать код (через HTTP-запросы)
const USER_AGENT =
"userAgentPlaceholder";

const TIMEOUT = 30000;

/* ================= НАСТРОЙКИ ЗАПРОСА ================= */
// Все значения ниже приведены как пример
// Укажите параметры фактического запроса целевого сайта
// При необходимости добавьте дополнительные headers, например origin, referer и accept-language

const REQUEST_CONFIG = {
pageUrl: "https://example.com/login",

url: "https://api.example.com/login?fromSite=example&appName=example-app",

method: "POST",

// Query-параметры запроса, например: логин, email,
// номер телефона или другие значения
params: {
value: "example"
},

headers: {
accept: "application/json, text/plain, */*",
"content-type": "application/json",
"user-agent": USER_AGENT,
origin: "https://example.com",
referer: "https://example.com/login",
},
};

/* ================= ОБЩАЯ ЛОГИКА ================= */

function isPunishUrl(url) {
return typeof url === "string" && url.includes("_____tmd_____/punish");
}

function hasParam(url, name) {
try {
return new URL(url).searchParams.has(name);
} catch {
return false;
}
}

function isFinalPunishUrl(url) {
return (
isPunishUrl(url) &&
["x5secdata", "x5step", "action", "pureCaptcha"].every((name) =>
hasParam(url, name),
)
);
}

function cookiesToHeader(cookies = {}) {
return Object.entries(cookies)
.map(([name, value]) => `${name}=${value}`)
.join("; ");
}

function extractFromHtml(html, baseUrl) {
const match = html.match(
/(?:["']url["']\s*:\s*["']([^"']+)["'])|(https?:\/\/[^\s"'<>]+\/_____tmd_____\/punish\?[^\s"'<>]+)/i,
);

if (!match) {
return null;
}

const value = (match[1] || match[2])
.replace(/\\\//g, "/")
.replace(/&amp;/g, "&")
.replace(/&#x3D;|&#61;/gi, "=");

try {
const url = new URL(value, baseUrl).href;
return isPunishUrl(url) ? url : null;
} catch {
return null;
}
}

async function extractPunishUrl(response) {
const text = await response.text();

try {
const url = JSON.parse(text)?.data?.url;

if (isPunishUrl(url)) {
return url;
}
} catch {}

return extractFromHtml(text, response.url);
}

async function sendRequest(config) {
const url = new URL(config.url);

for (const [name, value] of Object.entries(config.params || {})) {
if (value != null) {
url.searchParams.set(name, value);
}
}

const headers = {
...(config.headers || {}),
};

const cookie = cookiesToHeader(config.cookies);

if (cookie) {
headers.cookie = cookie;
}

const method = (config.method || "GET").toUpperCase();

const options = {
method,
headers,
signal: AbortSignal.timeout(TIMEOUT),
};

if (method !== "GET" && method !== "HEAD") {
if (config.json != null) {
options.body = JSON.stringify(config.json);
} else if (config.data != null) {
options.body = config.data;
}
}

const response = await fetch(url, options);

if (!response.ok) {
throw new Error(`HTTP ${response.status} ${response.statusText}`);
}

return response;
}

async function resolvePunishUrl(response, config, maxSteps = 3) {
const visited = new Set();

for (let step = 0; step < maxSteps; step++) {
const punishUrl = await extractPunishUrl(response);

if (!punishUrl) {
throw new Error("punishUrl не найден в ответе");
}

if (visited.has(punishUrl)) {
throw new Error("Обнаружен повторяющийся punishUrl");
}

visited.add(punishUrl);

if (isFinalPunishUrl(punishUrl)) {
return punishUrl;
}

const headers = {
accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"user-agent": USER_AGENT,
referer: config.pageUrl,
};

const cookie = cookiesToHeader(config.cookies);

if (cookie) {
headers.cookie = cookie;
}

response = await fetch(punishUrl, {
headers,
signal: AbortSignal.timeout(TIMEOUT),
});

if (!response.ok) {
throw new Error(`HTTP ${response.status} ${response.statusText}`);
}
}

throw new Error("Не удалось получить итоговый punishUrl");
}

async function main() {
try {
const response = await sendRequest(REQUEST_CONFIG);

const punishUrl = await resolvePunishUrl(response, REQUEST_CONFIG);

console.log("Итоговый punishUrl:");
console.log(punishUrl);
} catch (error) {
console.error("Не удалось получить punishUrl:");
console.error(error.message);
}
}

main();
Показать код (через Playwright)
const { chromium } = require("playwright");

// Страница, на которой используется Alibaba Punish
const PAGE_URL = "https://example.com/";

const TIMEOUT = 180000;

function isPunishUrl(url) {
return (
typeof url === "string" &&
url.includes("_____tmd_____/punish")
);
}

function hasParam(url, name) {
try {
return new URL(url).searchParams.has(name);
} catch {
return false;
}
}

function isFinalPunishUrl(url) {
return (
isPunishUrl(url) &&
hasParam(url, "x5secdata") &&
hasParam(url, "x5step") &&
hasParam(url, "action") &&
hasParam(url, "pureCaptcha")
);
}

function addHttpsPort(url) {
if (
typeof url !== "string" ||
!url.startsWith("https://")
) {
return url;
}

if (/^https:\/\/[^/]+:\d+(?:\/|$)/i.test(url)) {
return url;
}

return url.replace(
/^https:\/\/([^/]+)/i,
"https://$1:443"
);
}

function waitForPunishUrl(page) {
return new Promise((resolve, reject) => {
let finalPunishUrl = null;

const timer = setTimeout(() => {
cleanup();

reject(
new Error(
"Итоговый punishUrl не найден"
)
);
}, TIMEOUT);

function cleanup() {
clearTimeout(timer);

page.off("request", onRequest);
page.off("response", onResponse);
}

function processUrl(url) {
if (
finalPunishUrl ||
!isFinalPunishUrl(url)
) {
return;
}

finalPunishUrl =
addHttpsPort(url);

cleanup();
resolve(finalPunishUrl);
}

function onRequest(request) {
processUrl(
request.url()
);
}

function onResponse(response) {
processUrl(
response.url()
);
}

page.on("request", onRequest);
page.on("response", onResponse);
});
}

async function main() {
const browser = await chromium.launch({
headless: false,
});

const context =
await browser.newContext();

const page =
await context.newPage();

const punishUrlPromise =
waitForPunishUrl(page);

await page.goto(
PAGE_URL,
{
waitUntil: "domcontentloaded",
}
);

console.log(
"Выполните действие на странице, которое вызывает проверку Alibaba"
);

try {
const punishUrl =
await punishUrlPromise;

console.log(
"Итоговый punishUrl:"
);

console.log(punishUrl);
} catch (error) {
console.error(
"Не удалось получить punishUrl:"
);

console.error(
error.message
);
}

await browser.close();
}

main().catch(console.error);

Работа с сайтами, содержащими расширенные параметры

Извлечение и подготовка параметров капчи

Данный раздел описывает общий процесс извлечения необходимых параметров, решения капчи и повторного выполнения авторизации на целевом сайте.

  1. Первоначальный запрос на авторизацию:
POST https://example.com/api/v2/auths/signin

Отправляются данные пользователя:

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

Примеры заголовков см. в разделе Примеры автоматического решения капчи.

  1. Определение ответа сервера. Сервер может вернуть два типа ответа:
  • 2.1 Обычный JSON (капчи нет):
{
"success": false,
"data": {
"code": "Bad_Request",
"details": "The email or password provided is incorrect..."
}
}

Это означает, что капча не требуется и запрос обработан стандартно.

  • 2.2 Ответ с капчей (сервер возвращает HTML страницу вместо JSON):
<!doctype html>
<meta charset="UTF-8">
<meta name="aliyun_waf_aa" content="...">
<meta name="aliyun_waf_bb" content="...">
...
  1. Внутри страницы находится объект со следующими данными:
var requestInfo = {
data,
region,
sceneId,
token,
traceid,
type,
userId,
userUserId
}

Из объекта необходимо извлечь следующие параметры, используемые для решения капчи:

  • userId
  • userUserId
  • verifyType (соответствует type)
  • region
  • UserCertifyId (соответствует traceid)

Важно: дополнительно необходимо сохранить значения авторизационных параметров token и traceid. Они используются в последующих запросах авторизации как u_atoken и u_asig соответственно.


  1. Пример формирования ссылки на JS капчи:
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. Формирование metadata и запроса для решения капчи.

Эти данные передаются в наш сервис для решения капчи:

Важно: все указанные значения приведены исключительно в качестве примера. Перед использованием замените их на актуальные данные для вашего проекта.

{
"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. Получение решения капчи и повторная отправка запроса на авторизацию с ранее сохранёнными параметрами u_atoken и u_asig:
POST https://example.com/api/v2/auths/signin?u_atoken=...&u_asig=...&u_aref=undefined

В случае успешного выполнения капчи сервер возвращает результат авторизации (см. пункт 2.1).


Примеры автоматического решения капчи

Важно

Примеры носят демонстрационный характер и показывают общую логику работы с вашим сайтом, использующим защиту Alibaba Cloud Captcha. В реальных проектах код может потребовать адаптации под конкретный сайт, его запросы и заголовки.

Важные данные (API‑ключи, настройки прокси и т.п.) рекомендуется хранить в .env или переменных окружения.

Показать код (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("Не удалось распарсить JSON:", err.message);
console.error("Попытка распарсить:", jsonStr);
return null;
}
}

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

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

// Обработка формата protocol:ip:port (3 части)
if (parts.length === 3) {
const [protocol, ip, port] = parts;
return { proxyLine: `${protocol}://${ip}:${port}`, protocol, ip, port };
}

// Обработка формата protocol:username:password:ip:port (5 частей)
if (parts.length === 5) {
const [protocol, username, password, ip, port] = parts;
return {
proxyLine: `${protocol}://${username}:${password}@${ip}:${port}`,
protocol,
ip,
port,
username,
password,
};
}

// Некорректный формат
return undefined;
}

const proxyUrl =
process.env.proxyUrl || "http:username:password:127.0.0.1:9029"; // Замените на параметры вашего прокси или задайте в .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"; // Замените на ваш API ключ CapMonster Cloud

this.currentDate = new Date();
// Здесь формируется динамическая ссылка на JS капчи
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"; // Замените на URL страницы с капчей
this.userAgent =
"userAgentPlaceholder";
}

async executor() {
console.log(`Получение параметров капчи....`);
const RequireAuthorizationResponses =
await this.getAuthorizationResponses();
console.log("Успешно получены страницы с капчей");
const requireParamsCaptchas = await this.requireParamsCaptchasData(
RequireAuthorizationResponses,
);
console.log(`Параметры капчи: `, requireParamsCaptchas);
const AlibabaSolvedResult = await this.requireAlibabaSolverResponse(
requireParamsCaptchas,
);
console.log(
`Результат решения капчи: `,
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({
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":
"userAgentPlaceholder",
Version: "0.2.36",
"X-Request-Id": "2b4a7a52-d273-4049-a826-156aae856fe5",
"bx-v": "2.5.36",
"sec-ch-ua":
'"Chromium";v="150", "Not-A.Brand";v="24", "Google Chrome";v="150"',
"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`, // Замените на актуальный URL для авторизации на сайте, который вызывает капчу
{
body: JSON.stringify({
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", // Замените на актуальный Origin сайта
Pragma: "no-cache",
Referer: "https://example.com/auth", // Замените на актуальный Referer сайта
Timezone: "Thu Apr 09 2026 23:29:23 GMT+0300",
"User-Agent":
"userAgentPlaceholder",
Version: "0.2.36",
"X-Request-Id": "2b4a7a52-d273-4049-a826-156aae856fe5",
"bx-v": "2.5.36",
"sec-ch-ua":
'"Chromium";v="150", "Not-A.Brand";v="24", "Google Chrome";v="150"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
source: "web",
},
},
);

if (response.body.includes("requestInfo")) {
console.log("Ответ с капчей успешно получен:");
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,
);
// Сохраните авторизационные параметры для последующего использования при повторной отправке запроса на авторизацию
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();

Используйте библиотеку SDK

Показать код (для браузера)
// https://github.com/CapMonsterCloud/capmonster-nodejs-captcha-solver

import {
CapMonsterCloudClientFactory,
ClientOptions,
AlibabaRequest
} 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 alibabaRequest = new AlibabaRequest({
websiteURL: "https://yourwebsite.com/page-with-alibaba",
userAgent: "userAgentPlaceholder",
metadata: {
sceneId: "your-scene-id",
prefix: "your-prefix",
},
});

// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password",
};

alibabaRequest = new AlibabaRequest({
websiteURL: "https://yourwebsite.com/page-with-alibaba",
userAgent: "userAgentPlaceholder",
metadata: {
sceneId: "your-scene-id",
prefix: "your-prefix",
},
proxy,
});
*/

// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);

const result = await client.Solve(alibabaRequest);
console.log("Solution:", result.solution);
});
Показать код (Node.js)
// https://github.com/CapMonsterCloud/capmonster-nodejs-captcha-solver

const {
CapMonsterCloudClientFactory,
ClientOptions,
AlibabaRequest,
} = require("@zennolab_com/capmonstercloud-client");

const API_KEY = "YOUR_API_KEY"; // Укажите ваш API-ключ CapMonster Cloud

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

// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
let alibabaRequest = new AlibabaRequest({
websiteURL: "https://yourwebsite.com/page-with-alibaba",
userAgent: "userAgentPlaceholder",
metadata: {
sceneId: "your-scene-id",
prefix: "your-prefix",
},
});

// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password",
};

alibabaRequest = new AlibabaRequest({
websiteURL: "https://yourwebsite.com/page-with-alibaba",
userAgent: "userAgentPlaceholder",
metadata: {
sceneId: "your-scene-id",
prefix: "your-prefix",
},
proxy,
});
*/

// При необходимости можно проверить баланс
const balance = await client.getBalance();
console.log("Balance:", balance);

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

solveAlibaba().catch(console.error);