java - HTTP CURL 有效 - Java Jsoup 无效

标签 java http curl jsoup

我尝试从网站 ( 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 时犯的错误吗?

最佳答案

由于您发送了不同的请求,您会得到不同的响应。这里的主要区别是标题。

Web 浏览器和curl 会自动为您设置一些基本的请求 header ,但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 不会设置 header :User-AgentAcceptContent-Type。某些服务器需要其中一些来区分真实的网络浏览器和爬虫。尝试使用 .header(name, value) 将它们设置为与上面完全相同的值来模拟相同的请求。
curl 和 Jsoup 之间的另一个区别是,curl 似乎使用 HTTP2,但 Jsoup 使用 HTTP1.1,但事实不应该如此。要确保尝试使用带有 --http1.1 开关的curl。
以上都无法由我测试,因为你的 cookie 不适合我,所以你必须自己尝试。

关于java - HTTP CURL 有效 - Java Jsoup 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62089423/

相关文章:

PHP、CURL、WebDAV 和 SEARCH 方法

java - 获取 Activity 实例

java - 重复验证错误

java - 将数组保存到文件中 (Java)

java - 通过 MYSQL 存储过程通过 JDBC 插入韩文字符出错

http - 网址格式 : Empty Path

java - 用java解析http返回的xml

java - 为什么我在尝试使用这个 github 项目时会陷入无限循环?

java - org.apache.axis2.AxisFault : Transport error: 501 Error: Not Implemented

PHP curl,保留 session