HTTP CURL 有效 - Java Jsoup 无效

HTTP CURL works - Java Jsoup doesn't

我尝试从站点 (https://bs.to) 抓取一些聊天消息,但我必须先通过 HTTP POST 登录。在 CURL 中,我的代码工作正常:

curl -v -X POST ^
-H "Cookie: __bsduid=226mq3kt8oafl5f1le1hv3ognl; " ^
-d "login[user]=RainbowSimon&login[pass]=MY_PASSWORD&security_token=687f7de7247f9a95f7fccc6a" "https://bs.to" ^
--output "out.txt"

但是当我尝试使用 JSoup 将其放入 Java 时,我得到状态代码 200 和一个 HTML 结构,但我没有登录

Connection.Response loggedIn;
loggedIn = Jsoup.connect("http://bs.to")
    .cookie("__bsduid", cookieUID)
    .data("login[user]", loginUserName)
    .data("login[pass]", loginUserPassword)
    .data("security_token", securityTokenForm)
    .method(Method.POST)
    .execute();

System.out.println(loggedIn.statusCode());
System.out.println(loggedIn.parse());

我什至从 Java 应用程序中检索了 security_token 和 cookie,并将它们放入 CURL 中,它也起作用了。

有人看到我在尝试实现 Java 时犯的错误吗?

您收到不同的响应,因为您发送了不同的请求。这里的主要区别是 headers。

Web 浏览器和 curl 会自动为您设置一些基本请求 headers 但 Jsoup 不会这样做。您必须明确地将它们添加到连接中。您将 curl 与 -v 一起使用,因此它们已经可见:

> POST / HTTP/2
> Host: bs.to
> User-Agent: curl/7.60.0
> Accept: */*
> Cookie: __bsduid=226mq3kt8oafl5f1le1hv3ognl;
> Content-Length: 88
> Content-Type: application/x-www-form-urlencoded

Jsoup 不会设置 headers:User-AgentAcceptContent-Type。有些服务器需要它们中的一些来区分真实的网络浏览器和爬虫。尝试将它们设置为与上面完全相同的值,使用 .header(name, value) 来模拟相同的请求。
curl 和 Jsoup 之间的另一个区别是 curl 似乎使用的是 HTTP2,而 Jsoup 使用的是 HTTP1.1,但事实并非如此。为确保尝试将 curl 与 --http1.1 开关一起使用。
None 以上我可以测试,因为你的 cookie 对我不起作用,所以你必须自己试验。