Jak ponownie załadować ReCaptcha za pomocą JavaScript?


177

Mam formularz rejestracji w AJAX, więc chcę odświeżyć obraz Recaptcha za każdym razem, gdy wystąpi błąd (tj. Nazwa użytkownika jest już używana).

Szukam kodu kompatybilnego z ReCaptcha, aby przeładować go za pomocą JavaScript.


1
Nie kłopocz się. Po co zmieniać CAPTCHA, jeśli nazwa użytkownika jest zajęta?
— SLaks

18
@SLaks : prawdopodobnie dlatego, że najpierw sprawdza captcha, a następnie sprawdza użytkownika - a po użyciu captcha traci ważność. Robiąc to na odwrót, złośliwy użytkownik może łatwo sfałszować serwer i uzyskać listę wszystkich użytkowników używających brutalnej siły, nie przejmując się captcha.
— Tomasz Nurkiewicz

1
@TomaszNurkiewicz AKTUALIZACJA: złośliwy użytkownik nie będzie mógł przesłać tego samego re-captcha do walidacji więcej niż raz. Więc nie, brutalna siła nie jest tutaj możliwa. Powodem odświeżenia captcha jest po prostu umożliwienie użytkownikowi ponownego wprowadzenia go.
— Tony Sepia,

Uważam, że wykwalifikowany napastnik mógłby wykorzystać ataki czasowe, aby znaleźć błędne dane w zależności od tego, gdzie znajduje się weryfikacja bota; Wolę zachować moją jako pierwszą kontrolę i natychmiast odrzucić wszystko, jeśli się nie uda, pomaga również zmniejszyć obciążenie mojego serwera, więc nie robię zapytań DB, gdy i tak zostaną odrzucone
— Steve Byrne

Odpowiedzi:



370

W przypadku reCaptcha v2 użyj:

grecaptcha.reset();

Jeśli używasz reCaptcha v1 ( prawdopodobnie nie ):

Recaptcha.reload();

Nastąpi to, jeśli w pliku window.

(Zaktualizowano na podstawie komentarza @ SebiH poniżej.)


20
Dla każdego, kto używa nowej reCAPTCHA: linia została teraz zmieniona na grecaptcha.reset();( dokumentacja )
— SebiH

Używam tego grecaptcha.reset();do moich aplikacji do reagowania i działa idealnie
— yussan

4
jeśli nie jesteś pewien, czy grecaptcha jest załadowana, użyjif (window.grecaptcha) grecaptcha.reset();
— fred727

Chociaż powoduje to ponowne załadowanie captcha, wartość pola dla odpowiedzi captcha nie wydaje się być usunięta, pozostawiając mój formularz prawidłowy.
— Damian Green,

58

Jeśli używasz wersji 1

Recaptcha.reload();

Jeśli używasz wersji 2

grecaptcha.reset();

1
Skopiowałem zaakceptowaną odpowiedź i przesłałem ponownie 3 lata później. Urg.
— PR Whitehead

@PRWhitehead Zobacz historię edycji. Przy okazji, dziękuję za głos negatywny.
— Dasun

Zrobiłem, nie edytowałeś swojego i dodałeś go po raz pierwszy 3 miesiące po zaktualizowaniu zaakceptowanej odpowiedzi, aby odzwierciedlić zmianę w interfejsie API - wpływającą na trafność początkowej odpowiedzi i lata po jej dodaniu. Głosowałem w dół, ponieważ ta zaakceptowana odpowiedź jest bardziej przydatna.
— PR Whitehead

2
Dodałem tę odpowiedź, ponieważ napotkałem ten sam problem. Chociaż zaakceptowana odpowiedź odzwierciedlała prawidłową odpowiedź w tamtym czasie, nie była wystarczająco jasna. Przynajmniej dla mnie, dlatego zdecydowałem się dodać jako nową odpowiedź z wyraźnym rozdziałem (zaakceptowana odpowiedź nie uwzględniła różnic w stosunku do wersji).
— Dasun

8
grecaptcha.reset(opt_widget_id)

Resetuje widżet reCAPTCHA. Można przekazać opcjonalny identyfikator widgetu, w przeciwnym razie funkcja resetuje pierwszy utworzony widget. (ze strony internetowej Google)


resetuje tylko pierwszą captcha na stronie
— Maxwell sc

@ Maxwells.c Czy w ogóle przeczytałeś post? Opcjonalnie możesz przekazać identyfikator widżetu i usunąć n-ty widżet. Jeśli nie zdasz, pierwszy zostanie zresetowany.
— Kutalia,

1
Jaki dokładnie jest identyfikator widżetu? Próbowałem przekazać identyfikator HTML recaptcha <div>, ale pojawił się błąd „nieprawidłowy identyfikator klienta recaptcha”. Myślę, że muszę jawnie wyrenderować widget, ponieważ myślę, że metoda render () zwraca identyfikator, którego potrzebuję.
— Pete

6

Spróbuj tego

<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>

Jeśli zadzwonisz do showRecaptcha, captchadiv zostanie wypełnione nową instancją recaptcha.


możesz zmienić swój kod i zadzwonić do showRecaptcha onload? Czy to ci pomaga?
— Tim

6

Możesz też po prostu zasymulować kliknięcie przycisku odświeżania

// If recaptcha object exists, refresh it
    if (typeof Recaptcha != "undefined") {
      jQuery('#recaptcha_reload').click();
    }

1
Z jakiegoś powodu Recaptchai grecaptchaoba są niezdefiniowane na mojej stronie. U mnie to zadziałało, z niewielką modyfikacją:if( $("#recaptcha_reload").length > 0 ){ ....
— Nate-Bit Int,

Użyłem tego, aby wiedzieć, kiedy jest zakończona iteracja tablicy bez liczenia jej elementów.
— m3nda



2

Jeśli używasz wersji 1.0 interfejsu API reCAPTCHA, zaktualizuj do wersji 2.0 (wersja 1.0 nie jest już obsługiwana)

Służy grecaptcha.reset();do resetowania captcha.


0

jeśli używasz nowej recaptcha 2.0, użyj tego: dla kodu za:

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

dla prostego javascript

<script>$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});</script>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.