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 Cloudflare Turnstile, 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 Cloudflare Turnstile, 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ć Cloudflare Turnstile przez CapMonster Cloud
Podczas testowania formularzy z Cloudflare Turnstile 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 Cloudflare Turnstile należy określić następujące parametry:
type - TurnstileTask;
websiteURL - adres strony, na której rozwiązywana jest CAPTCHA;
websiteKey - klucz Turnstile.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";
async function main() {
// 1. Rozwiązanie Turnstile przez CapMonster Cloud
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
);
const turnstileRequest = new TurnstileRequest({
websiteURL: 'http://tsmanaged.zlsupport.com',
websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
});
const result = await cmcClient.Solve(turnstileRequest);
const token = result.solution.token;
console.log('Otrzymano token Turnstile:', token);
// 2. Uruchomienie Playwright
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('http://tsmanaged.zlsupport.com');
// 3. Wypełnienie loginu i hasła
await page.fill('#username', 'your_username');
await page.fill('#password', 'your_password');
// 4. Oczekiwanie na pojawienie się ukrytego pola tokena
await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });
// 5. Wstawianie tokena i uczynienie pola widocznym
await page.evaluate((t) => {
const tokenInput = document.querySelector('#token');
if (tokenInput) {
tokenInput.type = 'text'; // uczynić pole widocznym
tokenInput.value = t; // wstawić token
console.log('Token wstawiony do pola token');
} else {
console.error('Pole #token nie znalezione');
}
}, token);
// 6. Sprawdzenie, czy token został rzeczywiście wstawiony
const checkValue = await page.$eval('#token', el => el.value);
console.log('Sprawdzanie wartości tokena:', checkValue);
// 7. Wysyłanie formularza
await page.click('button[type="submit"]');
console.log('Formularz wysłany z tokenem Turnstile');
// await browser.close();
}
main().catch(err => console.error(err));1. Przejdź do strony Cloudflare Turnstile, kliknij Zacznij teraz.
2. Zarejestruj się w serwisie.
3. W Turnstile Widgets kliknij niebieski przycisk Add Widget.

4. Skonfiguruj Cloudflare Turnstile, określ:
- Widget name—nazwa CAPTCHA (dla wygody, np. Login form).
- Hostname Management—domeny, na których CAPTCHA będzie działać (np. example.com).
- Widget Mode:
- Managed—optymalna opcja, CAPTCHA sama decyduje, czy pokazać pole wyboru.
- Non-interactive—weryfikacja jest wykonywana automatycznie bez kliknięć.
- Invisible—całkowicie niewidoczna.
- Pre-clearance—ustaw na Yes, jeśli witryna przechodzi przez Cloudflare Proxy (aby nie powtarzać CAPTCHA).
5. Po utworzeniu widgetu otrzymasz dwa klucze—Site Key i Secret Key.

