Логотип «2Captcha»Перейти на главную страницу
Туториалы по обходу капчи

Эта статья была полезной?

Как работают callback функции у капчи

Грегори Фишер

Технический специалист

Многие современные сайты используют callback-функции для передачи токена капчи в бизнес-логику. Если callback не вызвать или вызвать некорректно, форма может не отправиться, даже если капча решена верно и токен полностью валиден. Разберём механизм работы callback, типичные сценарии и надёжные способы интеграции в автоскрипты с использованием 2Captcha.

Что такое callback и зачем он нужен

Callback — это JavaScript-функция, которая автоматически вызывается после успешного прохождения капчи. Она принимает токен решения и выполняет действия на стороне сайта: активирует кнопку отправки, обновляет состояние компонента, запускает клиентскую валидацию или инициирует асинхронный запрос к серверу.

В ручном сценарии виджет капчи сам вызывает эту функцию. При автоматизации через 2Captcha токен возвращается отдельно через API, и скрипт должен самостоятельно передать его в callback, чтобы сайт воспринял проверку как пройденную.

Почему простой вставки токена в html недостаточно

Начинающие разработчики часто пытаются решить проблему прямой записью токена:

javascript Copy
document.getElementById('g-recaptcha-response').value = token;

Этот подход работает только на простых статичных страницах. В современных проектах:

  • Формы управляются через state-менеджеры, которые не реагируют на прямое изменение DOM
  • Используются библиотеки валидации, подписанные на события input, change или submit
  • Токен может проверяться исключительно внутри callback, а не при чтении скрытого поля
  • Добавляются защитные механизмы: проверка контекста выполнения, временных меток и состояния формы

Без вызова callback сайт часто игнорирует токен или возвращает ошибку верификации при отправке данных.

Как найти имя callback-функции на странице

  1. Атрибут data-callback в HTML-виджете:

    html Copy
    <div class="g-recaptcha" data-sitekey="..." data-callback="onCaptchaSuccess"></div>
  2. Параметры инициализации в JavaScript:

    javascript Copy
    grecaptcha.render('widget-id', { callback: 'submitForm', sitekey: '...' });
  3. DevTools -> Elements: поиск атрибутов data-callback, data-expired-callback

  4. DevTools -> Sources / Network: поиск по ключевым словам callback, token, recaptcha, turnstile. Имя функции часто хранится в глобальной области window

  5. Фреймворковые паттерны: в React или Vue callback может передаваться через пропсы onSuccess или кастомные события

Если имя функции не указано явно, виджет использует встроенный обработчик. В этом случае достаточно вызвать стандартный метод провайдера, получить токен из скрытого поля и вручную инициировать отправку формы.

Как вызвать callback вручную после получения ответа от 2Captcha

После получения токена от 2Captcha его необходимо передать в callback через браузерную автоматизацию.

Selenium на Python:

python Copy
def invoke_callback(driver, callback_name, token):
    exists = driver.execute_script(f"return typeof window.{callback_name} === 'function';")
    if not exists:
        raise ValueError(f"Callback {callback_name} не найден в глобальной области")
    
    driver.execute_script(f"window.{callback_name}(arguments[0]);", token)

Playwright на Python:

python Copy
def invoke_callback_playwright(page, callback_name, token):
    exists = page.evaluate(f"typeof window.{callback_name} === 'function'")
    if not exists:
        raise ValueError(f"Callback {callback_name} не найден в глобальной области")
    
    page.evaluate(f"window.{callback_name}('{token}')")

Fallback для сайтов без явного callback:

python Copy
driver.execute_script("""
    const el = document.getElementById('g-recaptcha-response');
    el.value = arguments[0];
    el.dispatchEvent(new Event('input', { bubbles: true }));
    el.dispatchEvent(new Event('change', { bubbles: true }));
""", token)

Особенности невидимых капч и spa-фреймворков

Невидимые версии капчи не отображают виджет явно. Токен генерируется при программном вызове:
grecaptcha.execute('sitekey', { action: 'submit' });
или
turnstile.execute('sitekey');

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

Spa-фреймворки часто оборачивают капчу в компоненты, подписанные на изменения состояния. Прямая запись в DOM не обновляет внутренний state. Рекомендуется использовать официальный callback, если он экспортирован, либо вызывать dispatchEvent с правильными типами событий. При необходимости эмулируется последовательность кликов и фокуса, чтобы триггерить встроенные обработчики.

Типичные ошибки и способы их избежать

Ошибка: Callback вызывается слишком рано.
Причина: Виджет ещё не инициализирован, функция не существует в window.
Решение: Дождитесь загрузки скриптов и появления атрибута data-callback перед вызовом.

Ошибка: Неверное имя или область видимости.
Причина: Функция объявлена внутри модуля или замыкания.
Решение: Проверьте доступность через typeof в DevTools. Если функция недоступна, используйте эмуляцию событий input/change.

Ошибка: Токен просрочен.
Причина: Время жизни токена 2Captcha составляет 1–2 минуты.
Решение: Вызывайте callback сразу после получения статуса ready, не кэшируйте ответы между сессиями.

Ошибка: Игнорирование data-expired-callback.
Причина: Сайт обновляет UI при истечении токена.
Решение: Реализуйте повторный запрос новой капчи через 2Captcha и повторный вызов callback при обнаружении истечения.

Чеклист для надёжной интеграции с 2Captcha

  • Определите точное имя callback через data-callback или анализ исходного кода
  • Убедитесь, что функция доступна в глобальной области window
  • Дождитесь полной инициализации виджета перед внедрением токена
  • Передавайте токен сразу после получения ответа от 2Captcha, без задержек
  • При отсутствии явного callback используйте эмуляцию событий input и change
  • Обрабатывайте сценарии истечения токена и ошибки валидации
  • Логируйте этапы вызова для отладки и создания тикетов в поддержку

Полезные ресурсы

Официальная документация 2Captcha
API: https://2captcha.com/2captcha-api
Тестовые страницы для проверки интеграции: https://2captcha.com/demo
Официальные репозитории и примеры кода: https://github.com/2captcha
Личный кабинет для мониторинга задач и баланса: https://2captcha.com/dashboard

Заключение

Callback — это мост между генерацией токена и бизнес-логикой сайта. Многие проекты полагаются именно на него для разблокировки форм, запуска валидации и отправки запросов. При автоматизации через 2Captcha недостаточно просто получить токен: необходимо корректно передать его в callback или сымитировать пользовательское взаимодействие, которое его вызовет.

Соблюдение правильной последовательности — ожидание инициализации, валидация токена, вызов callback, контроль отправки формы — гарантирует стабильную работу скриптов даже на сложных spa-сайтах с динамической загрузкой капчи.