Как перезагрузить ReCaptcha с помощью JavaScript?

177

У меня есть форма регистрации с AJAX, так что я хочу обновить изображение Recaptcha каждый раз, когда происходит ошибка (т. Е. Имя пользователя уже используется).

Я ищу код, совместимый с ReCaptcha, чтобы перезагрузить его с помощью JavaScript.

АхметБ - Google
источник
1
Не беспокойся Зачем менять CAPTCHA, если имя пользователя занято?
Слакс
18
@SLaks : вероятно, потому что он сначала проверяет капчу, а затем проверяет пользователя - и как только капча используется, она больше не действительна. Делая это наоборот, злоумышленник может легко испортить сервер и получить список всех пользователей, использующих грубую силу, не беспокоясь о капче.
Томаш Нуркевич
1
@TomaszNurkiewicz ОБНОВЛЕНИЕ: злонамеренный пользователь не сможет подать одну и ту же ре-капчу для проверки более одного раза. Так что нет, грубая сила здесь невозможна. Причина обновления капчи заключается в том, чтобы просто позволить пользователю ввести ее снова.
Тони Сепия
Я полагаю, что опытный злоумышленник может использовать атаки по времени, чтобы определить, какие данные неверны, в зависимости от того, где находится проверка бота; Я предпочитаю оставить свою первую проверку и сразу отклонить что-либо, если они потерпят неудачу, а также помогает снизить нагрузку на мой сервер, поэтому я не выполняю запросы к БД, когда они все равно будут отклонены
Стив Бирн,

Ответы:

370

Для reCaptcha v2 используйте:

grecaptcha.reset();

Если вы используете reCaptcha v1 ( вероятно, нет ):

Recaptcha.reload();

Это будет делать, если на. Есть уже загруженная Recaptcha window.

(Обновлено на основе комментария @ SebiH ниже.)

АхметБ - Google
источник
20
Для тех, кто использует новую reCAPTCHA: линия теперь изменилась на grecaptcha.reset();( документирование )
SebiH
Я использую это grecaptcha.reset();для своих приложений реагировать, и это прекрасно работает
Юссан
4
если вы не уверены, что grecaptcha загружен, используйтеif (window.grecaptcha) grecaptcha.reset();
fred727
Несмотря на то, что это перезагружает капчу, значение поля для ответа капчи, похоже, не удаляется, и моя форма остается в силе.
Дамиан Грин
58

Если вы используете версию 1

Recaptcha.reload();

Если вы используете версию 2

grecaptcha.reset();
Dasun
источник
1
Скопировал принятый ответ и перепостил 3 года спустя. Urg.
PR Whitehead
@PRWhitehead Пожалуйста, смотрите историю редактирования. Кстати, спасибо за отрицательный голос.
Дасун
Я сделал, вы не отредактировали свой, и вы сначала добавили его через 3 месяца после обновления принятого ответа, чтобы отразить изменение в API, что повлияло на актуальность исходного ответа и годы после его первого добавления. Я понизил это, потому что этот принятый ответ более полезен.
PR Whitehead
2
Я добавил этот ответ, потому что столкнулся с той же проблемой. Хотя принятый ответ отражал правильный ответ в то время, он не был достаточно ясен. По крайней мере, для меня, поэтому я решил добавить в качестве нового ответа четкое разделение (в принятом ответе не было отмечено различий между версиями).
Дасун
8
grecaptcha.reset(opt_widget_id)

Сбрасывает виджет reCAPTCHA. Необязательный идентификатор виджета может быть передан, в противном случае функция сбрасывает первый созданный виджет. (с веб-страницы Google)

Kutalia
источник
это только сбросил первую капчу на странице
Maxwell sc
@ Maxwells.c Ты вообще читал пост? При желании вы можете передать идентификатор виджета и удалить n-й виджет. Если не пройти, то первый сбрасывается.
Куталия
1
Что именно является идентификатором виджета? Я попытался передать html-идентификатор recaptcha <div>, но получил ошибку «неверный идентификатор клиента recaptcha». Я думаю, что мне нужно визуализировать виджет явно, потому что я думаю, что метод render () возвращает нужный мне идентификатор.
Пит
opt_widget_id является необязательным и является идентификатором, возвращаемым из вызова рендеринга, хотя, если он пропущен, он будет ссылаться на первый созданный виджет recaptcha (если у вас есть только один виджет, этого будет достаточно).
фрзсомбор
6

Попробуй это

<script type="text/javascript" src="//www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
<script type="text/javascript">
          function showRecaptcha() {
            Recaptcha.create("YOURPUBLICKEY", 'captchadiv', {
              theme: 'red',
              callback: Recaptcha.focus_response_field
            });
          }
 </script>

<div id="captchadiv"></div>

Если вы вызовете showRecaptcha, то captchadiv будет заполнен новым экземпляром recaptcha.

Тим
источник
Вы можете изменить свой код и вызвать showRecaptcha onload? Это тебе помогает?
Тим
6

Или вы можете просто смоделировать нажатие на кнопку обновления

// If recaptcha object exists, refresh it
    if (typeof Recaptcha != "undefined") {
      jQuery('#recaptcha_reload').click();
    }
AlxVallejo
источник
1
Почему-то и то Recaptchaи grecaptchaдругое не определено на моей странице. Это сработало для меня с небольшой модификацией:if( $("#recaptcha_reload").length > 0 ){ ....
Nate-Bit Int
Я использовал это, чтобы знать, когда закончена итерация массива без подсчета его элементов.
m3nda
3

Для пользователей AngularJS:

$window.grecaptcha.reset();
Марсело С.
источник
1
В моем случае без $ - window.grecaptcha.reset ();
Тони Сепия
3

Для новой версии reCaptcha v2 используйте:

grecaptcha.reset();
Корпоративное назначение
источник
2

Если вы используете версию 1.0 API reCAPTCHA, обновите ее до версии 2.0 (версия 1.0 больше не поддерживается)

Используйте grecaptcha.reset();для сброса капчи.

с Шариф
источник
0

если вы используете новую recaptcha 2.0, используйте это: для кода:

ScriptManager.RegisterStartupScript(this, this.GetType(), "CaptchaReload", "$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});", true);

для простого JavaScript

<script>$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});</script>
Сара Хан
источник