6. Podłącz część kliencką
1) Podłącz skrypt Turnstile
Automatyczne renderowanie (widget jest tworzony automatycznie przy ładowaniu strony):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>Kontrola programowa (sam tworzysz widget przez JavaScript):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>Ważne: skrypt musi być ładowany z dokładnego adresu URL. Proxy lub cache mogą powodować awarie.
2) Utwórz kontener dla widgetu
Automatycznie:
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>Programowo:
<div id="turnstile-container"></div>3) Konfiguracja widgetu
Przez atrybuty data:
<div class="cf-turnstile"
data-sitekey="<YOUR_SITEKEY>"
data-theme="light"
data-size="normal"
data-callback="onSuccess">
</div>Przez JavaScript:
const widgetId = turnstile.render("#turnstile-container", {
sitekey: "<YOUR_SITEKEY>",
theme: "light",
size: "normal",
callback: token => console.log("Token:", token)
});4) Praca z tokenami
const token = turnstile.getResponse(widgetId); // pobierz token
const isExpired = turnstile.isExpired(widgetId); // sprawdź wygaśnięcie
turnstile.reset(widgetId); // zresetuj
turnstile.remove(widgetId); // usuń
turnstile.execute("#turnstile-container"); // wykonanie ręczne
5) Integracja z formularzem
<form id="my-form" method="POST">
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
<button type="submit">Wyślij</button>
</form>
<script>
function onSuccess(token) {
document.getElementById("cf-turnstile-response").value = token;
}
</script>
<title>Turnstile Example</title>
<!-- Podłącz skrypt Turnstile -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<h1>Przykład formularza z Turnstile</h1>
<form id="my-form">
<label for="username">Imię:</label>
<input type="text" name="username" id="username" required>
<!-- Kontener dla Turnstile -->
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>" data-callback="onTurnstileSuccess"></div>
<button type="submit">Wyślij</button>
</form>
<script>
// Callback wywoływany po przejściu CAPTCHA
function onTurnstileSuccess(token) {
console.log("Otrzymano token Turnstile:", token);
// Zapisz token w ukrytym polu formularza (opcjonalnie)
document.getElementById("cf-turnstile-token")?.remove();
const input = document.createElement("input");
input.type = "hidden";
input.name = "cf-turnstile-response";
input.id = "cf-turnstile-token";
input.value = token;
document.getElementById("my-form").appendChild(input);
}
// Wysyłanie formularza
document.getElementById("my-form").addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const response = await fetch("/submit-form", {
method: "POST",
body: formData
});
const result = await response.json();
if(result.success){
alert("Formularz pomyślnie wysłany i token zweryfikowany!");
} else {
alert("Błąd weryfikacji tokena Turnstile. Spróbuj ponownie.");
// Zresetuj widget, aby użytkownik mógł ponownie przejść CAPTCHA
turnstile.reset();
}
});
</script>
</body>
</html>
6) Skonfiguruj część serwerową
Proces weryfikacji po stronie serwera:
- Klient: użytkownik przechodzi Turnstile na stronie → token jest tworzony.
- Formularz jest wysyłany: token wraz z danymi formularza jest wysyłany na serwer.
- Serwer: wykonuje żądanie POST do API Siteverify Cloudflare z tokenem i sekretem.
- Cloudflare: zwraca JSON z wynikiem (success: true/false) i dodatkowymi informacjami (action, hostname, czas ukończenia).
- Serwer: decyduje, czy zezwolić, czy odrzucić akcję użytkownika.
API Siteverify:
https://challenges.cloudflare.com/turnstile/v0/siteverifyParametry żądania:
- secret (wymagane): tajny klucz Turnstile z panelu Cloudflare
- response (wymagane): token otrzymany na kliencie
- remoteip (opcjonalne): adres IP użytkownika (zalecane)
- idempotency_key (opcjonalne): unikalny UUID do ochrony przed powtórzonymi weryfikacjami
Właściwości tokena:
- Maksymalna długość: 2048 znaków
- Ważny przez 5 minut
- Jednorazowy
- Po wygaśnięciu lub ponownej weryfikacji API zwróci błąd timeout-or-duplicate
<?php
function validateTurnstile($token, $secret, $remoteip = null) {
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$data = ['secret' => $secret, 'response' => $token];
if ($remoteip) $data['remoteip'] = $remoteip;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$response = file_get_contents($url, false, stream_context_create($options));
if ($response === FALSE) {
return ['success' => false, 'error-codes' => ['internal-error']];
}
return json_decode($response, true);
}
// Użycie
$secret_key = 'YOUR_SECRET_KEY';
$token = $_POST['cf-turnstile-response'] ?? '';
$remoteip = $_SERVER['REMOTE_ADDR'];
$result = validateTurnstile($token, $secret_key, $remoteip);
if($result['success']){
echo "Formularz pomyślnie wysłany!";
} else {
echo "Błąd weryfikacji: " . implode(', ', $result['error-codes']);
}
?>
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 Cloudflare Turnstile wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować Cloudflare Turnstile oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.