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:


Параметры запроса
ВАЖНО: параметр
challengeв GeeTest V3 является динамическим.
Получайте новое значение непосредственно перед созданием каждой задачи и до инициализации CAPTCHA на странице. После загрузки CAPTCHA ранее полученныйchallengeстановится недействительным.
type<string>requiredGeeTestTask
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>required3
geetestApiServerSubdomain<string>optionalПоддомен сервера Geetest API (должен отличаться от api.geetest.com).
Необязательный параметр. Может потребоваться для некоторых сайтов.
geetestGetLib<string>optionalПуть к скрипту капчи для ее отображения на странице.
Необязательный параметр. Может потребоваться для некоторых сайтов.
Отправляйте JSON в виде строки.
userAgent<string>optionalUser-Agent браузера. Используйте текущее значение, поддерживаемое CapMonster Cloud: userAgentPlaceholder
Получить актуальное значение можно по адресу: https://capmonster.cloud/api/useragent/actual.
proxyType<string>optionalhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>optionalIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>optionalПорт прокси.
proxyLogin<string>optionalЛогин прокси-сервера.
proxyPassword<string>optionalПароль прокси-сервера.
Метод создания задачи
https://api.capmonster.cloud/createTask
Для пользователей из России также доступен:
https://ru.api.capmonster.cloud/createTask
Подробнее в разделе createTask.
- GeeTestTask (без прокси)
- GeeTestTask (при использовании прокси)
Пример запроса
{
"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
}
Пример запроса
{
"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",
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}
Пример ответа
{
"errorId":0,
"taskId":407533072
}
Используйте метод getTaskResult, чтобы получить решение GeeTest. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 10 с до 30 с.
Метод получения результата задачи
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"
}
}
| Свойство | Тип | Описание |
|---|---|---|
| challenge | String | Все три параметра необходимы при отправке формы на целевом сайте. |
| validate | String | |
| seccode | String |
Как найти все нужные параметры для создания задачи
Вручную
- Откройте сайт, на котором отображается GeeTest V3, в браузере.
- Откройте инструменты разработчика (DevTools) и перейдите во вкладку Network.
- Обновите страницу, чтобы записать сетевые запросы с момента загрузки.
- Найдите запрос к серверу целевого сайта, в ответе которого возвращаются параметры 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
- JavaScript
- Python
- C#
Показать код (в браузере)
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);
Показать код
import time
import requests
def get_geetest_v3_params():
# Замените URL на запрос вашего сайта,
# в ответе которого возвращаются gt и challenge.
# Если запрос содержит динамические параметры,
# сформируйте их перед отправкой.
timestamp = int(time.time() * 1000)
response = requests.get(
"https://example.com/api/v1/captcha/gee-test/init-params",
params={
"t": timestamp,
},
)
response.raise_for_status()
data = response.json()
gt = data.get("gt")
challenge = data.get("challenge")
if not gt or not challenge:
raise ValueError("Не удалось получить gt или challenge")
print({
"gt": gt,
"challenge": challenge,
})
return gt, challenge
get_geetest_v3_params()
Показать код
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
class Program
{
static async Task GetGeeTestV3Params()
{
using var client = new HttpClient();
// Замените URL на запрос вашего сайта,
// в ответе которого возвращаются gt и challenge.
// Если запрос содержит динамические параметры,
// сформируйте их перед отправкой.
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var url =
$"https://example.com/api/v1/captcha/gee-test/init-params?t={timestamp}";
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
var data = JObject.Parse(content);
var gt = data["gt"]?.ToString();
var challenge = data["challenge"]?.ToString();
if (string.IsNullOrEmpty(gt) || string.IsNullOrEmpty(challenge))
{
throw new Exception("Не удалось получить gt или challenge");
}
Console.WriteLine($"GT: {gt}");
Console.WriteLine($"Challenge: {challenge}");
}
static async Task Main()
{
await GetGeeTestV3Params();
}
}
Получение параметров из запроса GeeTest
Если значение challenge не удаётся получить из ответа сервера сайта, перехватите запрос:
https://api.geetest.com/get.php?gt=...&challenge=...
или:
https://api.geevisit.com/ajax.php?gt=...&challenge=...
Извлеките gt и challenge из query-параметров и заблокируйте запрос до его отправки.
- JavaScript / TypeScript
- Python
Показать код (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);
Показать код (Playwright)
import asyncio
from urllib.parse import urlparse, parse_qs
from playwright.async_api import async_playwright
async def get_geetest_v3_params(page_url):
params = {}
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
async def handle_route(route):
request_url = route.request.url
if (
"api.geetest.com/get.php" in request_url
or "api.geevisit.com/ajax.php" in request_url
):
query = parse_qs(urlparse(request_url).query)
gt = query.get("gt", [None])[0]
challenge = query.get("challenge", [None])[0]
if gt and challenge and not params:
params["gt"] = gt
params["challenge"] = challenge
print(params)
await route.abort()
return
await route.continue_()
await context.route("**/*", handle_route)
page = await context.new_page()
await page.goto(page_url)
await asyncio.sleep(5)
await browser.close()
if not params:
raise RuntimeError("Не удалось получить gt и challenge")
return params
asyncio.run(
get_geetest_v3_params(
"https://example.com/page-with-geetest"
)
)
Используйте библиотеку SDK
- JavaScript / TypeScript
- Python
- C#
Показать код (для браузера)
// 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);
Показать код
# https://github.com/CapMonsterCloud/capmonster-python-captcha-solver
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import GeetestRequest
# Импортируйте ProxyInfo, если планируете использовать собственный прокси
from capmonstercloudclient.requests.proxy_info import ProxyInfo
API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
async def solve_geetest():
client = CapMonsterClient(
options=ClientOptions(api_key=API_KEY)
)
# Базовый пример без прокси
# CapMonster Cloud автоматически использует собственные прокси
geetest_request = GeetestRequest(
websiteUrl="https://yourwebsite.com/page-with-geetest",
gt="your-gt-value",
challenge="your-challenge-value",
version=3,
)
# Пример с использованием вашего прокси
# Раскомментируйте этот блок, если хотите использовать свой прокси
"""
proxy = ProxyInfo(
proxyType="https",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password",
)
geetest_request = GeetestRequest(
websiteUrl="https://yourwebsite.com/page-with-geetest",
gt="your-gt-value",
challenge="your-challenge-value",
version=3,
userAgent="userAgentPlaceholder",
proxy=proxy,
)
"""
# При необходимости можно проверить баланс
balance = await client.get_balance()
print("Balance:", balance)
result = await client.solve_captcha(geetest_request)
print("Solution:", result)
asyncio.run(solve_geetest())
Показать код
// https://github.com/CapMonsterCloud/capmonster-dotnet-captcha-solver
using System;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Укажите ваш API-ключ CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY"
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
var geetestRequest = new GeeTestRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-geetest",
Gt = "your-gt-value",
Challenge = "your-challenge-value",
Version = 3
};
// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
geetestRequest = new GeeTestRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-geetest",
Gt = "your-gt-value",
Challenge = "your-challenge-value",
Version = 3,
UserAgent = "userAgentPlaceholder",
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
*/
// При необходимости можно проверить баланс
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var geetestResult = await cmCloudClient.SolveAsync(geetestRequest);
Console.WriteLine($"""
Solution:
Challenge: {geetestResult.Solution.Challenge}
Validate: {geetestResult.Solution.Validate}
SecCode: {geetestResult.Solution.SecCode}
""");
}
}
GeeTest V4
Пример задания

