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

GeeTest

CapMonster Cloud MCP
Для распознавания и решения CAPTCHA также можно использовать CapMonster Cloud MCP

Внимание!

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

Прокси с авторизацией по IP пока не поддерживаются.

Ваше приложение должно прислать адрес сайта, публичный ключ домена (gt) и ключ (challenge).

Результатом решения задачи является три или пять токенов для сабмита формы.

к сведению

Для GeeTest V3:

  • Параметры gt, challenge и geetestApiServerSubdomain могут передаваться в JavaScript-коде инициализации GeeTest, например в функции initGeetest.

  • Некоторые параметры также могут присутствовать в HTML-коде страницы или сетевых запросах. Для GeeTest V3 значение challenge необходимо получать до инициализации CAPTCHA.

Для GeeTest V4 в параметре gt передаётся значение captcha_id.


GeeTest V3​

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

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

Intelligent mode
Slide CAPTCHA
Icon CAPTCHA
Space CAPTCHA

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


ВАЖНО: параметр challenge в GeeTest V3 является динамическим.
Получайте новое значение непосредственно перед созданием каждой задачи и до инициализации CAPTCHA на странице. После загрузки CAPTCHA ранее полученный challenge становится недействительным.


type<string>required

GeeTestTask


websiteURL<string>required

Адрес страницы, на которой инициализируется капча. Корректный URL обычно передается в заголовке Referer при запросе к https://api-na.geetest.com/gettype.php. Например, вы можете находиться на странице https://example.com#login, однако фактическая инициализация капчи выполняется на странице https://example.com.


gt<string>required

Ключ-идентификатор GeeTest gt для домена. Статическое значение, редко обновляется.


challenge<string>required only for V3

Динамический ключ. Перед созданием каждой задачи на решение необходимо получать новое значение challenge.

Важно: получайте challenge до инициализации CAPTCHA на странице.

Если CAPTCHA уже была загружена, полученное значение становится недействительным. При отправке такого значения в CapMonster Cloud API будет возвращена ошибка ERROR_INVALID_TASK с сообщением о невалидности параметра.


version<integer>required

3


geetestApiServerSubdomain<string>optional

Поддомен сервера Geetest API (должен отличаться от api.geetest.com).
Необязательный параметр. Может потребоваться для некоторых сайтов.


geetestGetLib<string>optional

Путь к скрипту капчи для ее отображения на странице.
Необязательный параметр. Может потребоваться для некоторых сайтов.
Отправляйте JSON в виде строки.


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": "GeeTestTask",
"websiteURL": "https://yourwebsite.com/page-with-geetest",
"gt": "gt-value",
"challenge": "challenge-value",
"version": 3,
"geetestApiServerSubdomain": "example.api.geetest.com"

}
}

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

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

Используйте метод getTaskResult, чтобы получить решение GeeTest. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 10 с до 30 с.

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

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

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

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

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

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

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

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

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

{
"errorId": 0,
"status": "ready",
"solution": {
"challenge": "0f759dd1ea6c4wc76cedc2991039ca4f23",
"validate": "6275e26419211d1f526e674d97110e15",
"seccode": "510cd9735583edcb158601067195a5eb|jordan"
}
}

СвойствоТипОписание
challengeStringВсе три параметра необходимы при отправке формы на целевом сайте.
validateString
seccodeString

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

Вручную​

  1. Откройте сайт, на котором отображается GeeTest V3, в браузере.
  2. Откройте инструменты разработчика (DevTools) и перейдите во вкладку Network.
  3. Обновите страницу, чтобы записать сетевые запросы с момента загрузки.
  4. Найдите запрос к серверу целевого сайта, в ответе которого возвращаются параметры GeeTest, в том числе gt и challenge.

Значение challenge необходимо получить до инициализации CAPTCHA, то есть до выполнения запроса GeeTest вида:

https://api.geetest.com/gettype.php?gt=...

Перед инициализацией CAPTCHA сайт может получать параметры GeeTest со своего сервера. Чтобы найти актуальное значение challenge, проверьте запросы к домену целевого сайта и их ответы.

