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 FunCaptcha (Arkose Labs CAPTCHA), 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 FunCaptcha (Arkose Labs CAPTCHA), 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ć FunCaptcha przez CapMonster Cloud
- Otwórz stronę z formularzem i upewnij się, że captcha jest widoczna.
- Spróbuj wysłać formularz bez rozwiązania captchy — serwer powinien zwrócić błąd.
- Po poprawnym rozwiązaniu captchy — formularz powinien zostać wysłany bez błędów.
Praca z CapMonster Cloud poprzez API zazwyczaj obejmuje następujące kroki:
type - FunCaptchaTask
websiteURL - adres strony, na której captcha jest rozwiązywana;
websitePublicKey - klucz FunCaptcha (wartość public key lub pk);
data - dodatkowy parametr. Wymagany, jeśli na stronie użyto data[blob];
funcaptchaApiJSSubdomain - subdomena Arkose Labs (wartość surl). Podaj, jeśli różni się od standardowej: client-api.arkoselabs.com
userAgent - User-Agent przeglądarki. Podawaj tylko aktualny UA z systemu Windows.
Do tego zadania konieczne jest użycie własnych proxy:
proxyType :
- http - standardowy proxy HTTP/HTTPS;
- https - użyj, jeśli 'http' nie działa (wymagane dla niektórych niestandardowych proxy);
- socks4 - proxy typu SOCKS4;
- socks5 - proxy typu SOCKS5.
proxyAddress - Adres IP proxy IPv4/IPv6.
proxyPort - Port proxy.
proxyLogin - Login serwera proxy.
proxyPassword - Hasło serwera proxy.
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "FunCaptchaTask",
"websiteURL": "https://www.example.com",
"websitePublicKey": "EX72CCFB-26EX-40E5-91E6-85EX70BE98ED",
"funcaptchaApiJSSubdomain": "example-api.arkoselabs.com",
"data": "{\"blob\":\"nj9UbL+yio7goOlTQ/b64t.ayrrBnP6kPgzlKYCP/kv491lKS...Wot/7gjpyIxs7VYb0+QuRcfQ/t6bzh5pXDkOFSskA/V/ITSVZSAlglIplLcdreZ4PE8skfMU6k1Q\"}",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
"proxyType": "http", // Dodaj proxy, jeśli jest potrzebne
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere"
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"errorCode": null,
"errorDescription": null,
"solution": {
"token": "337187b9f57678923.5060184402|r=us-west-2|lang=en|pk=EX72CCFB-26EX-40E5-91E6-85EX70BE98ED|at=40|ag=101|cdn_url=https%3A%2F%2Fclient-api.arkoselabs.com%2Fcdn%2Ffc|surl=https%3A%2F%2Fclient-api.arkoselabs.com|smurl=https%3A%2F%2Fclient-api.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
},
"status": "ready"
}
// npm install playwright
const { chromium } = require("playwright");
const WEBSITE_URL = "https://example.com";
// token otrzymany od CapMonster Cloud
const FUN_CAPTCHA_TOKEN = "PUT_YOUR_FUN_CAPTCHA_TOKEN_HERE";
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
/**
* Uniwersalny przechwytywacz Arkose (v1 / v2)
* Wykonywane przed załadowaniem strony
*/
await page.addInitScript(() => {
const callbacks = [];
function captureCallback(cb, source) {
if (typeof cb === "function") {
callbacks.push(cb);
console.log("[Arkose] callback captured from", source);
}
}
function patchRender(obj, name) {
if (!obj || typeof obj.render !== "function") return;
const originalRender = obj.render;
obj.render = function (container, options = {}) {
captureCallback(options.callback, name + ".render");
return originalRender.apply(this, arguments);
};
}
// Przechwycenie przez Object.defineProperty (często używane w Arkose)
const originalDefineProperty = Object.defineProperty;
Object.defineProperty = function (target, prop, descriptor) {
if (
(prop === "FunCaptcha" || prop === "ArkoseEnforcement") &&
descriptor &&
typeof descriptor.value === "object"
) {
patchRender(descriptor.value, prop);
}
return originalDefineProperty.apply(this, arguments);
};
// Fallback: okresowe sprawdzanie obiektów globalnych
const interval = setInterval(() => {
if (window.FunCaptcha) patchRender(window.FunCaptcha, "FunCaptcha");
if (window.ArkoseEnforcement)
patchRender(window.ArkoseEnforcement, "ArkoseEnforcement");
if (callbacks.length > 0) clearInterval(interval);
}, 200);
// Uniwersalny punkt do przekazania tokena
window.__arkoseSolve = function (token) {
if (callbacks.length > 0) {
callbacks.forEach((cb) => cb(token));
console.log("[Arkose] token delivered via captured callbacks");
return true;
}
// Alternatywne opcje
if (typeof window.arkoseCallback === "function") {
window.arkoseCallback(token);
console.log("[Arkose] token delivered via arkoseCallback");
return true;
}
// Fallback
window._arkoseToken = token;
console.log("[Arkose] token stored in window._arkoseToken");
return false;
};
});
/**
* Otwórz stronę
*/
console.log("Opening page...");
await page.goto(WEBSITE_URL, { waitUntil: "domcontentloaded" });
/**
* Tutaj strona powinna zainicjalizować FunCaptcha
* (rejestracja, logowanie, przycisk, formularz itp.)
*/
/**
* Przekazujemy gotowy token
*/
console.log("Injecting FunCaptcha token...");
await page.evaluate((token) => {
if (!window.__arkoseSolve) {
console.log("[Arkose] solver not ready");
return;
}
window.__arkoseSolve(token);
}, FUN_CAPTCHA_TOKEN);
/**
* Daj stronie czas na przetworzenie wyniku
*/
await page.waitForTimeout(5000);
console.log("Done.");
await browser.close();
})();
- Zarejestruj się w Arkose Labs i uzyskaj dostęp do Arkose Command Center (można wysłać dane w czacie w formularzu — np. tutaj lub tutaj).
Po uzyskaniu dostępu pobierz dwa klucze (Public / Private) w sekcji Settings → Keys.

