gpt4 book ai didi

java - 使用 Jsoup 登录

转载 作者:行者123 更新时间:2023-11-30 06:03:54 25 4
gpt4 key购买 nike

我想登录一个网站并保留 cookie。我在使用 Jsoup 的登录部分遇到问题;

我的代码;

                   Connection.Response loginForm = Jsoup.connect("URL" + "/login/").cookies(cookies).method(Connection.Method.GET).execute();

formData.put("username", "#######");
formData.put("pwd", "########");
formData.put("hidden","69");
formData.put("token", loginForm.parse().select("input#token").first().attr("value"));

Connection.Response homePage = Jsoup.connect("URL" + "/login/")
.referrer("URL" + "/login/")
.followRedirects(true)
.cookies(cookies)
.data(formData)
.method(Connection.Method.POST)
.execute();

cookies_2.putAll(homePage.cookies()); // save the cookies, this will be passed on to next request

如果我进入登录页面并使用开发者工具,则有;

Google chrome developper tool

Google chrome developper tool

编辑 1;

现在的问题是我得到了网站的主页,但没有登录部分,我保留了“连接或注册”按钮。

我输出了cookies_2,它与Chrome日志中的cookie相同;

Jsoup cookies_2 output

Chrome cookies when login

现在,我不明白的是,为什么如果我有正确的 cookie,我就无法登录?

编辑2;

我用最终的解决方案修改了我的代码并且它有效!

感谢您的帮助!

最佳答案

几点说明:

  • 您收到 HTTP 状态 302。使用 Jsoup.connect(...).followRedirects(true) 可能是个好主意
  • 某些服务器会检查您来自的网站,因此建议设置引用 header :Jsoup.connect(...).referrer(URL + "/login")
  • 您确定隐藏值始终为69吗?也许每个请求都不同。您可以像这样动态获取它: formData.put("hidden",html.select("co_js").first().attr("value"));
  • 我不喜欢你获取 token 的方式。让我们使用 Jsoup 来提取它:String authToken = html.select("input#token").first().attr("value");

    编辑:

  • 我尝试从头开始执行此操作,但提交的登录表单缺少内容类型定义。尝试使用:Jsoup.connect(...).header("Content-Type","application/x-www-form-urlencoded")我通过分析 Chrome 开发工具中的 header 得到了这个想法。现在我可以成功登录了。
  • 您还可以使用以下代码检查您是否已登录:文档 doc = homePage.parse();
    System.out.println("登录为:"+ doc.select(".dropdown-toggle").text());
  • 通过让服务器知道您可以处理压缩页面,您可以减少下载的页面大小。对于每个请求,请使用: Jsoup.connect(...).header("accept-encoding", "gzip, deflate") 它是透明的,您无需执行任何特殊操作即可处理它,但它在内部起作用。

    编辑2:

根据之前的建议提供最终解决方案:

    import java.util.HashMap;
import java.util.Map;

import org.jsoup.Connection;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Stackoverflow51734840 {

private static final String URL = "https://time2watch.in";
private static final String URL_LOGIN = URL + "/login/";
static String userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";

public static void main(final String[] args) throws Exception {

Map<String, String> headers = new HashMap<String, String>();
headers.put("accept-encoding", "gzip, deflate");

Connection.Response loginForm = Jsoup.connect(URL + "/login").userAgent(userAgent).headers(headers).execute();
Map<String, String> cookies = loginForm.cookies();
Document html = loginForm.parse();

String authToken = html.select("input#token").first().attr("value");
System.out.println("Found authToken:" + authToken);

Map<String, String> formData = new HashMap<String, String>();
formData.put("username", "!!!!!!!!!!!!!!!!!!");
formData.put("pwd", "!!!!!!!!!!!!!!!!!!");
formData.put("hidden", "69");
formData.put("token", authToken);
headers.put("Content-Type", "application/x-www-form-urlencoded");

System.out.println("cookies before login:");
System.out.println(cookies);
System.out.println(" Logged in cookie present? " + cookies.containsKey("s4icookuser"));

Connection.Response afterLoginPage = Jsoup.connect(URL_LOGIN).cookies(cookies).headers(headers)
.userAgent(userAgent).data(formData).method(Connection.Method.POST).referrer(URL_LOGIN).execute();
// update cookies
cookies = afterLoginPage.cookies();

System.out.println("cookies after login:");
System.out.println(cookies);
System.out.println(" Logged in cookie present? " + cookies.containsKey("s4icookuser"));

Response homePage = Jsoup.connect(URL).cookies(cookies).method(Connection.Method.GET).userAgent(userAgent)
.referrer(URL_LOGIN).followRedirects(true).referrer(URL_LOGIN).headers(headers).execute();

Document doc = homePage.parse();
System.out.println("Error? " + doc.text().contains("Erreur"));
System.out.println("OK? " + !doc.text().contains("Se connecter"));
System.out.println("Logged in as: " + doc.select(".dropdown-toggle").text());
}

}

关于java - 使用 Jsoup 登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51734840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com