В некоторых случаях сайт шифрует данные, получаемые от своего сервера, поэтому значение challenge может быть недоступно в явном виде в ответе такого запроса. В этом случае значение можно получить из параметров запросов GeeTest, например:

https://api.geetest.com/get.php?gt=...

и/или:

https://api.geevisit.com/ajax.php?gt=...

Важно:

При таком способе необходимо получить параметры из запроса и заблокировать запросы к GeeTest API до их отправки. Если запрос будет выполнен и CAPTCHA загрузится, использованное значение challenge станет недействительным.

После получения актуальных значений gt и challenge используйте их для создания задачи GeeTest V3 в CapMonster Cloud.


Автоматически​

Получение параметров GeeTest V3 можно автоматизировать двумя способами. Выберите подходящий вариант в зависимости от реализации целевого сайта.

Получение параметров из ответа сервера сайта

Если сервер сайта возвращает gt и challenge в открытом виде, повторите соответствующий запрос перед созданием задачи.

Например:

https://example.com/api/v1/captcha/gee-test/init-params
Показать код (в браузере)
async function getGeeTestV3Params() {
// Замените URL на запрос вашего сайта,
// в ответе которого возвращаются gt и challenge.
// Если запрос содержит динамические параметры,
// сформируйте их перед отправкой.
const timestamp = Date.now();

const response = await fetch(
`https://example.com/api/v1/captcha/gee-test/init-params?t=${timestamp}`
);

if (!response.ok) {
throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();

const gt = data.gt;
const challenge = data.challenge;

if (!gt || !challenge) {
throw new Error("Не удалось получить gt или challenge");
}

console.log({ gt, challenge });

return { gt, challenge };
}

getGeeTestV3Params().catch(console.error);
Показать код (Node.js)
async function getGeeTestV3Params() {
// Замените URL на запрос вашего сайта,
// в ответе которого возвращаются gt и challenge.
// Если запрос содержит динамические параметры,
// сформируйте их перед отправкой.
const timestamp = Date.now();

const response = await fetch(
`https://example.com/api/v1/captcha/gee-test/init-params?t=${timestamp}`
);

if (!response.ok) {
throw new Error(`Request failed: ${response.status}`);
}

const data = await response.json();

const gt = data.gt;
const challenge = data.challenge;

if (!gt || !challenge) {
throw new Error("Missing gt or challenge");
}

console.log({ gt, challenge });

return { gt, challenge };
}

getGeeTestV3Params().catch(console.error);

Получение параметров из запроса GeeTest

Если значение challenge не удаётся получить из ответа сервера сайта, перехватите запрос:

https://api.geetest.com/get.php?gt=...&challenge=...

или:

https://api.geevisit.com/ajax.php?gt=...&challenge=...

Извлеките gt и challenge из query-параметров и заблокируйте запрос до его отправки.

Показать код (Playwright)
import { chromium } from "playwright";

async function getGeeTestV3Params(pageUrl) {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();

let params = null;

await context.route("**/*", async (route) => {
const requestUrl = route.request().url();

if (
requestUrl.includes("api.geetest.com/get.php") ||
requestUrl.includes("api.geevisit.com/ajax.php")
) {
const url = new URL(requestUrl);

const gt = url.searchParams.get("gt");
const challenge = url.searchParams.get("challenge");

if (gt && challenge && !params) {
params = { gt, challenge };
console.log(params);
}

await route.abort();
return;
}

await route.continue();
});

const page = await context.newPage();
await page.goto(pageUrl);

await page.waitForTimeout(5000);
await browser.close();

if (!params) {
throw new Error("Не удалось получить gt и challenge");
}

return params;
}

getGeeTestV3Params(
"https://example.com/page-with-geetest"
).catch(console.error);

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

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

import {
CapMonsterCloudClientFactory,
ClientOptions,
GeeTestRequest
} 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 geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
challenge: "your-challenge-value",
version: 3,
});

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

geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
challenge: "your-challenge-value",
version: 3,
proxy,
userAgent: "userAgentPlaceholder",
});
*/

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

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

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

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

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

// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
let geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
challenge: "your-challenge-value",
version: 3,
});

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

geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
challenge: "your-challenge-value",
version: 3,
proxy,
userAgent: "userAgentPlaceholder",
});
*/

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

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

solveGeeTest().catch(console.error);

GeeTest V4​

Пример задания​

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

type<string>required

GeeTestTask


websiteURL<string>required

Адрес страницы, на которой решается капча.


gt<string>required

Ключ-идентификатор GeeTest для домена - параметр captcha_id.


version<integer>required

4


geetestApiServerSubdomain<string>optional

Поддомен сервера Geetest API (должен отличаться от api.geetest.com).
Необязательный параметр. Может потребоваться для некоторых сайтов.


geetestGetLib<string>optional

Путь к скрипту капчи для ее отображения на странице.
Необязательный параметр. Может потребоваться для некоторых сайтов.
Отправляйте JSON в виде строки.


initParameters<object>optional

Дополнительные параметры для 4 версии, используются вместе с "riskType" (например, slide).


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": "GeeTestTask",
"websiteURL": "https://yourwebsite.com/page-with-geetest",
"gt": "captcha-id-value",
"version": 4,
"initParameters": {
"riskType": "risk-type-value"
}
}
}

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

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

Используйте метод getTaskResult, чтобы получить решение GeeTest. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 10 с до 30 с.

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

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

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

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

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

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

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

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

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

{
"errorId": 0,
"status": "ready",
"solution": {
"captcha_id": "f5c2ad5a8a3cf37192d8b9c039950f79",
"lot_number": "bcb2c6ce2f8e4e9da74f2c1fa63bd713",
"pass_token": "edc7a17716535a5ae624ef4707cb6e7e478dc557608b068d202682c8297695cf",
"gen_time": "1683794919",
"captcha_output": "XwmTZEJCJEnRIJBlvtEAZ662T...[cut]...SQ3fX-MyoYOVDMDXWSRQig56"
}
}

СвойствоТипОписание
captcha_idStringВсе пять параметров необходимы при отправке формы на целевом сайте.
input[name=captcha_id]
input[name=lot_number]
input[name=pass_token]
input[name=gen_time]
input[name=captcha_output]
lot_numberString
pass_tokenString
gen_timeString
captcha_outputString

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

Вручную​

  1. Откройте сайт, на котором отображается капча, в браузере.
  2. Откройте инструменты разработчика (DevTools) и перейдите во вкладку Network.
  3. Обновите страницу (F5), чтобы зафиксировать все сетевые запросы.
  4. В поле поиска (Filter) введите load или captcha, чтобы быстрее найти нужный запрос.
  5. Найдите запрос вида load?callback=... — в нём обычно передаются параметры капчи.
  6. Кликните по этому запросу и откройте вкладку Payload, чтобы просмотреть необходимые данные.

paramsv4

Автоматически​

Удобный способ автоматизировать поиск всех необходимых параметров. Некоторые параметры генерируются заново при каждой загрузке страницы, поэтому для их извлечения потребуется работать через браузер – обычный или в режиме headless (например, с помощью Playwright). Так как значения динамических параметров хранятся недолго, капчу нужно решать сразу после их получения.

Важно!

Приведённые фрагменты кода являются базовыми примерами для ознакомления в извлечении необходимых параметров. Точная реализация будет зависеть от вашего сайта с капчей, его структуры и используемых HTML-элементов и селекторов.

Показать код (в браузере)
(function() {
function getQueryParams(url) {
const params = new URLSearchParams(new URL(url).search);
const captchaId = params.get('captcha_id');
const riskType = params.get('risk_type');
return { captchaId, riskType };
}

const observer = new PerformanceObserver((list) => {
const entries = list.getEntriesByType('resource');
entries.forEach((entry) => {
if (entry.name.includes('https://gcaptcha4.geetest.com/load?')) {
const { captchaId, riskType } = getQueryParams(entry.name);
if (captchaId) {
console.log('GeeTest v4 detected (via PerformanceObserver):');
console.log({ captchaId, riskType });
}
}
});
});

observer.observe({ type: 'resource', buffered: true });
})();
Показать код (Node.js)
import { chromium } from "playwright";

