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

GeeTest

Внимание!

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, на практике оно не используется.