使用JSoup带用户名密码连接网站时遇404错误求助
解决JSoup登录ADVFN时的404错误问题
Hey,我帮你排查了代码和目标登录表单,发现几个关键问题导致了「ADVFN ERROR - Page Not Found」,咱们一步步来修复:
1. 登录请求发错地址了!
你当前是把登录数据提交到https://uk.advfn.com/forum,但目标表单的action属性明确写了要提交到https://secure.advfn.com/login/secure——这是最核心的问题,把数据发到错误的页面,自然会返回404。
2. 表单参数要和页面保持一致
虽然你填了site和redirect_url,但注意:
- 你自定义的
redirect_url值和表单里的不一样,应该用页面返回的那个aHR0cHM6Ly91ay5hZHZmbi5jb20vcC5waHA/cGlkPWxvZ291dA==,不要自己修改; - 目前看你没遗漏表单里的字段(隐藏字段+账号密码都齐了),但要保证每个参数的值都和登录页面返回的一致。
3. Referrer设置不对
登录请求的referrer应该是包含登录表单的页面URL(比如你最初访问的http://www.advfn.com),而不是登录接口的URLhttps://secure.advfn.com/login/secure。
修复后的完整代码示例
// 先访问登录页面,拿到正确的会话cookies和表单参数 Connection.Response loginPage = Jsoup.connect("http://www.advfn.com") .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") .method(Connection.Method.GET) .execute(); Map<String, String> cookies = loginPage.cookies(); // 构建表单参数,严格匹配页面里的字段 Map<String, String> formParams = new HashMap<>(); formParams.put("login_username", "your_real_username"); // 替换成你的真实用户名 formParams.put("login_password", "your_real_password"); // 替换成你的真实密码 formParams.put("site", "uk"); // 使用页面返回的redirect_url,不要自定义 formParams.put("redirect_url", "aHR0cHM6Ly91ay5hZHZmbi5jb20vcC5waHA/cGlkPWxvZ291dA=="); // 提交到正确的登录接口 Document loggedInDoc = Jsoup.connect("https://secure.advfn.com/login/secure") .referrer("http://www.advfn.com") .cookies(cookies) .data(formParams) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") .timeout(5000) // 适当延长超时,避免网络慢导致失败 .followRedirects(true) .post(); // 可以打印页面标题验证是否登录成功 System.out.println(loggedInDoc.title());
额外小贴士
- 你之前用的IE6用户代理太老旧了,换成上面代码里的现代浏览器UA,避免被网站拦截;
- 如果还是失败,建议开启JSoup的调试模式,打印请求和响应的头部信息,看看有没有遗漏的字段(比如有些网站会动态生成CSRF令牌,不过你的表单里没显示这个,先按上面的改试试);
- 一定要保留从登录页面获取的所有cookies,这是网站识别你会话的关键。
内容的提问来源于stack exchange,提问作者user2254180
相关产品推荐
相关产品推荐

