Explainers

Объяснение невидимых систем CAPTCHA: как они работают

Невидимые CAPTCHA проверяют пользователей, не показывая видимых проблем. Здесь нет флажка, который нужно щелкнуть, нет сетки изображений, которую нужно решить, и нет текста, который нужно ввести. Проверка происходит полностью в фоновом режиме с помощью JavaScript, который анализирует поведение браузера, сигналы устройств и репутацию сети. Если в вашем рабочем процессе автоматизации встречается форма, которая корректно отправляется для некоторых пользователей, но блокируется для других — без видимой CAPTCHA на странице — вы имеете дело с невидимой системой CAPTCHA.


Как работают невидимые CAPTCHA

Все невидимые CAPTCHA следуют одному и тому же базовому шаблону:

Page loads → CAPTCHA JavaScript injected
    ↓
Script runs in background, collecting signals:
  ├─ Browser сигналы браузера (canvas, WebGL, fonts, plugins)
  ├─ Behavioral data (mouse, keyboard, scroll, timing)
  ├─ Network data (IP reputation, TLS сигналы браузера)
  ├─ Device data (screen, GPU, CPU cores, memory)
  └─ History data (cookies, previous CAPTCHA completions)
    ↓
Signals sent to CAPTCHA provider's risk engine
    ↓
Risk score computed
    ↓
Response varies by score:
  ├─ Low risk  → Token issued silently (user sees nothing)
  ├─ Medium    → Light challenge shown (checkbox, simple click)
  └─ High risk → Full challenge (image grid) or block

Ключевое отличие от видимых CAPTCHA: проверка происходит непрерывно с момента загрузки страницы, а не только тогда, когда пользователь нажимает флажок.


Основные невидимые системы CAPTCHA

1. ЗЗТОКЕН0ЗЗ

Поставщик: Google Релиз: 2018 г. Доля рынка: Самая высокая среди невидимых CAPTCHA.

reCAPTCHA v3 возвращает оценку с плавающей запятой от 0,0 до 1,0 для каждого действия на странице. Владелец сайта решает, что делать со счетом.

Как он собирает сигналы:

<!-- reCAPTCHA v3 integration -->
<script src="https://www.google.com/recaptcha/api.js?render=SITE_KEY"></script>
<script>
  grecaptcha.ready(function() {
    grecaptcha.execute('SITE_KEY', { action: 'login' }).then(function(token) {
      // Token sent to server for verification
      document.getElementById('captcha-token').value = token;
    });
  });
</script>

Вызов execute() запускает сбор сигналов по требованию. За кулисами reCAPTCHA собирает данные с момента загрузки скрипта.

Интерпретация оценок:

Счет Значение Типичное действие
0,9 Очень вероятно, человек Позволять
0,7 Вероятно, человек Разрешить с мониторингом
0,5 Неопределенный Требовать дополнительную проверку
0,3 Наверное бот Заблокировать или показать reCAPTCHA v2
0,1 Очень вероятно, что бот Блокировать

Обнаружение в источнике страницы:

import requests
import re

def detect_recaptcha_v3(url):
    html = requests.get(url, timeout=10).text
    indicators = {
        "recaptcha_v3": False,
        "site_key": None,
        "actions": [],
    }

    # Check for v3 script
    if "recaptcha/api.js?render=" in html:
        indicators["recaptcha_v3"] = True
        match = re.search(r"render=([A-Za-z0-9_-]+)", html)
        if match:
            indicators["site_key"] = match.group(1)

    # Find action names
    actions = re.findall(r"action:\s*['\"](\w+)['\"]", html)
    indicators["actions"] = actions

    return indicators

print(detect_recaptcha_v3("https://https://staging.example.com/qa-login"))

2. ЗЗТОКЕН0ЗЗ

Поставщик: Cloudflare Релиз: 2022 г. Доля рынка: быстрый по нашей внутренней выборке рост

Cloudflare Turnstile использует многоступенчатый конвейер проверки, не требующий сбора пользовательских данных.

Этапы проверки:

  1. Проверка токена частного доступа — если браузер поддерживает Apple PAT, проверка завершается мгновенно.
  2. Неинтерактивная задача — Браузер решает легкую криптографическую головоломку с доказательством выполнения работы.
  3. Управляемая задача — Cloudflare выбирает между неинтерактивным и интерактивным режимом на основе сигналов риска из своей сети (более 20 % интернет-трафика проходит через Cloudflare).
  4. Интерактивный вызов — отображается только при высоком уровне риска; отображает виджет в виде флажка

Интеграция:

<!-- Turnstile widget -->
<div class="cf-turnstile" data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

Обнаружение:

def detect_turnstile(url):
    html = requests.get(url, timeout=10).text
    indicators = {
        "turnstile": False,
        "site_key": None,
    }

    if "challenges.cloudflare.com/turnstile" in html or "cf-turnstile" in html:
        indicators["turnstile"] = True
        match = re.search(r'data-sitekey="([^"]+)"', html)
        if match:
            indicators["site_key"] = match.group(1)

    return indicators