Параметры запроса
type<string>requiredGeeTestTask
websiteURL<string>requiredАдрес страницы, на которой решается капча.
gt<string>requiredКлюч-идентификатор GeeTest для домена - параметр captcha_id.
version<integer>required4
geetestApiServerSubdomain<string>optionalПоддомен сервера Geetest API (должен отличаться от api.geetest.com).
Необязательный параметр. Может потребоваться для некоторых сайтов.
geetestGetLib<string>optionalПуть к скрипту капчи для ее отображения на странице.
Необязательный параметр. Может потребоваться для некоторых сайтов.
Отправляйте JSON в виде строки.
initParameters<object>optionalДополнительные параметры для 4 версии, используются вместе с "riskType" (например, slide).
userAgent<string>optionalUser-Agent браузера. Используйте текущее значение, поддерживаемое CapMonster Cloud: userAgentPlaceholder
Получить актуальное значение можно по адресу: https://capmonster.cloud/api/useragent/actual.
proxyType<string>optionalhttp - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.
proxyAddress<string>optionalIP адрес прокси IPv4/IPv6. Не допускается:
- использование прозрачных прокси (там, где можно видеть IP клиента);
- использование прокси на локальных машинах.
proxyPort<integer>optionalПорт прокси.
proxyLogin<string>optionalЛогин прокси-сервера.
proxyPassword<string>optionalПароль прокси-сервера.
Метод создания задачи
https://api.capmonster.cloud/createTask
Для пользователей из России также доступен:
https://ru.api.capmonster.cloud/createTask
Подробнее в разделе createTask.
- GeeTestTask (без прокси)
- GeeTestTask (при использовании прокси)
Пример запроса
{
"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
}
Пример запроса
{
"clientKey": "API_KEY",
"task": {
"type": "GeeTestTask",
"websiteURL": "https://yourwebsite.com/page-with-geetest",
"gt": "captcha-id-value",
"version": 4,
"initParameters": {
"riskType": "risk-type-value"
},
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password",
"userAgent": "userAgentPlaceholder"
}
}
Пример ответа
{
"errorId":0,
"taskId":407533072
}
Используйте метод getTaskResult, чтобы получить решение GeeTest. В зависимости от загрузки системы вы получите ответ через время в диапазоне от 10 с до 30 с.
Метод получения результата задачи
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_id | String | Все пять параметров необходимы при отправке формы на целевом сайте. input[name=captcha_id] input[name=lot_number] input[name=pass_token] input[name=gen_time] input[name=captcha_output] |
| lot_number | String | |
| pass_token | String | |
| gen_time | String | |
| captcha_output | String |
Как найти все нужные параметры для создания задачи
Вручную
- Откройте сайт, на котором отображается капча, в браузере.
- Откройте инструменты разработчика (DevTools) и перейдите во вкладку Network.
- Обновите страницу (F5), чтобы зафиксировать все сетевые запросы.
- В поле поиска (Filter) введите
loadилиcaptcha, чтобы быстрее найти нужный запрос. - Найдите запрос вида
load?callback=...— в нём обычно передаются параметры капчи. - Кликните по этому запросу и откройте вкладку Payload, чтобы просмотреть необходимые данные.

