W tym artykule staraliśmy się odpowiedzieć na wszystkie najważniejsze pytania. Pierwszym krokiem w rozwiązywaniu problemu jest ustalenie, jaki system ochrony jest używany. W tym celu możesz skorzystać z listy popularnych captcha i systemów ochrony antybotowej, gdzie znajdziesz przykłady graficzne oraz kluczowe cechy, które pomogą szybko rozpoznać, z czym masz do czynienia.
Jeśli okaże się, że na Twojej stronie używany jest GeeTest CAPTCHA v4, kolejnym krokiem będzie dokładniejsze poznanie jej właściwości i sposobu działania. W tym artykule możesz również zapoznać się z instrukcją integracji systemu GeeTest CAPTCHA v4, aby w pełni zrozumieć, jak funkcjonuje on na Twojej stronie. Dzięki temu nie tylko lepiej poznasz obecną ochronę, ale też świadomie zaplanujesz jej dalsze utrzymanie.
Jak rozwiązać GeeTest CAPTCHA v4 za pomocą CapMonster Cloud
Podczas testowania formularzy z GeeTest CAPTCHA v4 często trzeba zweryfikować, czy captcha jest poprawnie zintegrowana i działa.
Możesz ręcznie sprawdzić captchę na swojej stronie.
- Otwórz stronę formularza i upewnij się, że captcha się wyświetla.
- Spróbuj wysłać formularz bez rozwiązania — serwer powinien zwrócić błąd.
- Po poprawnym rozwiązaniu formularz musi wysłać się bez problemów.
Do automatycznego rozwiązywania wykorzystaj narzędzia takie jak CapMonster Cloud, które przyjmują parametry captcha, przetwarzają je na serwerach i zwracają gotowy token. Wstaw go do formularza, aby przejść weryfikację bez udziału użytkownika.
Praca z CapMonster Cloud poprzez API zazwyczaj obejmuje następujące kroki:
W żądaniu rozwiązania GeeTest CAPTCHA v4 należy podać następujące parametry:
type - GeeTestTask;
websiteURL - adres strony, na której rozwiązywana jest captcha;
gt - klucz identyfikacyjny GeeTest dla domeny – parametr captcha_id;
version - 4;
geetestApiServerSubdomain - subdomena serwera API GeeTest (musi być inna niż api.geetest.com);
geetestGetLib - ścieżka do skryptu captchy, odpowiedzialnego za jej wyświetlanie na stronie; może być wymagana dla niektórych serwisów;
initParameters - dodatkowe parametry dla wersji 4, używane razem z „riskType” (typ captchy / sposób jej weryfikacji).
https://api.capmonster.cloud/createTask{
"clientKey": "YOUR_CAPMONSTER_CLOUD_API_KEY",
"task": {
"type": "GeeTestTask",
"websiteURL": "https://gt4.geetest.com/",
"gt": "54088bb07d2df3c46b79f80300b0abbe",
"version": 4,
"initParameters": {
"riskType": "slide"
}
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/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"
}
}
// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import {
CapMonsterCloudClientFactory,
ClientOptions,
GeeTestRequest
} from "@zennolab_com/capmonstercloud-client";
const CAPMONSTER_API_KEY = "YOUR_CAPMONSTER_API_KEY";
async function solveGeetestV4(pageUrl) {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext({ viewport: null });
const page = await context.newPage();
let detected = null;
let solutionObj = null;
// 1. Przechwycenie odpowiedzi /load (ustalenie captcha_id, challenge itd.)
page.on("response", async (response) => {
const url = response.url();
if (!url.startsWith("https://gcaptcha4.geetest.com/load?")) return;
const params = new URLSearchParams(url.split("?")[1] || "");
const captchaId = params.get("captcha_id");
const challenge = params.get("challenge");
const captchaType = params.get("captcha_type");
if (captchaId && challenge) {
detected = { captchaId, challenge, captchaType };
console.log("Detected GeeTest v4 load:", detected);
}
});
// 2. Załadowanie strony
console.log("Opening page:", pageUrl);
await page.goto(pageUrl, { waitUntil: "domcontentloaded" });
// 3. Oczekiwanie, aż odpowiedź /load zostanie przechwycona
console.log("Waiting for GeeTest /load...");
while (!detected) {
await page.waitForTimeout(500);
}
// 4. Wysłanie zadania do CapMonster Cloud
console.log("Sending task to CapMonster...");
const cmc = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: CAPMONSTER_API_KEY })
);
const task = new GeeTestRequest({
websiteURL: pageUrl,
gt: detected.captchaId,
challenge: detected.challenge,
version: "4",
initParameters: {
riskType: detected.captchaType || "slide"
}
});
const solveRes = await cmc.Solve(task);
const sol = solveRes.solution || solveRes;
solutionObj = {
captcha_id: sol.captcha_id || detected.captchaId,
captcha_output: sol.captcha_output,
lot_number: sol.lot_number,
pass_token: sol.pass_token
};
console.log("Got solution from CapMonster:", solutionObj);
// 5. Podstawienie własnych wartości w /verify, aby uzyskać pozytywną odpowiedź
await page.route("https://gcaptcha4.geetest.com/verify*", async (route) => {
console.log("Intercepted /verify, injecting fake success...");
const body = `geetest_${Date.now()}(${JSON.stringify({
status: "success",
data: {
result: "success",
seccode: {
captcha_id: solutionObj.captcha_id,
captcha_output: solutionObj.captcha_output,
lot_number: solutionObj.lot_number,
pass_token: solutionObj.pass_token
}
}
})})`;
await route.fulfill({
status: 200,
contentType: "application/javascript",
body
});
});
// 6. Zasymulowanie działania użytkownika (np. kliknięcie w przycisk captchy)
console.log("Waiting for captcha interaction...");
await page.waitForTimeout(3000);
// Przykład wywołania weryfikacji:
try {
await page.click('.geetest_btn'); // przycisk captchy
console.log("Clicked captcha button");
} catch {
console.log("Captcha button not found");
}
// Czasami verify() trzeba wywołać ręcznie:
await page.evaluate(() => {
if (window.initGeetest4 && typeof verify === "function") {
verify();
}
});
console.log("Waiting for verification request...");
await page.waitForTimeout(3000);
await browser.close();
return { detected, solution: solutionObj };
}
(async () => {
const url = "https://example.com"; // zamień na stronę z GeeTest v4
const res = await solveGeetestV4(url);
console.log("FINISHED:", res);
})();
1. Zarejestruj się lub zaloguj na swoje konto GeeTest.
2. Przejdź do Captcha Dashboard i wybierz Behavior Verification v4:

