HTTP CURL работает - Java Jsoup не работает - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь очистить некоторые сообщения чата с сайта (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"

Но затем, когда я попытался получить его в Java с помощью JSoup, я получил код состояния 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());

Я даже получил security_token и cook ie из приложения Java и поместил их в CURL, и это тоже сработало.

Кто-нибудь видит ошибку, которую я сделал при попытке реализовать в Java?

1 Ответ

0 голосов
/ 29 мая 2020

Вы получаете разные ответы, потому что отправляете другой запрос. Главное отличие здесь - заголовки.

Веб-браузеры и curl автоматически устанавливают для вас некоторые основные c заголовки запросов, но 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 не будет устанавливать заголовки: User-Agent, Accept и Content-Type. Некоторые из них требуются некоторыми серверами, чтобы отличать настоящие веб-браузеры от поисковых роботов. Попробуйте установить для них точно такие же значения, как указано выше, используя .header(name, value) для имитации того же запроса.
Другое различие между curl и Jsoup заключается в том, что curl, похоже, использует HTTP2, но Jsoup использует HTTP1.1, но этого не должно быть. быть так. Чтобы убедиться, попробуйте использовать curl с переключателем --http1.1.
Я не могу проверить ни одно из вышеперечисленного, потому что ваши файлы cookie не работают для меня, поэтому вам придется поэкспериментировать самостоятельно.

...