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

Alibaba Cloud Captcha

任务示例

以下是当前 CapMonster Cloud 服务支持的 Alibaba CAPTCHA 任务类型示例:

Slider CAPTCHA
Puzzle CAPTCHA
Image restoration CAPTCHA
注意!

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


cookieRequired(位于 metadata 中)<boolean>optional

与 CAPTCHA 识别结果一起返回 cookies。

仅当网站使用 Alibaba WAFAmazon WAF,并且成功完成验证后需要获取 cookies 时,才应将该参数设置为 true

默认情况下不使用此参数。


userAgent<string>optional

浏览器的 User-Agent。
仅传递当前有效的 Windows 操作系统 UA。目前为userAgentPlaceholder


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

代理服务器密码。


创建任务的方法

普通版本(无附加参数)

POST
https://api.capmonster.cloud/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
}

使用扩展参数的方案(userIduserUserIdverifyType 等):

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

请求示例

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

返回 cookies 的选项(cookieRequired

对于某些使用 Alibaba WAFAmazon WAF 的网站,成功完成 CAPTCHA 识别后还需要获取 cookies,以便在后续请求中使用。

为此,请在 metadata 对象中添加以下参数:

{
"cookieRequired": true
}
POST
https://api.capmonster.cloud/createTask

请求示例

{
"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 验证码的解决结果。

如果请求中指定了 "cookieRequired": true,响应还会包含按域名分组的 cookies。 请将 Domains 对象中的 cookies 与 CAPTCHA 识别结果一起用于向相应域名发送的后续请求。

POST
https://api.capmonster.cloud/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\"}"
}
}
}

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

sceneId

可在成功完成一次验证码后获取:

  1. 在网站上手动完成验证码。
  2. 打开 DevToolsNetwork 选项卡。
  3. 查找成功解决后发送的请求(例如:verify、check、validate)。
  4. PayloadResponse 中查找 sceneId 参数(CaptchaSceneIdsId)。

也可以通过搜索网络请求来查找此参数:

  1. 打开包含验证码的页面,进入 DevToolsNetwork 选项卡。
  2. 使用关键字 sceneIdCaptchaSceneId 进行搜索(Ctrl + F)。

prefix

可从网站用于传递验证码任务文本的请求 URL 中获取:

  1. 打开包含验证码的页面。
  2. 查找与加载任务相关的请求(通常通过 DevToolsNetwork)。


使用包含扩展参数的网站

提取和准备验证码参数

本节说明提取所需参数、解决验证码以及在目标网站上重新执行授权的通用流程。

  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

重要: 还必须保存授权参数 tokentraceid 的值。它们将在后续授权请求中分别作为 u_atokenu_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_atokenu_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"; // 替换为您的 CapMonster Cloud API 密钥

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();