W razie potrzeby skontaktuj się z Customer Success Manager (CSM) w celu:
- uzyskania niestandardowych domen API;
- weryfikacji schematów żądań i odpowiedzi API.
Zalecenia Arkose
- Do testów używaj Development Key.
- Dla każdego workflow używaj osobnego Production Key (login, rejestracja, zakup itd.).
- Używaj różnych kluczy dla różnych stron.
Ogólny proces działania
- Klient zbiera dane i w razie potrzeby pokazuje challenge.
- Klient otrzymuje jednorazowy token.
- Serwer weryfikuje token przez Arkose Verify API.
Krok 1. Integracja po stronie klienta
Po stronie przeglądarki (Arkose Bot Manager):
- analizuje zachowanie użytkownika;
- pokazuje w razie potrzeby Enforcement Challenge;
- zwraca token sesji.
Client API:
- Do testów można użyć:
client-api.arkoselabs.com - Dla produkcji warto wskazać niestandardową domenę:
<company>-api.arkoselabs.com
Główne wymagania
- Skrypt klienta Arkose podłączany jest tylko raz na stronę
- Koniecznie zdefiniuj globalny callback
- Konieczne wywołanie setConfig()
- Na podstawie wyniku podejmowana jest decyzja o zezwoleniu lub odrzuceniu akcji.
Wynik klienta — token, który należy wysłać na serwer.
<html>
<head>
<!--
Podłącz API Arkose Labs w <head> strony. W przykładzie upewnij się:
- zamień <YOUR PUBLIC KEY> na publiczny klucz wydany przez Arkose Labs;
- zamień <YOUR CALLBACK> na nazwę globalnej funkcji callback, którą zdefiniujesz.
Przykład:
<script src="//client-api.arkoselabs.com/v2/<YOUR PUBLIC KEY>/api.js"
data-callback="setupDetect"></script>
-->
<script src="//client-api.arkoselabs.com/v2/<YOUR PUBLIC KEY>/api.js" data-callback="<YOUR CALLBACK>"></script>
<link rel="shortcut icon" href="#">
<meta charset="UTF-8">
</head>
<body>
<!--
Element wyzwalający może znajdować się w dowolnym miejscu strony i może być dodany do DOM w dowolnym momencie.
-->
<button id="arkose-trigger">
element wyzwalający
</button>
<!--
Do konfiguracji Arkose (tryb detection lub enforcement) umieść skrypt przed zamknięciem </body> i zdefiniuj funkcję callback jako globalną.
-->
<script>
/*
Funkcja globalna zostanie wywołana, gdy API Arkose będzie gotowe. Nazwa funkcji musi zgadzać się z atrybutem data-callback w tagu script ładującym Arkose API.
*/
function setupArkose(myArkose) {
myArkose.setConfig({
selector: '#arkose-trigger',
onCompleted: function(response) {
// Jednorazowy token, który należy wysłać na serwer
console.log(response.token);
}
});
}
</script>
</body>
</html>
Krok 2. Weryfikacja po stronie serwera
Na serwerze wykonywana jest weryfikacja tokena przez Arkose Verify API.
Verify API endpoint
https://<company>-verify.arkoselabs.com/api/v4/verify/Wymagane parametry żądania
- private_key — prywatny klucz Arkose
- session_token — token otrzymany od klienta
Przykład ciała żądania POST
{
"private_key": "_PRIVATE_KEY_HERE_",
"session_token": "_SESSION_TOKEN_HERE_",
"log_data": "_LOG_DATA_HERE_"
}
Odpowiedź API zawiera informacje o sesji i wynik weryfikacji.
Kluczowe punkty
- Public Key — tylko klient
- Private Key — tylko serwer
- Token jednorazowy
- Bez weryfikacji serwera captcha jest nieprawidłowa
- Arkose może działać w tle i pokazywać challenge tylko przy ryzyku
<?php
$private_key = 'YOUR_PRIVATE_KEY';
$verify_url = 'https://<company>-verify.arkoselabs.com/api/v4/verify/';
$input = json_decode(file_get_contents('php://input'), true);
$session_token = $input['session_token'] ?? null;
$log_data = $input['log_data'] ?? '';
$email_address = $input['email_address'] ?? '';
if (!$session_token) {
http_response_code(400);
echo json_encode(['error' => 'Brak tokena sesji']);
exit;
}
$data = [
'private_key' => $private_key,
'session_token' => $session_token,
'log_data' => $log_data,
'email_address' => $email_address
];
$options = [
'http' => [
'header' => "Content-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data),
],
];
$context = stream_context_create($options);
$result = file_get_contents($verify_url, false, $context);
if ($result === FALSE) {
http_response_code(500);
echo json_encode(['error' => 'Błąd podczas weryfikacji captchy']);
exit;
}
echo $result;
?>
Jak to działa:
- Klient rozwiązuje captchę na stronie i otrzymuje token sesji.
- Klient wysyła token do serwera przez POST.
- Serwer wywołuje Arkose Verify API z prywatnym kluczem i tokenem sesji
- Arkose zwraca JSON z informacjami o sesji i statusie weryfikacji.
- Serwer sprawdza wynik (result.success) i decyduje, czy zezwolić użytkownikowi na dalsze działania.
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 FunCaptcha wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować FunCaptcha oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.