Como recarregar o ReCaptcha usando JavaScript?


177

Eu tenho um formulário de inscrição no AJAX para poder atualizar a imagem do Recaptcha sempre que ocorrer um erro (por exemplo, nome de usuário já em uso).

Estou procurando um código compatível com o ReCaptcha para recarregá-lo usando JavaScript.


1
Não se incomode. Por que alterar o CAPTCHA se o nome de usuário é usado?
— SLaks

18
@ Slaks : provavelmente porque ele primeiro verifica o captcha e depois o usuário - e uma vez que o captcha é usado, ele não é mais válido. Fazer isso da maneira inversa ao usuário mal-intencionado pode danificar facilmente o servidor e obter a lista de todos os usuários usando força bruta sem se incomodar com o captcha.
— Tomasz Nurkiewicz 11/11

1
@TomaszNurkiewicz UPDATE: o usuário mal-intencionado não poderá enviar o mesmo re-captcha para validação mais de uma vez. Portanto, não, força bruta não é possível aqui. O motivo para atualizar o captcha é simplesmente permitir que o usuário o insira novamente.
— Tony Sepia

Acredito que um invasor habilidoso possa explorar ataques de tempo para descobrir quais dados estão errados, dependendo de onde está a validação do bot; Eu prefiro manter o meu como o primeiro cheque e imediatamente rejeitar qualquer coisa se eles falharem, também ajuda a reduzir a carga no meu servidor para que eu não estou fazendo consultas DB quando será rejeitada qualquer maneira
— Steve Byrne

Respostas:



370

Para o reCaptcha v2, use:

grecaptcha.reset();

Se você estiver usando o reCaptcha v1 ( provavelmente não ):

Recaptcha.reload();

Isso será feito se já houver um Recaptcha carregado no window.

(Atualizado com base no comentário de @ SebiH abaixo.)


20
Para qualquer um usando o novo reCAPTCHA: A linha agora mudou para grecaptcha.reset();( documenation )
— SebiH

Estou usando este grecaptcha.reset();para o meu reagir apps, e ele funciona perfeitamente
— yussan

4
Se você não tem certeza grecaptcha é carregado, o usoif (window.grecaptcha) grecaptcha.reset();
— fred727

Embora isso recarregue o captcha, o valor do campo para a resposta captcha não parece ser removido, deixando meu formulário válido.
— Damian Green

58

Se você estiver usando a versão 1

Recaptcha.reload();

Se você estiver usando a versão 2

grecaptcha.reset();

1
Copiou a resposta aceita e republicada 3 anos depois. Urg.
— PR Whitehead

@PRWhitehead Consulte o histórico de edições. Entre, obrigado pelo voto negativo.
— Dasun 28/02

Sim, você não editou a sua e a adicionou primeiro três meses após a resposta aceita ter sido atualizada para refletir uma alteração na API - afetando a relevância da resposta inicial e anos após a adição. Eu diminuí a votação porque essa resposta aceita é mais útil.
— PR Whitehead

2
Eu adicionei esta resposta porque enfrentei o mesmo problema. Embora a resposta aceita refletisse a resposta correta na época, não era clara o suficiente. Pelo menos para mim, foi por isso que decidi adicionar como uma nova resposta com uma separação clara (a resposta aceita falhou em observar as diferenças em relação às versões).
— Dasun

8
grecaptcha.reset(opt_widget_id)

Redefine o widget reCAPTCHA. Um ID de widget opcional pode ser passado, caso contrário, a função redefine o primeiro widget criado. (da página da web do Google)


ele só repor o primeiro captcha na página
— Maxwell sc

@ Maxwells.c Você já leu o post? Opcionalmente, você pode passar um ID de widget e excluir o enésimo widget. Se você não passar, o primeiro será redefinido.
— Kutalia

1
Qual é exatamente o ID do widget? Tentei passar a identificação html do recaptcha <div>, mas recebi o erro "identificação de cliente recaptcha inválida". Estou pensando que preciso renderizar o widget explicitamente porque acho que o método render () retorna o ID de que preciso.
— Pete

6

Tente isto

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

Se você chamar showRecaptcha, o captchadiv será preenchido com uma nova instância de recaptcha.


você pode alterar seu código e chamar showRecaptcha onload? Isso está ajudando você?
— Tim

6

Ou você pode simular um clique no botão Atualizar

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

1
Por alguma razão, Recaptchae grecaptchaambos estão indefinidos na minha página. Isso funcionou para mim, com uma ligeira modificação:if( $("#recaptcha_reload").length > 0 ){ ....
— Nate-Bit Int

Eu usei isso para saber quando é concluída a iteração de uma matriz sem contar seus elementos.
— M3nda

3

Para usuários do AngularJS:

$window.grecaptcha.reset();

1
No meu caso sem $ - window.grecaptcha.reset ();
— Tony Sepia


2

Se você estiver usando a versão 1.0 da API reCAPTCHA, atualize para a versão 2.0 (a versão 1.0 não é mais suportada)

Use grecaptcha.reset();para redefinir o captcha.


0

se você estiver usando o novo recaptcha 2.0, use isto: para o código por trás:

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

para javascript simples

<script>$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});</script>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.