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.
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.
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/142.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:
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:
API Siteverify:
https://challenges.cloudflare.com/turnstile/v0/siteverifyParametry żądania:
Właściwości tokena:
<?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']);
}
?>
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.