3. reCAPTCHA v2 Невидимый

Поставщик: Google Релиз: 2017 г.

Это reCAPTCHA v2, который запускается программно при отправке формы. Флажок не отображается — пользователь нажимает кнопку отправки, и reCAPTCHA запускается в фоновом режиме. Если оценка риска достаточно высока, во всплывающем окне появится видимое изображение проблемы.

Интеграция:

<button class="g-recaptcha"
        data-sitekey="SITE_KEY"
        data-callback="onSubmit"
        data-size="invisible">
    Submit
</button>

Ключевое отличие от версии 3: Версия 2 Invisible по-прежнему представляет собой видимую проблему для рискованных пользователей. Версия 3 никогда не демонстрирует видимых проблем — веб-сайт должен решить, что делать со счетом.

4. hCaptcha Пассивный (корпоративный)

Поставщик: Машины интуиции Доступность: только для уровня Enterprise.

Пассивный режим hCaptcha Enterprise оценивает пользователя без каких-либо видимых виджетов. Он использует те же поведенческие сигналы, что и стандартный hCaptcha, но представляет собой визуальную проблему только для самых подозрительных посетителей.

5. Токены частного доступа Apple

Поставщик: Apple Доступность: iOS 16+, macOS Ventura+

Это не провайдер CAPTCHA, а механизм контролируемая проверка CAPTCHA. Устройства Apple подтверждают свою подлинность посредством аттестации оборудования, что позволяет веб-сайтам полностью пропускать CAPTCHA.

Device attestation:

  1. Website requests a challenge from a token issuer
  2. Device proves it is genuine without revealing identity
  3. Token issuer generates a blind-signed token
  4. Website verifies token → CAPTCHA skipped

Поддерживается Cloudflare, Fastly и другими провайдерами CDN.


Решение невидимых CAPTCHA с помощью CaptchaAI

Невидимые CAPTCHA по-прежнему генерируют токены, которые необходимо отправлять с помощью форм. Решатели на основе API генерируют эти токены извне.

Решение reCAPTCHA v3

import requests
import time

API_KEY = "YOUR_API_KEY"

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "6LdKlZEpAAAAAAOQjzC2v_d36tWxCl6dWsozdSy9",
    "pageurl": "https://https://staging.example.com/qa-login",
    "version": "v3",
    "action": "login",
    "json": 1,
})

task_id = submit.json()["request"]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        print(f"reCAPTCHA v3 token received (score ≥ 0.9)")
        break

Решение Cloudflare Turnstile

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "turnstile",
    "sitekey": "0x4AAAAAAAC3DHQhMMQ_Rxrg",
    "pageurl": "https://example.com/signup",
    "json": 1,
})

task_id = submit.json()["request"]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY,
        "action": "get",
        "id": task_id,
        "json": 1,
    }).json()

    if result.get("status") == 1:
        turnstile_token = result["request"]
        print(f"Turnstile token received")
        break

Node.js — Решение reCAPTCHA v3

const axios = require("axios");

async function solveRecaptchaV3(siteKey, pageUrl, action) {
    const API_KEY = "YOUR_API_KEY";

    // Submit
    const { data: submit } = await axios.post(
        "https://ocr.captchaai.com/in.php",
        new URLSearchParams({
            key: API_KEY,
            method: "userrecaptcha",
            googlekey: siteKey,
            pageurl: pageUrl,
            version: "v3",
            action: action,
            json: 1,
        })
    );

    const taskId = submit.request;

    // Poll
    for (let i = 0; i < 60; i++) {
        await new Promise((r) => setTimeout(r, 5000));
        const { data: result } = await axios.get(
            "https://ocr.captchaai.com/res.php",
            {
                params: {
                    key: API_KEY,
                    action: "get",
                    id: taskId,
                    json: 1,
                },
            }
        );

        if (result.status === 1) {
            return result.request;
        }
    }

    throw new Error("Solve timeout");
}

solveRecaptchaV3("SITE_KEY", "https://https://staging.example.com/qa-login", "login")
    .then((token) => console.log("Token:", token.substring(0, 50) + "..."));

Обнаружение невидимых CAPTCHA: комплексная проверка

import requests
import re

