Эта статья была полезной?
Как работают callback функции у капчи
Технический специалист
Многие современные сайты используют callback-функции для передачи токена капчи в бизнес-логику. Если callback не вызвать или вызвать некорректно, форма может не отправиться, даже если капча решена верно и токен полностью валиден. Разберём механизм работы callback, типичные сценарии и надёжные способы интеграции в автоскрипты с использованием 2Captcha.
Что такое callback и зачем он нужен
Callback — это JavaScript-функция, которая автоматически вызывается после успешного прохождения капчи. Она принимает токен решения и выполняет действия на стороне сайта: активирует кнопку отправки, обновляет состояние компонента, запускает клиентскую валидацию или инициирует асинхронный запрос к серверу.
В ручном сценарии виджет капчи сам вызывает эту функцию. При автоматизации через 2Captcha токен возвращается отдельно через API, и скрипт должен самостоятельно передать его в callback, чтобы сайт воспринял проверку как пройденную.
Почему простой вставки токена в html недостаточно
Начинающие разработчики часто пытаются решить проблему прямой записью токена:
javascript
document.getElementById('g-recaptcha-response').value = token;
Этот подход работает только на простых статичных страницах. В современных проектах:
- Формы управляются через state-менеджеры, которые не реагируют на прямое изменение DOM
- Используются библиотеки валидации, подписанные на события input, change или submit
- Токен может проверяться исключительно внутри callback, а не при чтении скрытого поля
- Добавляются защитные механизмы: проверка контекста выполнения, временных меток и состояния формы
Без вызова callback сайт часто игнорирует токен или возвращает ошибку верификации при отправке данных.
Как найти имя callback-функции на странице
-
Атрибут data-callback в HTML-виджете:
html<div class="g-recaptcha" data-sitekey="..." data-callback="onCaptchaSuccess"></div> -
Параметры инициализации в JavaScript:
javascriptgrecaptcha.render('widget-id', { callback: 'submitForm', sitekey: '...' }); -
DevTools -> Elements: поиск атрибутов data-callback, data-expired-callback
-
DevTools -> Sources / Network: поиск по ключевым словам callback, token, recaptcha, turnstile. Имя функции часто хранится в глобальной области window
-
Фреймворковые паттерны: в React или Vue callback может передаваться через пропсы onSuccess или кастомные события
Если имя функции не указано явно, виджет использует встроенный обработчик. В этом случае достаточно вызвать стандартный метод провайдера, получить токен из скрытого поля и вручную инициировать отправку формы.
Как вызвать callback вручную после получения ответа от 2Captcha
После получения токена от 2Captcha его необходимо передать в callback через браузерную автоматизацию.
Selenium на Python:
python
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
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
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-сайтах с динамической загрузкой капчи.