Технические разборы

reCAPTCHA v2 Invisible: обнаружение и решение триггеров

reCAPTCHA v2 Invisible не имеет видимого флажка. Он активируется автоматически, когда пользователь отправляет форму или нажимает кнопку, и отображает вызов только в том случае, если анализ рисков Google обнаруживает подозрительное поведение. Это усложняет обнаружение при автоматизации — вы можете не осознавать наличие CAPTCHA, пока не завершится ошибка отправки формы.


Чем Invisible reCAPTCHA отличается от стандартной версии v2

Особенность reCAPTCHA v2 Стандартный reCAPTCHA v2 Невидимый
Видимый виджет Да (флажок) Нет (только значок)
Взаимодействие с пользователем Нажмите флажок Автоматически при отправке формы
data-size normal или compact invisible
Всплывающее окно вызова Всегда возможно Только для подозрительных пользователей
DOM-элемент .g-recaptcha дел. .g-recaptcha div или программный

Обнаружение невидимой reCAPTCHA

Способ 1. Проверьте атрибут размера данных.

// Browser console
const widgets = document.querySelectorAll('.g-recaptcha');
widgets.forEach((el, i) => {
  const size = el.getAttribute('data-size');
  const sitekey = el.getAttribute('data-sitekey');
  console.log(`Widget ${i}: size=${size}, sitekey=${sitekey}`);
  if (size === 'invisible') {
    console.log('  → This is Invisible reCAPTCHA');
  }
});

Способ 2. Проверьте наличие значка.

Невидимая reCAPTCHA показывает небольшой значок в углу:

const badge = document.querySelector('.grecaptcha-badge');
if (badge) {
  console.log('reCAPTCHA badge found — likely Invisible reCAPTCHA');
  console.log('Badge visibility:', getComputedStyle(badge).visibility);
}

Способ 3. Проверьте вызовы grecaptcha.execute

Если на странице используется программный вызов (без элемента div .g-recaptcha):

// Look for grecaptcha.execute in page scripts
document.querySelectorAll('script:not([src])').forEach(s => {
  if (s.textContent.includes('grecaptcha.execute')) {
    console.log('Found grecaptcha.execute — Invisible reCAPTCHA');
    const match = s.textContent.match(/grecaptcha\.execute\s*\(\s*['"]?([^'",\s)]+)/);
    if (match) console.log('Sitekey:', match[1]);
  }
});

Способ 4. Проверьте параметр рендеринга тега скрипта

document.querySelectorAll('script[src*="recaptcha"]').forEach(s => {
  if (s.src.includes('render=') && !s.src.includes('render=explicit')) {
    console.log('Invisible/v3 reCAPTCHA detected in script:', s.src);
  }
});

Решение с помощью CaptchaAI

Ключевое отличие: передайте invisible=1 в CaptchaAI, чтобы решатель знал, что обрабатывает невидимый вариант.

Питон

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit with invisible flag
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "6Le-SITEKEY",
    "pageurl": "https://https://staging.example.com/qa-login",
    "invisible": "1",  # critical for Invisible reCAPTCHA
    "json": "1",
}).json()

if resp["status"] != 1:
    raise Exception(f"Submit error: {resp['request']}")

task_id = resp["request"]
print(f"Submitted: {task_id}")

# Poll for result
for _ in range(24):
    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["status"] == 1:
        print(f"Token: {result['request'][:50]}...")
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(f"Error: {result['request']}")

JavaScript

const axios = require('axios');

const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: 'YOUR_API_KEY',
    method: 'userrecaptcha',
    googlekey: '6Le-SITEKEY',
    pageurl: 'https://https://staging.example.com/qa-login',
    invisible: 1,
    json: 1,
  }
});
const taskId = resp.data.request;
console.log(`Submitted: ${taskId}`);

передача токена во внутренний QA endpoint для невидимой reCAPTCHA

Невидимая reCAPTCHA обычно привязана к кнопке или отправке формы. После инъекции вам необходимо запустить обратный вызов или отправить форму:

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://https://staging.example.com/qa-login")

# After solving, inject and trigger
driver.execute_script("""
    // Set the token
    document.querySelector('textarea[name="g-recaptcha-response"]').value = arguments[0];

    // Find and trigger the callback
    var widget = document.querySelector('.g-recaptcha');
    var callbackName = widget ? widget.getAttribute('data-callback') : null;

    if (callbackName && typeof window[callbackName] === 'function') {
        window[callbackName](arguments[0]);
    }
""", token)

# Submit the form
driver.find_element(By.CSS_SELECTOR, "form#login").submit()

Определение триггерного элемента

Невидимую reCAPTCHA можно привязать к определенной кнопке:

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

Или активировать программно:

// Site's code
document.getElementById('submit-btn').addEventListener('click', function() {
  grecaptcha.execute();
});

Проверьте оба шаблона:

// Find elements with g-recaptcha class that are buttons
document.querySelectorAll('button.g-recaptcha, input.g-recaptcha').forEach(el => {
  console.log('Trigger element:', el.tagName, el.textContent.trim());
  console.log('  data-sitekey:', el.getAttribute('data-sitekey'));
  console.log('  data-callback:', el.getAttribute('data-callback'));
});

Поиск неисправностей

Проблема Причина Исправить
Токен отклонен В отправке отсутствует invisible=1 Добавьте invisible: "1" в запрос CaptchaAI
Не могу найти ключ сайта Нет элемента .g-recaptcha Проверьте программные вызовы grecaptcha.render() или grecaptcha.execute().
Форма отправляется, но не получается Обратный звонок не запущен Найдите и вызовите функцию data-callback.
Капча не обнаружена Появляется только для подозрительного трафика Проверьте наличие элемента grecaptcha-badge или тегов сценария рекапчи.

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

Как отличить Invisible v2 от v3?

Invisible v2 использует grecaptcha.execute() без параметра action. v3 использует grecaptcha.execute(sitekey, {action: 'submit'}) с действием. Кроме того, версия 3 использует render=SITEKEY в URL-адресе сценария.

Имеет ли значение забвение невидимого флага?

Да. Без invisible=1 решатель может попробовать другой подход к решению, в результате которого будут получены токены, отклоненные сайтом.

Могу ли я решить Invisible reCAPTCHA без браузера?

Да, вам нужен только ключ сайта и URL-адрес страницы. Браузер необходим только для передача токена во внутренний QA endpoint и запуска обратного вызова.


Легко решите reCAPTCHA v2 Invisible с помощью CaptchaAI

Получите ключ API по адресуcaptchaai.com.


Связанные руководства

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