Вход на сайт с ReCaptcha - PullRequest
       15

Вход на сайт с ReCaptcha

0 голосов
/ 30 марта 2020

Я делаю android приложение, пытаюсь зайти на сайт с POST-запросами. Проблема в том, что сайт не мой, и у него есть ReCaptcha в форме входа.

Я пытался реализовать API android Safet yNet, сделал запрос на проверку, используя собственный ключ сайта, но обычно тип ключа сайта ReCaptcha не установлен на 'reCaptcha Android', и поэтому он возвращает ошибку RECAPTCHA_INVALID_KEYTYPE , поэтому я не могу проверить себя с помощью android Safet yNet API.

Мне было интересно, есть ли какой-либо другой способ проверить, обслуживает ли сайт капчи.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я создал компонент WebView и загрузил страницу с капчей. Затем я получаю ключ сайта из существующей капчи, удаляю все компоненты на странице и отрисовываю новый элемент ReCaptcha, используя javascript.

Когда пользователь проверяет капчу, я записываю проверенный токен на консоль WebView, чтобы использовать его в следующем запросе POST входа в систему в моем приложении. Я получаю токен, переопределяя метод onConsoleMessage в WebChromeClient.

    // assuming theres a webview component with id 'webview'
    final WebView webView = findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setBackgroundColor(Color.TRANSPARENT);
    webView.setVisibility(View.GONE);
    webView.setWebViewClient(new WebViewClient()
    {
        @Override
        public void onPageFinished(WebView view, String url)
        {
            super.onPageFinished(view, url);

            webView.loadUrl("javascript: if($('div.g-recaptcha').length)" +
                    "{" +
                    "var sitekey = $('div.g-recaptcha').attr('data-sitekey');" + // getting the site-key from existing recaptcha element
                    "$('body > *').remove(); " + // deleting all content of the page
                    "$('body').append('<div id=\"captcha\"></div>'); " + // a div to draw new recaptcha
                    "grecaptcha.render('captcha', {\n" + // render the new recaptcha element in 'captcha' div
                    "    'sitekey' : sitekey,\n" +
                    "    'callback' : function(response){console.log('captchatoken:'+response)},\n" + // log the token on callback
                    "});" +
                    "$('body').css('background-color','transparent');" + // for aesthetic purposes
                    "}");
            webView.setVisibility(View.VISIBLE); // show the webview now since captcha is ready
        }
    });
    webView.setWebChromeClient(new WebChromeClient()
    {
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage)
        {
            String message = consoleMessage.message();
            if (message.startsWith("captchatoken:"))
            {
                String token = message.substring(13); // removing 'captchatoken:' part from console message
                // now this token can be used in a POST request for logging in
            }
            return super.onConsoleMessage(consoleMessage);
        }
    });
    webView.loadUrl(url_that_has_captcha);
}

Вот как это выглядит в действии:

in action gif

0 голосов
/ 30 марта 2020

Единственная причина, по которой существует reCaptcha, состоит в том, чтобы предотвратить сканирование или взаимодействие автоматизированных систем с системами. Так что в этом случае, к сожалению для вас, он преуспевает, мешая вам войти на сайт с помощью приложения android.

Вы не должны пытаться обойти это, потому что это может быть против TOS сайта, и может привести вас к неприятностям с законом. Вместо этого ищите API publi c, предоставляемый веб-сайтом, чтобы делать все, что вам нужно.

Кроме того, запрос подтверждения с использованием ключа сайта собственного сайта, как правило, не будет работать, поскольку reCaptcha принимает запросы только на ваш ключ по конкретным c доменам.

Насколько я знаю, надежного способа обхода капчи нет. Именно поэтому капча пользуется большим доверием и используется многими крупными корпорациями.

...