Java 使用HtmlUnit登录到Google帐户

Java 使用HtmlUnit登录到Google帐户,java,parsing,web-scraping,htmlunit,Java,Parsing,Web Scraping,Htmlunit,我正试图通过HtmlUnit登录到谷歌账号,但仍然有问题,我得到了登录页面。我做错了什么 设置电子邮件 单击下一步按钮 设置密码 单击登录按钮 转到GMail页面,它仍然是登录页面(下面的输出) 我的示例代码: WebClient client = new WebClient(BrowserVersion.CHROME); client.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);

我正试图通过HtmlUnit登录到谷歌账号,但仍然有问题,我得到了登录页面。我做错了什么

  • 设置电子邮件
  • 单击下一步按钮
  • 设置密码
  • 单击登录按钮
  • 转到GMail页面,它仍然是登录页面(下面的输出)
  • 我的示例代码:

            WebClient client = new WebClient(BrowserVersion.CHROME);
            client.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);
            client.setJavaScriptEngine(new JavaScriptEngine(client));
            client.getOptions().setJavaScriptEnabled(true);
            client.getCookieManager().setCookiesEnabled(true);
            client.getOptions().setThrowExceptionOnScriptError(false);
            client.getOptions().setThrowExceptionOnFailingStatusCode(false);
            client.setAjaxController(new NicelyResynchronizingAjaxController());
            client.getCache().setMaxSize(0);
            client.getOptions().setRedirectEnabled(true);
    
            String url = "https://accounts.google.com/login?hl=en#identifier";
            HtmlPage loginPage = client.getPage(url);
            client.waitForBackgroundJavaScript(1000000);
    
            HtmlForm loginForm = loginPage.getFirstByXPath("//form[@id='gaia_loginform']");
            List<HtmlInput> buttonInputs = loginForm.getInputsByValue("signIn");
            HtmlInput nextButton = Iterables.getFirst(buttonInputs, null);
            HtmlInput loginButton = Iterables.getLast(buttonInputs);
            Thread.sleep(2000);
    
            //setup email
            HtmlInput emailInput = loginForm.getInputByName("Email");
            emailInput.setValueAttribute(emailAddress);
            Thread.sleep(2000);
    
            //click next button
            nextButton.click();
            client.waitForBackgroundJavaScript(1000000);
            Thread.sleep(2000);
    
            //setup password
            HtmlInput passwordInput = loginForm.getInputByName("Passwd");
            passwordInput.setValueAttribute(password);
    
            //click login button
            loginButton.click();
            client.waitForBackgroundJavaScript(1000000);
            Thread.sleep(2000);
    
            HtmlPage gmailPage = client.getPage("https://mail.google.com/mail/u/0/#inbox");
            log.info(gmailPage.asText());
    
    我忘了一些明显的事情

    我还尝试用javascript单击按钮

    loginPage.executeJavaScript("document.getElementById('next').click()");
    loginPage.executeJavaScript("document.getElementById('signIn').click()");
    

    我认为你做错的是当你在寻找“下一步”和“登录”按钮时

    我很确定你需要做:
    List buttoninput=loginForm.getInputsByName(“登录”)

    相反,你把
    List buttoninput=loginForm.getInputsByValue(“登录”)

    这是不对的,因为两个按钮的名称都是“登录”
    当“下一步”按钮的值为“下一步”且“登录”按钮的值为“登录”时,

    我认为您所做的错误是在查找“下一步”和“登录”按钮时

    我很确定你需要做:
    List buttoninput=loginForm.getInputsByName(“登录”)

    相反,你把
    List buttoninput=loginForm.getInputsByValue(“登录”)

    这是不对的,因为两个按钮的名称都是“登录”
    当“下一步”按钮的值为“下一步”而“登录”按钮的值为“登录”时,

    那么,谷歌登录似乎会触发很多重定向。我建议您打印当前页面URL以查看您所在的位置,并在匿名模式下与您选择的浏览器进行比较。事实上,你完全有可能登录谷歌。你也可以尝试导航到一个经过身份验证的页面(通常是GMail),看看你是否被禁止https://mail.google.com/mail/u/0/#inbox");
    log.info(gmailPage.asText())我将客户端重定向到gmail页面,我得到的输出是登录page@Jakub_Pomykała我的错。您是否尝试过使用HTTP代理来查看HtmlUnit和Google之间交换了哪些HTTP请求?也许你会发现你的浏览器在登录时有一些有趣的不同。不,你能说得更多吗?代理应该指向哪里?到我的电脑?我认为我可以使用wireshark做同样的事情,而不使用HTTP代理。是的,你当然可以使用wireshark来监听流量,但我不太擅长推荐;-)因此,启动Wireshark,运行HtmlUnit测试,然后使用浏览器执行相同的身份验证。差异应该是可见的。好吧,谷歌登录似乎触发了很多重定向。我建议您打印当前页面URL以查看您所在的位置,并在匿名模式下与您选择的浏览器进行比较。事实上,你完全有可能登录谷歌。你也可以尝试导航到一个经过身份验证的页面(通常是GMail),看看你是否被禁止https://mail.google.com/mail/u/0/#inbox");
    log.info(gmailPage.asText())我将客户端重定向到gmail页面,我得到的输出是登录page@Jakub_Pomykała我的错。您是否尝试过使用HTTP代理来查看HtmlUnit和Google之间交换了哪些HTTP请求?也许你会发现你的浏览器在登录时有一些有趣的不同。不,你能说得更多吗?代理应该指向哪里?到我的电脑?我认为我可以使用wireshark做同样的事情,而不使用HTTP代理。是的,你当然可以使用wireshark来监听流量,但我不太擅长推荐;-)因此,启动Wireshark,运行HtmlUnit测试,然后使用浏览器执行相同的身份验证。差异应该是显而易见的。
    
    loginPage.executeJavaScript("document.getElementById('next').click()");
    loginPage.executeJavaScript("document.getElementById('signIn').click()");