def detect_invisible_captcha(url):
    """Detect all invisible CAPTCHA types on a page."""
    html = requests.get(url, timeout=10).text

    results = []

    # reCAPTCHA v3
    if "recaptcha/api.js?render=" in html:
        key = re.search(r"render=([A-Za-z0-9_-]+)", html)
        results.append({
            "type": "reCAPTCHA v3",
            "site_key": key.group(1) if key else "unknown",
            "solver_method": "userrecaptcha (version=v3)",
        })

    # reCAPTCHA v2 invisible
    if 'data-size="invisible"' in html and "g-recaptcha" in html:
        key = re.search(r'data-sitekey="([^"]+)"', html)
        results.append({
            "type": "reCAPTCHA v2 Invisible",
            "site_key": key.group(1) if key else "unknown",
            "solver_method": "userrecaptcha (invisible=1)",
        })

    # Cloudflare Turnstile
    if "challenges.cloudflare.com/turnstile" in html:
        key = re.search(r'data-sitekey="([^"]+)"', html)
        results.append({
            "type": "Cloudflare Turnstile",
            "site_key": key.group(1) if key else "unknown",
            "solver_method": "turnstile",
        })

    # hCaptcha (passive mode detected by script without visible widget)
    if "hcaptcha.com/1/api.js" in html and 'data-size="invisible"' in html:
        results.append({
            "type": "hCaptcha Passive",
            "solver_method": "hcaptcha",
        })

    if not results:
        results.append({"type": "none detected"})

    return results

for item in detect_invisible_captcha("https://example.com"):
    print(item)

Сравнение невидимых CAPTCHA

Особенность reCAPTCHA v3 Cloudflare Turnstile reCAPTCHA v2 Невидимый hCaptcha пассивный
Видимый вызов Никогда Редко Иногда (резервный вариант) Редко
Конфиденциальность Собирает данные о просмотре Никаких личных данных Собирает данные о просмотре Собирает данные о взаимодействии
Расходы Бесплатно (1M/month) Бесплатно (без ограничений) Бесплатно (1M/month) Только предприятие
Оценка возвращена Да (0,0-1,0) Нет (pass/fail) Нет (pass/fail) Да (Предприятие)
Резервный видимый вызов Сайт решает Под управлением Cloudflare Всплывающее окно сетки изображений Всплывающее окно сетки изображений
Поддержка CaptchaAI Да (токен v3) Да (высокая доля успешных решений) Да (токен) Связаться со службой поддержки

Примеры политики оценки

  • Определите, что происходит при высоких, средних и низких оценках, прежде чем рабочий процесс достигнет рабочего трафика.
  • Используйте результаты со средним баллом для запуска дополнительных проверок, а не рассматривайте каждый балл ниже целевого как провал.
  • Записывайте распределение оценок во времени, чтобы смещение пороговых значений на целевой стороне стало заметным до того, как конверсия упадет.

Часто задаваемые вопросы

Как узнать, есть ли на странице невидимая капча?

Проверьте источник страницы на наличие скриптов поставщика CAPTCHA. Ищите recaptcha/api.js?render= (reCAPTCHA v3), challenges.cloudflare.com/turnstile (Cloudflare Turnstile) или hcaptcha.com/1/api.js с data-size="invisible" (пассивная hCaptcha). Виджет CAPTCHA не имеет видимого присутствия на странице, поэтому вам необходимо проверить HTML или сетевые запросы.

Генерирует ли невидимая CAPTCHA токен?

Да. Невидимые CAPTCHA генерируют токены, которые необходимо включать в отправку форм. Токен помещается в скрытое поле формы или отправляется как параметр запроса. Решатели на основе API генерируют эти токены извне.

Могут ли невидимые CAPTCHA заблокировать мою автоматизацию, не показывая никаких ошибок?

Да. Если ваша автоматизация не включает действительный токен CAPTCHA в отправку формы, сервер автоматически отклонит запрос или вернет общую ошибку. Не будет видимого вызова CAPTCHA — запрос просто не будет выполнен, потому что токен отсутствует или недействителен.

Является ли reCAPTCHA v3 более безопасным, чем reCAPTCHA v2?

reCAPTCHA v3 сложнее обнаружить визуально (виджета на странице нет), но он не обязательно более безопасен. v3 возвращает оценку, в соответствии с которой веб-сайт должен действовать — если порог установлен слишком низко, боты легко пройдут проверку. Версия 2 бросает серьезный вызов /response. На практике версия 3 со строгим порогом (0,7+) плюс версия 2 в качестве запасного варианта обеспечивает наилучшую безопасность.


Краткое содержание

Невидимые CAPTCHA проверяют пользователей посредством фонового JavaScript-анализа поведения браузера, сигналы браузера устройств и репутации сети — без какого-либо видимого взаимодействия. reCAPTCHA v3 и Cloudflare Turnstile являются доминирующими реализациями, при этом Turnstile растет быстрее всего благодаря своей бесплатной цене и дизайну, ориентированному на конфиденциальность. Для автоматизации невидимых CAPTCHA по-прежнему требуются действительные токены. ИспользоватьCaptchaAIдля генерации этих токенов: reCAPTCHA v3 с помощью метода userrecaptcha с version=v3 и Cloudflare Turnstile с помощью метода turnstile с высокой долей успешных решений.

Похожие статьи

Комментарии для этой статьи отключены.