async function detectGeeTestV4(pageUrl) {
const result = { version: null, data: {} };

const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();

page.on("response", async (response) => {
const url = response.url();

if (url.includes("https://gcaptcha4.geetest.com/load?")) {
const urlParams = new URLSearchParams(url.split("?")[1]);
const captchaId = urlParams.get("captcha_id");
const riskType = urlParams.get("risk_type");

if (captchaId && !result.version) {
result.version = "v4";
result.data = {
captchaId: captchaId,
riskType: riskType,
};

console.log("GeeTest v4 detected:");
console.log(result.data);
}
}
});

await page.goto(pageUrl, { waitUntil: "networkidle" });
await page.waitForTimeout(20000);

if (!result.version) {
console.log("error");
}

await browser.close();
return result;
}

detectGeeTestV4("https://example.com").then((result) => {
console.log(result);
});

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

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

import {
CapMonsterCloudClientFactory,
ClientOptions,
GeeTestRequest
} 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 geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
version: "4",
initParameters: {
riskType: "your-risk-type",
},
});

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

geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
version: "4",
initParameters: {
riskType: "your-risk-type",
},
proxy,
});
*/

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

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

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

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

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

// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
let geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
version: "4",
initParameters: {
riskType: "your-risk-type",
},
});

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

geetestRequest = new GeeTestRequest({
websiteURL: "https://yourwebsite.com/page-with-geetest",
gt: "your-gt-value",
version: "4",
initParameters: {
riskType: "your-risk-type",
},
proxy,
});
*/

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

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

solveGeeTest().catch(console.error);

Особенности решения GeeTest на app.gal**.com​

Внимание!

Данный раздел актуален только для капчи GeeTest на сайте app.gal**.com. Для других сайтов использовать эти значения не требуется.

Когда использовать поле challenge?

Для сайта app.gal**.com необходимо указывать значение поля challenge в зависимости от выполняемого действия. Если это поле не указано, по умолчанию используется значение AddTypedCredentialItems, но это подходит не для всех сценариев.

Список возможных значений challenge:

Действие на сайте app.gal**.comЗначение challenge
Отправка email-кодаSendEmailCode
Подтверждение действия (например, логина)SendVerifyCode
Получение наградыClaimUserTask
Открытие коробки-сюрпризаOpenMysteryBox
Покупка в GGShopBuyGGShop
Подготовка к покупке билетовPrepareBuyGGRaffleTickets
Добавление учётных данныхAddTypedCredentialItems
Создание тикетаCreateReportTicket
Участие в активностиPrepareParticipate
Обновление данных учётных данныхRefreshCredentialValue
Синхронизация данныхSyncCredentialValue
Вход через соцсетьGetSocialAuthUrl

Значение challenge должно совпадать с operationName, который можно увидеть в сетевых запросах (Network) через DevTools.

Пример отправки задачи
{
"type": "GeeTestTask",
"websiteURL": "https://app.gal**.com/accountSetting/social",
"gt": "244bcb8b9846215df5af4c624a750db4",
"challenge": "SendVerifyCode",
"version": 3
}

Примечание: GT-ключ для gal**.com всегда равен 244bcb8b9846215df5af4c624a750db4. Это значение можно оставить по умолчанию.

Пример ответа
{
"errorId": 0,
"errorCode": null,
"errorDescription": null,
"solution": {
"lot_number": "e0c84aab60867ad1316f8606d31ab58d2a54d8a4ca8e78b9339abd8ea62967cb",
"captcha_output": "7DlZW2dul...cbEA5uIbwg==",
"pass_token": "ce024389a0926e0d1081792c83e0c46f882084e45e95afa0e148fd03aed3ae10",
"gen_time": "1753158042",
"encryptedData": ""
},
"status": "ready"
}

Поле encryptedData на стороне сайта обычно пустое, так как логика клиента игнорирует его. Хотя значение возвращается через WebAssembly, на практике оно не используется.