Як перезавантажити ReCaptcha за допомогою JavaScript?


177

У мене є форма реєстрації в AJAX, так що я хочу оновити зображення Recaptcha кожного разу, коли сталася помилка (тобто ім'я користувача, яке вже використовується).

Я шукаю код, сумісний з ReCaptcha, щоб перезавантажити його за допомогою JavaScript.


1
Не турбуйся. Навіщо змінювати CAPTCHA, якщо береться ім'я користувача?
SLaks

18
@SLaks : ймовірно, тому, що він спочатку перевіряє капчу, а потім перевіряє користувача - і коли це буде використано, воно більше не дійсне. Якщо це зробити навпаки, шкідливий користувач може легко помилитися з сервером і отримати список усіх користувачів, які використовують грубу силу, не турбуючись з капчу.
Томаш Нуркевич

1
@TomaszNurkiewicz ОНОВЛЕННЯ: зловмисний користувач більше ніж один раз не зможе подати ту саму повторну Captcha для перевірки. Так що ні, груба сила тут неможлива. Причина оновлення капчу - просто дозволити користувачеві знову ввести її.
Тоні Сепія

Я вважаю, що досвідчений зловмисник може використовувати таймінгові атаки, щоб знайти, які дані неправильні, залежно від того, де перевіряється бот; Я вважаю за краще зберігати шахту як першу перевірку і негайно відхиляти що-небудь, якщо вони не вдаються, також допомагає зменшити навантаження на мій сервер, тому я не роблю запитів БД, коли вони все одно будуть відхилені
Steve Byrne

Відповіді:



370

Для reCaptcha v2 використовуйте:

grecaptcha.reset();

Якщо ви використовуєте reCaptcha v1 ( мабуть, ні ):

Recaptcha.reload();

Це вдасться зробити, якщо вже є завантажений Recaptcha на window.

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


20
Для всіх, хто використовує новий reCAPTCHA: Рядок тепер змінився на grecaptcha.reset();( документування )
SebiH

Я використовую це grecaptcha.reset();для моїх програм реагування, і він прекрасно працює
yussan

4
якщо ви не впевнені, що grecaptcha завантажено, використовуйтеif (window.grecaptcha) grecaptcha.reset();
fred727

Хоча це перезавантажує Captcha, значення поля для відповіді captcha не видаляється, що залишає мою форму дійсною.
Даміан Грін

58

Якщо ви використовуєте версію 1

Recaptcha.reload();

Якщо ви використовуєте версію 2

grecaptcha.reset();

1
Скопіював прийняту відповідь та відправив репортаж через 3 роки. Ург.
PR Whitehead

@PRWhitehead Перегляньте історію редагування. BTW, спасибі за прихильний голос.
Дасун

Я зробив, ви не редагували свою, і ви вперше додали її через 3 місяці після оновлення прийнятої відповіді, щоб відобразити зміни в API - це впливає на актуальність початкової відповіді та років після її внесення. Я спростував це, оскільки ця прийнята відповідь корисніша.
ПР Уайтхед

2
Цю відповідь я додав, бо зіткнувся з тим же питанням. Хоча прийнята відповідь відображала правильну відповідь у той час, вона була недостатньо зрозумілою. Принаймні для мене, тому я вирішив додати як нову відповідь з чітким відмежуванням (прийнята відповідь не відзначила відмінності від версій).
Дасун

8
grecaptcha.reset(opt_widget_id)

Скидає віджет reCAPTCHA. Необов’язковий ідентифікатор віджета може бути переданий, інакше функція скидає перший створений віджет. (з веб-сторінки Google)


він скидає лише першу капчу на сторінці
Maxwell sc

@ Maxwells.c Ви навіть прочитали публікацію? За бажанням ви можете передати ідентифікатор віджета та видалити n-й віджет. Якщо ви не проходите, то перший скидається.
Куталія

1
Що саме є ідентифікатором віджета? Я спробував передати html ідентифікатор recaptcha <div>, але отримав помилку "недійсний ідентифікатор клієнта recaptcha". Я думаю, що мені потрібно чітко відредагувати віджет, тому що я думаю, що метод render () повертає потрібний мені ідентифікатор.
Піт

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();
    }

1
Чомусь Recaptchaі grecaptchaобидва не визначені на моїй сторінці. Це працювало для мене, з невеликою модифікацією:if( $("#recaptcha_reload").length > 0 ){ ....
Nate-Bit Int

Я використав це для відомого, коли закінчується ітерація масиву, не рахуючи його елементів.
м3нда



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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.