3. W panelu kliknij + Create application.
4. Podaj APP/website name (nazwa strony lub aplikacji, gdzie będzie używana captcha), Address (główna domena strony, na której captcha zostanie umieszczona, np. https://example.com), Industry (kategoria strony, np. „E-commerce”, „Social Media” itp.), a następnie kliknij Confirm.
5. Kliknij Add events obok nazwy nowo utworzonej aplikacji. Ustaw Event – nazwę konkretnego scenariusza (zdarzenia), w którym captcha będzie używana, np. login, register itp.; Device – platformę (np. Web/Wap); Business types – typ scenariusza użycia captchy (np. Sign-up / Sign-in — rejestracja / logowanie). Następnie kliknij Add.
6. W panelu pojawią się teraz ID (używane po stronie klienta i serwera) oraz Key (używany po stronie serwera do weryfikacji) utworzonej captchy:

7. Podłącz część kliencką
Dołącz skrypt:
<script src="https://static.geetest.com/v4/gt4.js"></script>Zainicjalizuj CAPTCHA:
initGeetest4(
{ captchaId: "Your CaptchaId" },
function (captcha) {
captcha.appendTo("#captcha"); // wstawiamy do elementu na stronie
}
);Ważne:
- CAPTCHA musi być inicjalizowana przy ładowaniu strony, w przeciwnym razie nie będzie w stanie śledzić zachowania użytkownika.
- Jeśli na jednej stronie używasz kilku CAPTCHA, wywołuj initGeetest4 osobno dla każdej z nich.
- Jeżeli używasz CAPTCHA wewnątrz iframe, dodaj atrybut sandbox="allow-scripts allow-popups".
<!-- Dołączamy skrypt CAPTCHA -->
<script src="https://static.geetest.com/v4/gt4.js"></script>
</head>
<body>
<h1>CAPTCHA Demo</h1>
<!-- Kontener dla CAPTCHA -->
<div id="captcha"></div>
<script>
// Inicjalizacja CAPTCHA
initGeetest4(
{
captchaId: "YOUR_CAPTCHA_ID" // zamień na własne CaptchaId
},
function (captcha) {
// Wstawiamy CAPTCHA do elementu strony
captcha.appendTo("#captcha");
// Tutaj można obsłużyć pomyślne przejście
captcha.onSuccess(function() {
const validate = captcha.getValidate();
console.log("CAPTCHA passed!", validate);
// W tym miejscu można wysłać validate na serwer w celu weryfikacji
});
}
);
</script>
8. Skonfiguruj część serwerową.
Gdy użytkownik przechodzi CAPTCHA po stronie frontendu, generowany jest zestaw parametrów. Należy przesłać je do backendu i zweryfikować poprzez wtórne API GeeTest, aby potwierdzić, że sprawdzenie zakończyło się pomyślnie.
Wtórne API weryfikacji:
http://gcaptcha4.geetest.com/validate- Metoda: GET/POST
- Content-Type: application/x-www-form-urlencoded
- Odpowiedź: JSON
Główne parametry żądania
- lot_number – numer seryjny weryfikacji
- captcha_output – dane weryfikacyjne
- pass_token – token weryfikacji
- gen_time – czas wygenerowania weryfikacji
- captcha_id – ID captchy
- sign_token – podpis używany do weryfikacji
{
"status": "success",
"result": "success",
"reason": "",
"captcha_args": {
"used_type": "slide",
"user_ip": "127.0.0.1",
"lot_number": "4dc3cfc2cdff448cad8d13107198d473",
"scene": "anti crawler",
"referer": "http://127.0.0.1:8077/"
}
}<?php
$captcha_id = 'YOUR_CAPTCHA_ID';
$captcha_key = 'YOUR_CAPTCHA_KEY';
$api_server = 'http://gcaptcha4.geetest.com';
// Odbieramy parametry z frontendu
$lot_number = $_POST['lot_number'] ?? '';
$captcha_output = $_POST['captcha_output'] ?? '';
$pass_token = $_POST['pass_token'] ?? '';
$gen_time = $_POST['gen_time'] ?? '';
// Generujemy podpis (sign_token)
$sign_token = hash_hmac('sha256', $lot_number, $captcha_key);
// Budujemy dane żądania
$data = [
'lot_number' => $lot_number,
'captcha_output' => $captcha_output,
'pass_token' => $pass_token,
'gen_time' => $gen_time,
'sign_token' => $sign_token
];
// Żądanie do wtórnego API weryfikacyjnego
$url = $api_server . '/validate?captcha_id=' . $captcha_id;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data),
'timeout' => 5
]
];
$context = stream_context_create($options);
$result = @file_get_contents($url, false, $context);
if ($result === FALSE) {
$response = ['login' => 'fail', 'reason' => 'request geetest api fail'];
} else {
$gt_msg = json_decode($result, true);
if ($gt_msg['result'] === 'success') {
$response = ['login' => 'success', 'reason' => $gt_msg['reason']];
} else {
$response = ['login' => 'fail', 'reason' => $gt_msg['reason']];
}
}
echo json_encode($response);
?>
Obsługiwane captchas
Jeśli przejąłeś stronę internetową, na której jest już zainstalowany captcha lub inny system zabezpieczeń, a jednocześnie nie masz dostępu do kodu — to nic strasznego! Dość łatwo jest ustalić, jaka dokładnie technologia jest używana. Aby sprawdzić poprawność działania, możesz skorzystać z usługi rozpoznawania CapMonster Cloud w odizolowanym środowisku testowym, żeby upewnić się, że mechanizm przetwarzania tokenów i logika weryfikacji działają prawidłowo.
W przypadku GeeTest CAPTCHA v4 wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować GeeTest CAPTCHA v4 oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.