Автоматически
Удобный способ автоматизировать поиск всех необходимых параметров. Некоторые параметры генерируются заново при каждой загрузке страницы, поэтому для их извлечения потребуется работать через браузер – обычный или в режиме headless (например, с помощью Playwright). Так как значения динамических параметров хранятся недолго, капчу нужно решать сразу после их получения.
Приведённые фрагменты кода являются базовыми примерами для ознакомления в извлечении необходимых параметров. Точная реализация будет зависеть от вашего сайта с капчей, его структуры и используемых HTML-элементов и селекторов.
- JavaScript
- Python
- C#
Показать код (в браузере)
(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);
});
Показать код
import asyncio
from playwright.async_api import async_playwright
from urllib.parse import urlparse, parse_qs
async def detect_geetest_v4(page_url):
result = {"version": None, "data": {}}
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
async def on_request(request):
url = request.url
if "https://gcaptcha4.geetest.com/load?" in url:
query = parse_qs(urlparse(url).query)
captcha_id = query.get("captcha_id", [None])[0]
risk_type = query.get("risk_type", [None])[0]
if captcha_id and not result["version"]:
result["version"] = "v4"
result["data"] = {
"captchaId": captcha_id,
"riskType": risk_type
}
print("GeeTest v4 detected:")
print(result["data"])
context.on("request", on_request)
await page.goto(page_url, wait_until="networkidle")
await asyncio.sleep(10)
if not result["version"]:
print("error")
await browser.close()
return result
asyncio.run(detect_geetest_v4("https://www.example.com"))
Показать код
using System;
using System.Threading.Tasks;
using Microsoft.Playwright;
using System.Web;
class Program
{
public static async Task Main(string[] args)
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
Headless = false
});
var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
bool detected = false;
page.Request += (_, request) =>
{
var url = request.Url;
if (url.Contains("https://gcaptcha4.geetest.com/load?"))
{
var uri = new Uri(url);
var queryParams = HttpUtility.ParseQueryString(uri.Query);
var captchaId = queryParams.Get("captcha_id");
var riskType = queryParams.Get("risk_type");
if (!string.IsNullOrEmpty(captchaId) && !detected)
{
detected = true;
Console.WriteLine("GeeTest v4 detected:");
Console.WriteLine($"CaptchaId: {captchaId}");
Console.WriteLine($"RiskType: {riskType}");
}
}
};
await page.GotoAsync("https://www.example.com/", new PageGotoOptions
{
WaitUntil = WaitUntilState.NetworkIdle
});
await Task.Delay(10000);
await browser.CloseAsync();
}
}
Используйте библиотеку SDK
- JavaScript / TypeScript
- Python
- C#
Показать код (для браузера)
// 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);
Показать код
# https://github.com/CapMonsterCloud/capmonster-python-captcha-solver
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import GeetestRequest
# Импортируйте ProxyInfo, если планируете использовать собственный прокси
from capmonstercloudclient.requests.proxy_info import ProxyInfo
API_KEY = "YOUR_API_KEY" # Укажите ваш API-ключ CapMonster Cloud
async def solve_geetest():
client = CapMonsterClient(
options=ClientOptions(api_key=API_KEY)
)
# Базовый пример без прокси
# CapMonster Cloud автоматически использует собственные прокси
geetest_request = GeetestRequest(
websiteUrl="https://yourwebsite.com/page-with-geetest",
gt="your-gt-value",
version="4",
initParameters={
"riskType": "your-risk-type",
},
)
# Пример с использованием вашего прокси
# Раскомментируйте этот блок, если хотите использовать свой прокси
"""
proxy = ProxyInfo(
proxyType="https",
proxyAddress="123.45.67.89",
proxyPort=8080,
proxyLogin="username",
proxyPassword="password",
)
geetest_request = GeetestRequest(
websiteUrl="https://yourwebsite.com/page-with-geetest",
gt="your-gt-value",
version="4",
initParameters={
"riskType": "your-risk-type",
},
proxy=proxy,
userAgent="userAgentPlaceholder",
)
"""
# При необходимости можно проверить баланс
balance = await client.get_balance()
print("Balance:", balance)
result = await client.solve_captcha(geetest_request)
print("Solution:", result)
asyncio.run(solve_geetest())
Показать код
// https://github.com/CapMonsterCloud/capmonster-dotnet-captcha-solver
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud;
using Zennolab.CapMonsterCloud.Requests;
class Program
{
static async Task Main(string[] args)
{
// Укажите ваш API-ключ CapMonster Cloud
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY"
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// Базовый пример без прокси
// CapMonster Cloud автоматически использует собственные прокси
var geetestRequest = new GeeTestRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-geetest",
Gt = "your-gt-value",
Version = 4,
InitParameters = new Dictionary<string, string>
{
{ "riskType", "your-risk-type" }
}
};
// Пример с использованием вашего прокси
// Раскомментируйте этот блок, если хотите использовать свой прокси
/*
geetestRequest = new GeeTestRequest
{
WebsiteUrl = "https://yourwebsite.com/page-with-geetest",
Gt = "your-gt-value",
Version = 4,
InitParameters = new Dictionary<string, string>
{
{ "riskType", "your-risk-type" }
},
Proxy = new ProxyContainer(
"123.45.67.89",
8080,
ProxyType.Http,
"username",
"password"
)
};
*/
// При необходимости можно проверить баланс
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var geetestResult = await cmCloudClient.SolveAsync(geetestRequest);
Console.WriteLine($"""
Solution:
CaptchaId: {geetestResult.Solution.CaptchaId}
LotNumber: {geetestResult.Solution.LotNumber}
PassToken: {geetestResult.Solution.PassToken}
GenTime: {geetestResult.Solution.GenTime}
CaptchaOutput: {geetestResult.Solution.CaptchaOutput}
""");
}
}
Особенности решения GeeTest на app.gal**.com
Данный раздел актуален только для капчи GeeTest на сайте app.gal**.com. Для других сайтов использовать эти значения не требуется.
Когда использовать поле challenge?
Для сайта app.gal**.com необходимо указывать значение поля challenge в зависимости от выполняемого действия.
Если это поле не указано, по умолчанию используется значение AddTypedCredentialItems, но это подходит не для всех сценариев.
Список возможных значений challenge:
Действие на сайте app.gal**.com | Значение challenge |
|---|---|
| Отправка email-кода | SendEmailCode |
| Подтверждение действия (например, логина) | SendVerifyCode |
| Получение награды | ClaimUserTask |
| Открытие коробки-сюрприза | OpenMysteryBox |
| Покупка в GGShop | BuyGGShop |
| Подготовка к покупке билетов | 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, на практике оно не используется.
