首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Selenium +2 2Captcha +提交表单

Java Selenium +2 2Captcha +提交表单
EN

Stack Overflow用户
提问于 2019-09-17 18:23:59
回答 1查看 2.5K关注 0票数 3

你好,我正在尝试自动化一些进程这里。我用2卡奇来解决卡普查问题,请检查图像

我有site_key和api_key,现在我正在发送api_key + site_key,它正在返回response_token,我已经将响应令牌添加到g-recaptcha-response中,但它不是提交表单。

我想要的是:我可以解决captcha并提交表单。

下面是我当前的java代码:

代码语言:javascript
复制
 System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    ChromeDriver driver;
    driver = new ChromeDriver();
    driver.manage().deleteAllCookies();
    driver.manage().window().maximize();
    driver.get("https://id.sonyentertainmentnetwork.com/signin/?client_id=fe1fdbfa-f1a1-47ac-b793-e648fba25e86&redirect_uri=https://secure.eu.playstation.com/psnauth/PSNOAUTHResponse/pdc/&service_entity=urn:service-entity:psn&response_type=code&scope=psn:s2s&ui=pr&service_logo=ps&request_locale=en_GB&error=login_required&error_code=4165&error_description=User+is+not+authenticated&no_captcha=false#/signin?entry=%2Fsignin");
    Thread.sleep(5000);

    driver.findElement(By.xpath("//input[@title='Sign-In ID (Email Address)']")).sendKeys("email");
    Thread.sleep(2000);
    driver.findElement(By.xpath("//input[@title='Password']")).sendKeys("password");
    Thread.sleep(2000);
    driver.findElement(By.xpath("//button[@class='primary-button row-button text-button touch-feedback']")).click();
    Thread.sleep(3000);
    By captcha = By.xpath("//iframe[@title='recaptcha challenge']");
    String src = driver.findElement(captcha).getAttribute("src");
    String key = getKey(src);
    System.out.println(key);

    String apiKey = "API_KEY";
    String googleKey = key;
    String pageUrl = "https://id.sonyentertainmentnetwork.com/signin/?client_id=fe1fdbfa-f1a1-47ac-b793-e648fba25e86&redirect_uri=https://secure.eu.playstation.com/psnauth/PSNOAUTHResponse/pdc/&service_entity=urn:service-entity:psn&response_type=code&scope=psn:s2s&ui=pr&service_logo=ps&request_locale=en_GB&error=login_required&error_code=4165&error_description=User+is+not+authenticated&no_captcha=false#/signin?entry=%2Fsignin";
    String proxyIp = "183.38.231.131";
    String proxyPort = "8888";
    String proxyUser = "username";
    String proxyPw = "password";


    TwoCaptchaService service = new TwoCaptchaService(apiKey, googleKey, pageUrl, proxyIp, proxyPort, proxyUser, proxyPw, ProxyType.HTTP);

    try {
        String responseToken = service.solveCaptcha();
        System.out.println("The response token is: " + responseToken);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        js.executeScript("document.getElementById(\"g-recaptcha-response\").innerHTML = \'"+responseToken+"\';");
    } catch (InterruptedException e) {
        System.out.println("ERROR case 1");
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("ERROR case 2");
        e.printStackTrace();
    }

更新代码:

代码语言:javascript
复制
          js.executeScript("document.getElementById(\"g-recaptcha-response\").innerHTML = \'" + responseToken + "\';");
        Thread.sleep(500);
        WebElement frameElement = driver.findElement(captcha);
        driver.switchTo().frame(frameElement);         
        js.executeScript("document.getElementById('recaptcha-verify-button').click();");

它是点击按钮,但,它显示Please select all matching images.。请查看屏幕截图

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-18 08:38:40

你所需要做的就是这样提交:

代码语言:javascript
复制
js.executeScript("document.getElementById('g-recaptcha-response').innerHTML='" + responseToken + "';");
Thread.sleep(500);
js.executeScript("document.getElementById('captcha-form').submit();");

另外,不要忘记检查这个ID:"captcha-form",它可以是不同的。

要达到“recaptcha-验证-按钮”元素:

在您从API获得响应之后;

代码语言:javascript
复制
By frame = By.xpath("//iframe[@title='recaptcha challenge']");

WebElement frameElement = driver.findElement(frame);

driver.switchTo.frame(frameElement);

然后你就可以执行你的脚本了。最后,如果captcha窗体是一个按钮,则用于脚本。

不能调用submit();

可以调用click();

最终答案:

还请检查以下内容:js.executeScript("widgetVerified('TOKEN');");

要找到名为widgetVerified()的函数,请在控制台中运行以下代码。

代码语言:javascript
复制
___grecaptcha_cfg.clients[0]

这将返回一个json,在该json内部,尝试在@Awais情况下找到回调函数,它是wigdetVerified(e)

警告:不要使用任何阻断剂

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57980022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档