captcha.fit

Начать

Защити свой сайт с помощью спорта!

Инновационная капча с простыми спортивными заданиями.

captcha.fit Demo

Как работает SportCaptcha?

📸

Шаг 1

Пользователь сталкивается с капчей.

🏋️

Шаг 2

Выполняет спортивное задание.

Шаг 3

Проходит проверку.

Почему captcha.fit?

Уникальность

Забудьте про скучные картинки.

Интерактивность

Вовлекайте пользователей.

Безопасность

Сложно для ботов.

Гибкость

Настраивайте под себя.

Попробуй прямо сейчас!

Пример интеграции

// HTML форма с обработчиком
<form id="myForm" onsubmit="handleSubmit(event)">
    // ... поля формы ...
    <button type="submit">Отправить</button>
</form>

// JavaScript код
const PUBLIC_KEY = 'ваш_публичный_ключ';
let currentCheckInterval = null;

async function handleSubmit(event) {
    event.preventDefault();

    // Отменяем предыдущую проверку
    if (currentCheckInterval) {
        clearInterval(currentCheckInterval);
    }

    try {
        const response = await fetch('/api/generate-token', {
            method: 'POST',
            headers: {
                'X-Public-Key': PUBLIC_KEY,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
        });

        const data = await response.json();
        if (data.success) {
            showQRCode(data.qr);
            checkStatus(data.token);
        }
    } catch (error) {
        console.error('Ошибка:', error);
    }
}

function showQRCode(qrData) {
    const container = document.getElementById('qrContainer');
    container.innerHTML = \`
        QR Code
        

Отсканируйте QR-код через приложение captcha.fit

\`; container.style.display = 'block'; } function checkStatus(token) { currentCheckInterval = setInterval(async () => { try { const response = await fetch( \`/api/check-status/\${token}\`, { method: 'POST', headers: { 'X-Public-Key': PUBLIC_KEY, 'X-Signature': 'Получите от вашего сервера', 'Content-Type': 'application/json', 'Accept': 'application/json' } }); const data = await response.json(); if (data.success) { updateProgress(data); if (data.completed) { clearInterval(currentCheckInterval); submitForm(); } } } catch (error) { console.error('Ошибка:', error); clearInterval(currentCheckInterval); } }, 2000); } function updateProgress(data) { // Обновление прогресса на странице document.querySelector('.lifts-count') .textContent = data.lifts_count || 0; document.querySelector('.calories') .textContent = data.calories || 0; }`;