You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HtmlUnit自动化登录:如何处理隐藏的Google reCAPTCHA Token

解决HtmlUnit自动登录时缺失reCAPTCHA Token的问题

针对你遇到的隐藏式reCAPTCHA场景,问题核心在于HtmlClient默认的表单提交可能没有捕获到JS动态生成的Token。以下是具体解决步骤和修改后的代码:

关键处理点

  • 等待页面JavaScript完全执行,确保reCAPTCHA Token生成完毕
  • 手动提取页面中隐藏的reCAPTCHA Token(通常是input元素,name多为g-recaptcha-response,需根据目标页面实际情况调整)
  • 将Token添加到登录请求的参数中

修改后的示例代码

try (final WebClient webClient = new WebClient()) {
    // 基础配置保持不变
    webClient.getOptions().setCssEnabled(true);
    webClient.getOptions().setRedirectEnabled(true);
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getCookieManager().setCookiesEnabled(true);
    // 增加等待JS执行的时间,确保reCAPTCHA生成Token
    webClient.waitForBackgroundJavaScript(5000); // 等待5秒,可根据实际调整

    HtmlPage page = webClient.getPage(LOGIN_URL);
    // 再次等待页面JS执行,确保所有动态元素加载完成
    webClient.waitForBackgroundJavaScript(3000);

    HtmlForm form = page.getFormByName("login-form");
    // 填充账号密码
    form.getInputByName("login[username]").setValueAttribute(USERNAME);
    form.getInputByName("login[password]").setValueAttribute(PASSWORD);

    // 提取reCAPTCHA Token:根据页面实际的元素name或XPath调整
    HtmlInput recaptchaToken = null;
    try {
        // 先尝试通过name获取,常见的是g-recaptcha-response
        recaptchaToken = form.getInputByName("g-recaptcha-response");
    } catch (ElementNotFoundException e) {
        // 如果不在表单内,直接从页面查找隐藏的input
        recaptchaToken = page.getFirstByXPath("//input[@name='g-recaptcha-response' and @type='hidden']");
    }

    if (recaptchaToken != null && !recaptchaToken.getValueAttribute().isEmpty()) {
        // 如果Token存在,确保它关联到表单(如果原本不在表单内,需要添加进去)
        if (!form.contains(recaptchaToken)) {
            form.appendChild(recaptchaToken);
        }
    } else {
        throw new RuntimeException("未找到有效的reCAPTCHA Token,请检查页面元素或延长JS等待时间");
    }

    // 提交表单
    HtmlButton submitButton = form.getFirstByXPath("//*[@id=\"send2\"]");
    HtmlPage loggedInPage = submitButton.click();
    // 提交后等待跳转完成
    webClient.waitForBackgroundJavaScript(2000);

    System.out.println("Page Body: " + loggedInPage.getBody().asText());

} catch (Exception e) {
    e.printStackTrace();
}

额外说明

  1. Token元素的定位:不同网站的reCAPTCHA隐藏字段name可能不同,建议先查看目标页面的HTML源码,确认Token对应的input元素的name或XPath
  2. JS等待时间:如果等待后仍无法获取Token,可适当延长waitForBackgroundJavaScript的时间(单位:毫秒)
  3. 手动构建POST请求:如果上述方法仍不生效,可以直接构建POST请求,手动携带所有参数(包括账号、密码、Token):
// 替代表单提交的代码
String token = recaptchaToken.getValueAttribute();
NameValuePair[] params = new NameValuePair[]{
        new NameValuePair("login[username]", USERNAME),
        new NameValuePair("login[password]", PASSWORD),
        new NameValuePair("g-recaptcha-response", token)
        // 其他必要的表单参数,比如csrf_token等,需要从页面提取
};

Page loggedInPage = webClient.getPage(new PostMethod(LOGIN_URL), params);

内容的提问来源于stack exchange,提问作者Abraham Arnold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:46:09