Что такое сообщение об ошибке дублирования или тайм-аута в Google reCAPTCHA v3 - PullRequest
0 голосов
/ 12 мая 2018

Я использую reCaptcha v3 от Google на html-странице, которая все еще находится в бета-версии.( reCaptcha v3 docs )

HTML-страница состоит из двух кнопок, при нажатии каждой из которых вызывается метод внутреннего веб-сервиса с использованием jquery ajax, т. Е. При щелчке по ним не передается формакнопок.Если нажата кнопка Contact Us , то вызывается метод веб-службы ContactUs, а если нажата кнопка Buy , то вызывается метод Buy веб-службы.

Если янажмите кнопку «Связаться с нами» после рендеринга страницы, затем я получу ответ, как показано ниже, что я и ожидаю, поскольку я не бот.

{success: true, challenge_ts: "2018-05-12T05: 40: 23Z ", имя хоста:" localhost ", оценка: 0,9}

Затем, если я нажимаю другую кнопку, например кнопку" Купить ", я всегда получаю ответ, как показано ниже.

{success: false, коды ошибок ": [" timeout-or-duplicate "]}

Вопрос

Почему ответиз recaptcha всегда false с указанным выше сообщением об ошибке timeout-or-duplicate, когда я нажимаю кнопку Buy?

Я просто хочу убедиться, что бот не нажимает эти кнопки, и я подумал, что recaptcha v3 поможетв этом, но кажется, что всю страницу необходимо отправить обратно, то есть форму необходимо отправить после каждогощелчок по кнопке, чтобы он заработал.

HTML-код

<!DOCTYPE html>
<html>

<head>
    <title>reCaptcha v3</title>
    <meta charset="utf-8" />
    <script src="Scripts/jquery-1.11.3.min.js" type="text/javascript"></script>
    <script src='https://www.google.com/recaptcha/api.js?render=keyValue'></script>
    <script>
        function verify(action) {
            grecaptcha.execute('clientkeyValue')
                .then(function (token) {
                    $.ajax({
                        type: "POST",
                        url: "SomeWebService.asmx/VerifyCaptchaV3",
                        data: JSON.stringify({ response: token }),
                        success: function (r) {
                            if (r && JSON.parse(r).success === true) {
                                verified = true;

                                if (action === "contactus") {
                                    //code for calling ContactUs method in web service
                                } else if (action === "buy") {
                                    //code for calling Buy method in web service
                                }
                            } else {
                                verified = false;
                            }
                        },
                        contentType: "application/json; charset=utf-8",
                        dataType: "json"
                    });
                });
            }
    </script>
</head>

<body>
    <form action="javascript:grecaptcha.reset();" method="post">
        <div id="example3"></div>
        <br>
        <input type="submit" value="Contact Us" id="submit" onclick="verify('contactus'); return false;">
        <input type="submit" value="Buy" id="submit1" onclick="verify('buy'); return false;">
    </form>
</body>

</html>

Метод веб-службы в C # для вызова серверного сайта recaptchaVerify

public string VerifyCaptchaV3(string response) {
    string url = "https://www.google.com/recaptcha/api/siteverify?secret=someValue&response=" + response;
    return (new System.Net.WebClient()).DownloadString(url);
}

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Вы не должны проверять reCaptcha несколько раз на странице. Это не нужно и может привести к избыточному веб-трафику и чрезмерному использованию ресурсов.

После первой проверки вы должны сохранить результат оценки на стороне сервера (например, в качестве переменной сеанса) для последующего использования.

0 голосов
/ 15 мая 2018

Я получал ту же ошибку даже для разных значений токена.Я обнаружил, что удаление и повторное добавление сценария api.js на страницу после проверки позволяет успешно выполнить последующие проверки.

...