Jsoup Cookies для скребков HTTPS - PullRequest
       9

Jsoup Cookies для скребков HTTPS

13 голосов
/ 21 августа 2011

Я экспериментирую с этим сайтом, чтобы собрать мое имя пользователя на странице приветствия для изучения Jsoup и Android. Используя следующий код

Connection.Response res = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx")
    .data("ctl00$ContentPlaceHolder1$ctl00$Login1$UserName", "username", "ctl00$ContentPlaceHolder1$ctl00$Login1$Password", "password")
    .method(Method.POST)
    .execute();
String sessionId = res.cookie(".ASPXAUTH");

Document doc2 = Jsoup.connect("http://www.mikeportnoy.com/forum/default.aspx")
.cookie(".ASPXAUTH", sessionId)
.get();

Мои файлы cookie (.ASPXAUTH) всегда заканчиваются NULL. Если я удаляю этот файл cookie в веб-браузере, я теряю соединение. Так что я уверен, что это правильное печенье. Кроме того, если я изменю код

.cookie(".ASPXAUTH", "jkaldfjjfasldjf")  Using the correct values of course

Я могу вычеркнуть свое имя пользователя на этой странице. Это также заставляет меня думать, что у меня есть правильное печенье. Итак, как же получается, что мое печенье появляется Null? Мои поля имени пользователя и пароля неверны? Что-то другое?

Спасибо.

Ответы [ 3 ]

33 голосов
/ 10 мая 2012

Я знаю, что опаздываю на 10 месяцев здесь. Но хорошим вариантом использования Jsoup является использование этого простого кода:

//This will get you the response.
Response res = Jsoup
    .connect("url")
    .data("loginField", "login@login.com", "passField", "pass1234")
    .method(Method.POST)
    .execute();

//This will get you cookies
Map<String, String> cookies = res.cookies();

//And this is the easieste way I've found to remain in session
Documente doc = Jsoup.connect("url").cookies(cookies).get();

Хотя у меня все еще проблемы с подключением к НЕКОТОРЫМ веб-сайтам, я подключаюсь ко многим из них с помощью одного и того же основного кода. Да, и прежде чем я забуду .. Я решил, что моя проблема в том, что это SSL-сертификаты. Вы должны правильно управлять ими так, как я до сих пор не понял.

12 голосов
/ 21 апреля 2013

Я всегда делаю это в два шага (как обычный человек),

  1. Чтение страницы входа (по GET, чтение файлов cookie)
  2. Отправка формы и файлов cookie (по почте, безманипулирование файлами cookie)

Пример:

Connection.Response response = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx")
        .method(Connection.Method.GET)
        .execute();

response = Jsoup.connect("http://www.mikeportnoy.com/forum/login.aspx")
        .data("ctl00$ContentPlaceHolder1$ctl00$Login1$UserName", "username")
        .data("ctl00$ContentPlaceHolder1$ctl00$Login1$Password", "password")
        .cookies(response.cookies())
        .method(Connection.Method.POST)
        .execute();

Document homePage = Jsoup.connect("http://www.mikeportnoy.com/forum/default.aspx")
        .cookies(response.cookies())
        .get();

И всегда устанавливать файлы cookie от предыдущего запроса до следующего использования

         .cookies(response.cookies())

SSL здесь не важен.Если у вас есть проблемы с сертификатами, выполните этот метод для игнорирования SSL.

public static void trustEveryone() {
    try {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new X509TrustManager[]{new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { }

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }}, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
    } catch (Exception e) { // should never happen
        e.printStackTrace();
    }
}
0 голосов
/ 13 ноября 2011

Что делать, если вы попытаетесь получить и передать все файлы cookie, не предполагая ничего подобного: Отправка запроса POST с именем пользователя и паролем и сохранение файла cookie сеанса

Если у вас все еще есть проблемы, попробуйте поискать вthis: Проблемы с передачей файлов cookie на запрос GET (после POST)

...