Cookie для входа в Jsoup? - PullRequest
       42

Cookie для входа в Jsoup?

2 голосов
/ 27 марта 2012

Для проекта я пытаюсь получить данные с веб-сайта, доступ к которым возможен только при входе с сайта Goodreads.com.Я новичок в Jsoup, так как я использую его только для этого конкретного проекта.Получение соответствующих данных с веб-сайта не является проблемой, но я не могу найти нужную мне страницу.Страница, к которой я пытаюсь получить доступ, доступна для просмотра только при входе в систему, когда она не зарегистрирована, она перенаправляет на страницу входа.

Я просмотрел ответы здесь, но ответы, которые были даны до сих пор, имеютне помогло.

Что у меня сейчас:

String url = "http://www.goodreads.com/friend/user/7493379-judith";
Connection.Response res = Jsoup.connect("http://www.goodreads.com/user/sign_in")
            .data("email", "MYEMAIL", "user_password", "MYPASSWORD")
            .method(Connection.Method.POST)
            .execute();

        Document doc2 = res.parse();
        String sessionId = res.cookie("_session_id"); 


    Document doc = Jsoup.connect(url)
            .cookie("_session_id", sessionId)
            .get();

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

  1. Самое главное, конечно;Как я могу заставить это работать?
  2. Приведенные здесь ответы он использовал метод. (Method.POST) вместо метода. (Connection.Method.POST).Однако, когда я использую первый, я получаю ошибку, что Метод не может быть решен.Кто-нибудь знает, почему это так?
  3. В примерах, которые я видел, использовались "username" и "password" в .data ().К чему конкретно они относятся?Я теперь использовал имя поля ввода.Это имя, тип, идентификатор, что именно?Так как Goodreads не относится к входу в систему как к имени пользователя, но как к электронному письму, я предполагаю, что должен изменить их.(имя пользователя и пароль тоже не работают)
  4. В примерах также используется http://example.com/login.php в качестве примера url.У Goodreads нет страницы /login.php.Правильно ли предположить, что я должен использовать URL-адрес с экраном входа в систему?
  5. _session_id - это название соответствующего файла cookie на Goodreads.

Я был бы очень признателенесли кто-нибудь может указать мне в правильном направлении!

Ответы [ 3 ]

1 голос
/ 27 марта 2012
  1. Goodreads требует двух вещей при входе в систему: во-первых, если у вас есть идентификатор сеанса, сохраненный в cookie, и во-вторых, что у вас есть случайное сгенерированное число.Вы можете получить их при первом посещении страницы входа без входа в систему: она установит cookie-файл с идентификатором сеанса, а форма будет содержать скрытую форму ввода (т.е.) с именем «n» и значением числа.Сохраните их и передайте в качестве файла cookie и значения формы при входе в систему.

Несколько замечаний о том, как я это выяснил:

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

Чтобы воссоздать ваш код, я зашел на страницу входа, затем удалил всемои файлы cookie Goodreads (поскольку вы также не отправляете файлы cookie, когда отправляете запрос на вход в систему), и попытались выполнить вход, передав только значения из имени пользователя и пароля.Это дало ошибку, что моя сессия вышла из строя.Когда я сначала загрузил страницу входа, а затем удалил все файлы cookie , за исключением идентификатора сеанса, и не удалил значение формы "n", я смог успешно войти в систему.Поэтому вы хотите сначала сделать общий запрос GET для страницы входа, получить полученный там cookie-файл идентификатора сеанса и значение скрытой формы и передать его вместе с запросом POST.

  1. Может случиться так, что API изменился или что есть только несколько способов.В любом случае, с помощью Connection.Method.POST все будет в порядке.

  2. Да, они относятся к именам полей ввода.Это должен быть идентификатор, однако, так как имя использовалось в прошлом, и не все версии всех браузеров поддерживали передачу идентификаторов в качестве данных, большинство веб-сайтов просто добавляют оба.Либо должно быть в порядке.

  3. Если вы посмотрите на исходный код знака в форме, вы увидите, что атрибут «method» элемента формы действительно является знаком на самой странице, вот где он отправляет запрос.

PS.В качестве общего совета вы можете использовать расширение Firefox «Tamper Data» для удаления данных формы или даже файлов cookie (хотя для этого есть более простые расширения).

1 голос
/ 27 марта 2012
  1. Внимательно посмотрите, какие данные публикуются при входе в систему:

    пользователь [электронная почта]: электронная почта @ электронная почта

    Remember_me: on

    пользователь [пароль]: plain_pasword

    n: 667387

Таким образом, ваше сообщение должно выполнять точно такие же ключи.

2. Убедитесь, чтоВы делаете правильный импорт: import org.jsoup.Connection.Method;, но Connection.Method.POST все еще в порядке.

3. См. p1

4. Да, вы правы

5.Чтоэто вопрос?

0 голосов
/ 22 апреля 2013

Вы можете войти в систему с этим кодом:

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

    Connection.Response execute = Jsoup
            .connect("https://www.goodreads.com/")
            .method(Connection.Method.GET).execute();

    Element sign_in = execute.parse().getElementById("sign_in");
    String authenticityToken = sign_in.select("input[name=authenticity_token]").first().val();
    String n = sign_in.select("input[name=n]").first().val();

    Document document = Jsoup.connect("https://www.goodreads.com/user/sign_in")
            .data("cookieexists", "✓")
            .data("authenticity_token", authenticityToken)
            .data("user[email]", "user@email.com")
            .data("user[password]", "password")
            .data("remember_me", "on")
            .data("n", n)
            .cookies(execute.cookies())
            .post();

}
...