Làm cách nào để tải lại ReCaptcha bằng JavaScript?


177

Tôi có một hình thức đăng ký với AJAX để tôi muốn làm mới hình ảnh Recaptcha bất cứ khi nào xảy ra lỗi (tức là tên người dùng đã được sử dụng).

Tôi đang tìm mã tương thích với ReCaptcha để tải lại bằng JavaScript.


1
Đừng bận tâm. Tại sao thay đổi CAPTCHA nếu tên người dùng được lấy?
SLaks

18
@SLaks : có thể vì trước tiên anh ta kiểm tra captcha và sau đó kiểm tra người dùng - và một khi captcha được sử dụng, nó không còn hiệu lực. Làm điều này theo cách khác xung quanh người dùng độc hại có thể dễ dàng làm hỏng máy chủ và có được danh sách tất cả người dùng sử dụng vũ lực mà không bị làm phiền với captcha.
Tomasz Nurkiewicz

1
@TomaszNurkiewicz CẬP NHẬT: người dùng độc hại sẽ không thể gửi cùng một hình ảnh xác thực lại để xác thực nhiều lần. Vì vậy, không, bruteforce là không thể ở đây. Lý do để làm mới captcha là chỉ đơn giản là cho phép người dùng nhập lại.
Tony Sepia

Tôi tin rằng một kẻ tấn công lành nghề có thể khai thác các cuộc tấn công thời gian để tìm dữ liệu nào sai tùy thuộc vào việc xác thực bot ở đâu; Tôi thích giữ bản kiểm tra đầu tiên của mình và từ chối ngay lập tức bất cứ điều gì nếu chúng thất bại, cũng giúp giảm tải cho máy chủ của tôi để tôi không thực hiện các truy vấn DB khi chúng sẽ bị từ chối
Steve Byrne

Câu trả lời:



370

Đối với reCaptcha v2, sử dụng:

grecaptcha.reset();

Nếu bạn đang sử dụng reCaptcha v1 ( có thể không ):

Recaptcha.reload();

Điều này sẽ làm nếu có một Recaptcha đã được tải trên window.

(Được cập nhật dựa trên nhận xét của @ SebiH bên dưới.)


20
Đối với bất cứ ai sử dụng reCAPTCHA mới: Dòng hiện đã đổi thành grecaptcha.reset();( documenation )
SebiH

Tôi đang sử dụng ứng dụng này grecaptcha.reset();cho các ứng dụng phản ứng của mình và nó hoạt động hoàn hảo
yussan

4
nếu bạn không chắc chắn grecaptcha đã được tải, hãy sử dụngif (window.grecaptcha) grecaptcha.reset();
fred727

Mặc dù điều này tải lại captcha, giá trị trường cho phản hồi captcha dường như không bị xóa, khiến biểu mẫu của tôi hợp lệ.
Damian Green

58

Nếu bạn đang sử dụng phiên bản 1

Recaptcha.reload();

Nếu bạn đang sử dụng phiên bản 2

grecaptcha.reset();

1
Sao chép câu trả lời được chấp nhận và đăng lại 3 năm sau đó. Urg.
PR Whitehead

@PRWhitehead Vui lòng xem lịch sử chỉnh sửa. BTW, cảm ơn vì đã bỏ phiếu.
Dasun

Tôi đã làm, bạn chưa chỉnh sửa của bạn và bạn đã thêm nó 3 tháng sau khi câu trả lời được chấp nhận được cập nhật để phản ánh sự thay đổi đối với API - ảnh hưởng đến mức độ liên quan của câu trả lời ban đầu và nhiều năm sau khi được thêm lần đầu tiên. Tôi đánh giá thấp nó bởi vì đây là câu trả lời được chấp nhận là hữu ích hơn.
PR Whitehead

2
Tôi đã thêm câu trả lời này bởi vì tôi phải đối mặt, cùng một vấn đề. Mặc dù câu trả lời được chấp nhận phản ánh câu trả lời đúng vào thời điểm đó nhưng nó không đủ rõ ràng. Ít nhất là đối với tôi, đó là lý do tại sao tôi quyết định thêm vào như một câu trả lời mới với sự tách biệt rõ ràng (câu trả lời được chấp nhận đã không lưu ý sự khác biệt so với các phiên bản).
Ngày

8
grecaptcha.reset(opt_widget_id)

Đặt lại tiện ích reCAPTCHA. Một id widget tùy chọn có thể được thông qua, nếu không thì chức năng đặt lại widget đầu tiên được tạo. (từ trang web của Google)


nó chỉ đặt lại hình ảnh xác thực đầu tiên trên trang
Maxwell sc

@ Maxwells.c Bạn thậm chí đã đọc bài viết? Tùy chọn bạn có thể vượt qua một id widget và xóa widget thứ n. Nếu bạn không vượt qua, thì cái đầu tiên được đặt lại.
Kutalia

1
Chính xác thì id widget là gì? Tôi đã thử chuyển qua id html của recaptcha <div> nhưng gặp lỗi "id máy khách recaptcha không hợp lệ". Tôi nghĩ rằng tôi cần kết xuất widget một cách rõ ràng bởi vì tôi nghĩ phương thức render () trả về id tôi cần.
Pete

6

Thử cái này

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

Nếu bạn gọi showRecaptcha, captchadiv sẽ được điền với một thể hiện recaptcha mới.


bạn có thể thay đổi mã của mình và gọi showRecaptcha khi tải không? Đây có phải là giúp bạn?
Tim

6

Hoặc bạn chỉ có thể mô phỏng một nhấp chuột vào nút refresh

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

1
Vì một số lý do, Recaptchagrecaptchacả hai đều không được xác định trên trang của tôi. Điều này làm việc cho tôi, với một sửa đổi nhỏ:if( $("#recaptcha_reload").length > 0 ){ ....
Nate-Bit Int

Tôi đã sử dụng nó để biết khi nào kết thúc việc lặp lại một mảng mà không đếm các phần tử của nó.
m3nda

3

Đối với người dùng AngularJS:

$window.grecaptcha.reset();

1
Trong trường hợp của tôi không có $ - window.grecaptcha.reset ();
Tony Sepia


2

Nếu bạn đang sử dụng Phiên bản 1.0 của API reCAPTCHA, vui lòng nâng cấp lên Phiên bản 2.0 (Phiên bản 1.0 không còn được hỗ trợ)

Sử dụng grecaptcha.reset();để thiết lập lại captcha.


0

nếu bạn đang sử dụng recaptcha 2.0 mới, hãy sử dụng mã này: cho mã phía sau:

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

cho javascript đơn giản

<script>$.getScript(\"https://www.google.com/recaptcha/api.js\", function () {});</script>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.