如何在没有提交按钮的情况下提交Google验证码?

4
我正在使用Python和Selenium编写自动化脚本,但在最后一步遇到了问题,因为之前的步骤中有一个带有验证码的提交按钮,所以表单被提交了。我考虑直接将验证码响应负载到网站上,但我没有找到任何方法来实现这一点。
我正在使用2captcha自动解决。
我找到了这个视频,可以提交验证码,我查看了代码,但无法确定它是否适用于我的代码https://www.youtube.com/watch?v=lnmtqPam1qg 以下是与此问题相关的代码部分。
def captchaHome():
    driver.execute_script('var element=document.getElementById("g-recaptcha-response"); element.style.display="";')
    service_key = 'xxxxxxxxxxxxxxxxxxxxxx'  # 2captcha service key
    google_site_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'  # reCAPTCHAのdata-sitekey
    pageurl = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    url = "http://2captcha.com/in.php?key=" + service_key + "&method=userrecaptcha&googlekey=" + google_site_key + "&pageurl=" + pageurl
    resp = requests.get(url)
    if resp.text[0:2] != 'OK':
        quit('Service error. Error code:' + resp.text)
    captcha_id = resp.text[3:]
    fetch_url = "http://2captcha.com/res.php?key=" + service_key + "&action=get&id=" + captcha_id

    for i in range(1, 10):
        time.sleep(10)  # wait 10 sec.
        resp = requests.get(fetch_url)
        if resp.text[0:2] == 'OK':
            break
    print('Google response token: ', resp.text[3:])
    return resp.text[3:]

capHome = captchaHome()
driver.find_element_by_id('g-recaptcha-response').send_keys(capHome)

这是我想提交的网站上的代码


          function show(classNames) {
            classNames.forEach(function(className) {
              document.querySelector(className).classList.remove('hidden');
            });
          }

          function hide(classNames) {
            classNames.forEach(function(className) {
              document.querySelector(className).classList.add('hidden');
            });
          }

          function showAnimation() {
            hide(['.challenge', '.error', '.success']);
            show(['.redeem', '.animation']);
          }

          function showSuccess() {
            hide(['.challenge', '.error']);
            show(['.redeem', '.success', '.animation']);
          }

          function showError() {
            hide(['.challenge', '.success', '.animation']);
            show(['.redeem', '.error']);
          }

          // used in data-callback
          function redemptionValidation(captchaResponse) {
            showAnimation();

            function reqListener() {
              if (this.status >= 200 && this.status < 400) {
                var redirectUrl = this.responseText;
                showSuccess();
                setTimeout(function() {
                  window.location.replace(redirectUrl);
                }, 3000);
              } else {
                showError();
              }
            }

            function reqErrListener() {
              showError();
            }


            var req = new XMLHttpRequest();
            req.addEventListener('load', reqListener);
            req.addEventListener('error', reqErrListener);
            req.open('POST', '/googlehome/redeem/getcode/');
            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            req.send('g-recaptcha-response=' + encodeURIComponent(captchaResponse));
          }

我想在没有提交按钮的情况下提交验证码,以便它可以将我重定向到下一步。

编辑:

我正在考虑将提交按钮载入到网站中,但我找不到任何方法来实现这一点,类似于这样的操作。

// 1. Create the button
var button = document.createElement("button");
button.innerHTML = "Do Something";

// 2. Append somewhere
var cap = document.getElementsByTagName("body")[0];
cap.appendChild(button);

然后使用Selenium找到它并点击()
3个回答

2

I resolved it with this

driver.execute_script("redemptionValidation(\"" + capHome + "\")")

我遇到了类似的问题。找不到任何脚本。 - Rehan

1
尝试使用send_keys(Keys.RETURN)代替点击提交按钮。 编辑: 在您的代码中,将RETURN键发送到通常单击提交按钮的位置应产生相同的结果。

2
你能否请添加更多相关的解释?谢谢! - Shanteshwar Inde
from selenium.webdriver.common.keys import Keysinput_field.send_keys(Keys.ENTER) - freesoul

0

"Python代码" 这是我找到的解决无需按钮验证码的方法:

    driver.execute_script('''const reduceObjectToArray = (obj) => Object.keys(obj).reduce(function (r, k) {
        return r.concat(k, obj[k]);
    }, []);
    
    const client = ___grecaptcha_cfg.clients[0]
    let result = [];
    result = reduceObjectToArray(client).filter(c => Object.prototype.toString.call(c) === "[object Object]")
    
    result = result.flatMap(r => {
    return reduceObjectToArray(r)
    })

result = result.filter(c => Object.prototype.toString.call(c) === [object Object]")
const reqObj = result.find( r => r.callback)
reqObj.callback("%s")'''% captcha_response)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接