2012-03-27 2 views
2

Для проекта Я пытаюсь получить данные с веб-сайта только при условии, что вы вошли в систему с сайта Goodreads.com. Я новичок в Jsoup, так как я использую его только для этого конкретного проекта. Получение соответствующих данных с веб-сайта не является проблемой, но я, похоже, не могу попасть на нужную мне страницу. Страница, к которой я пытаюсь подключиться, доступна только при входе в систему, когда она не войдет в систему, она попадает на страницу входа.Cookie для входа в систему с 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(); 

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

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

Буду очень признателен, если любой может указать мне в правильном направлении!

ответ

1
  1. Смотрите внимательно, что данные размещены на входе:

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

    Remember_Me: на

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

    n: 667387

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

2.Выберите правильный импорт: import org.jsoup.Connection.Method; , но Connection.Method.POST по-прежнему хорош.

3.See p1

4.Yes, вы правильно

5.What вопрос?

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

Некоторые замечания о том, как я узнал об этом:

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

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

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

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

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

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

0

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

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]", "[email protected]") 
      .data("user[password]", "password") 
      .data("remember_me", "on") 
      .data("n", n) 
      .cookies(execute.cookies()) 
      .post(); 

} 
Смежные вопросы