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

如何使用Java的Jsoup登录含动态Token生成的受保护网页?

解决Jsoup爬虫中动态生成Token/参数的登录问题

针对你遇到的带BlazingWebCookie、动态bfu/blazing_answer参数的网站登录流程,以及同类动态Token生成网站的通用解决方案,整理如下:

一、针对该网站的分步实现方案

1. 捕获初始BlazingWebCookie

首先发起主页请求,获取并保存响应中的Cookie集合:

// 发起初始GET请求,获取BlazingWebCookie
Connection.Response initialResp = Jsoup.connect("https://目标网站域名")
        .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
        .execute();
Map<String, String> cookies = new HashMap<>(initialResp.cookies());

2. 解析JS逻辑生成bfu和blazing_answer参数

从初始响应的HTML中提取生成参数的JS代码,分析其生成逻辑后用Java重实现。
比如假设页面JS生成逻辑是:

var bfu = Date.now().toString();
var webCookie = document.cookie.match(/BlazingWebCookie=([^;]+)/)[1];
var blazing_answer = md5(bfu + webCookie);

对应的Java实现(需引入Apache Commons Codec工具类):

import org.apache.commons.codec.digest.DigestUtils;

// 生成bfu(当前时间戳字符串)
String bfu = String.valueOf(System.currentTimeMillis());
// 获取BlazingWebCookie值
String blazingWebCookie = cookies.get("BlazingWebCookie");
// 生成blazing_answer
String blazingAnswer = DigestUtils.md5Hex(bfu + blazingWebCookie);

3. 请求获取BlazingPuzzleCookie

携带已有的Cookie和生成的参数发起GET请求,处理302跳转并更新Cookie集合:

Connection.Response puzzleResp = Jsoup.connect("https://目标网站域名/验证接口路径")
        .cookies(cookies)
        .data("bfu", bfu)
        .data("blazing_answer", blazingAnswer)
        .followRedirects(true)
        .execute();
// 合并新获取的BlazingPuzzleCookie
cookies.putAll(puzzleResp.cookies());

用更新后的Cookie重新请求主页,获取会话Cookie:

Connection.Response sessionResp = Jsoup.connect("https://目标网站域名")
        .cookies(cookies)
        .execute();
cookies.putAll(sessionResp.cookies());

5. 发起POST请求完成登录

携带所有Cookie和登录凭证提交请求:

Connection.Response loginResp = Jsoup.connect("https://目标网站域名/登录接口路径")
        .cookies(cookies)
        .data("username", "你的用户名")
        .data("password", "你的密码")
        .method(Connection.Method.POST)
        .execute();

// 登录成功后,cookies中已包含有效会话Cookie,可用于访问受保护页面
Document protectedPage = Jsoup.connect("https://目标网站域名/受保护页面")
        .cookies(cookies)
        .get();

二、同类动态Token网站的通用解决方案

方案1:解析JS逻辑重实现

  • 适用场景:参数生成逻辑简单、无混淆的JS代码
  • 操作步骤:抓包获取页面JS → 分析参数生成算法 → 用Java重写对应逻辑
  • 优势:性能高、无额外依赖;劣势:遇到混淆JS时分析成本高

方案2:用支持JS执行的工具配合Jsoup

如果JS逻辑复杂难以解析,可使用HtmlUnit、Selenium等工具自动执行页面JS,完成参数生成和跳转后再提取Cookie给Jsoup使用:

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import java.util.HashMap;
import java.util.Map;

WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setCssEnabled(false);

// 访问主页,自动执行JS完成参数生成和跳转
HtmlPage page = webClient.getPage("https://目标网站域名");
// 提取所有Cookie
Map<String, String> cookies = new HashMap<>();
webClient.getCookieManager().getCookies().forEach(cookie -> 
        cookies.put(cookie.getName(), cookie.getValue())
);

// 关闭WebClient,后续用Jsoup携带Cookie操作
webClient.close();

// 用获取到的Cookie发起登录请求
Connection.Response loginResp = Jsoup.connect("https://目标网站域名/登录路径")
        .cookies(cookies)
        .data("username", "你的用户名")
        .data("password", "你的密码")
        .post();
  • 优势:无需分析JS逻辑,自动处理动态参数和跳转;劣势:性能相对较低,需处理浏览器兼容性问题

方案3:抓包获取参数生成接口

部分网站的动态参数是通过单独的后端接口返回的,可直接调用该接口获取参数。
操作步骤:用Chrome DevTools/Fiddler抓包 → 找到生成参数的API接口 → 直接请求该接口获取参数

三、注意事项

  • 模拟真实请求头:每次请求都带上User-Agent、Referer等头部,避免触发反爬机制
  • 严格遵循网站请求流程:按实际登录顺序发起请求,不要跳过任何步骤
  • 处理Cookie的持续更新:每次响应的Cookie都要合并到Cookie集合中,确保后续请求携带完整凭证

内容的提问来源于stack exchange,提问作者Mustafa Yilmaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:42:09