Я хочу сделать, руководство ДОБИРАЕТСЯ с cookie, чтобы загрузить и проанализировать веб-страницу. Я должен извлечь маркер безопасности для создания сообщения на форуме. Я завершил вход в систему, считал ответ и извлек cookie (3 пары (имя, значение)). Я затем записал Строку, содержащую cookie как это:
CookieString="name1=value1; name2=value2; name3=value3"
Я затем делаю следующее
HttpURLConnection connection
connection = (HttpURLConnection)(new URL(Link).openConnection());
connection.setRequestMethod("GET");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Cookie", CookieString );
connection.connect();
Я затем прочитал страницу, но она показывает, что я не зарегистрирован на форуме. Что я делаю неправильно?
править: Я знаю, что должен извлечь маркер безопасности, если я хочу сделать сообщение. Мой ход мыслей был то, что для извлечения его, я должен ПОЛУЧИТЬ эту конкретную страницу. Но чтобы маркер безопасности был как скрытое поле, я должен быть онлайн, таким образом мне были нужны cookie. Но когда я ПОЛУЧАЮ страницу, и я установил cookie, как упомянуто выше, я получаю страницу как, гость, она показывает, что я не онлайн, и значение маркера безопасности является гостем, который не полезен для меня. Я проверю ссылку, которую Вы дали мне и надо надеяться найдете решение.
Предполагая, что значения cookie не жестко запрограммированы, а получены из предыдущего запроса, вероятно, проще всего использовать класс CookieHandler
.
CookieHandler.setDefault(new CookieManager());
Тогда ваш HttpURLConnection
автоматически сохранит все полученные файлы cookie и отправит их обратно со следующим запросом на тот же хост.
Чтобы быть уверенным, вы должны собирать куки из Set-Cookie
заголовков ответа. Чтобы отправить их обратно в последующих запросах, вы должны установить их по одному, используя URLConnection#addRequestProperty()
.
По существу:
// ...
// Grab Set-Cookie headers:
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
// ...
// Send them back in subsequent requests:
for (String cookie : cookies) {
connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
}
// ...
split(";", 2)
служит для того, чтобы избавиться от атрибутов cookie, которые не имеют значения для серверной стороны, таких как expires
, path
и т.д.
Для более удобного HTTP клиента я бы предложил взглянуть на Apache HttpComponents Client. Он может обрабатывать все куки более прозрачно.
Обновление: согласно комментариям, это не проблема с куками. Неверный токен запроса означает, что сервер имеет встроенную защиту от CSRF/ботов (чтобы предотвратить таких, как вы). Вам нужно извлечь токен как скрытое поле ввода из запрашиваемой страницы с формой и повторно отправить его в качестве параметра запроса. Jsoup может быть полезен для извлечения всех (скрытых) полей ввода. Не забудьте также передать пару имя-значение кнопки, которую вы хотите "нажать" программно. Также смотрите вышеупомянутую ссылку для получения дополнительных подсказок.
В будущем вам следует более четко формулировать точную ошибку, которую вы получаете, а не гадать наобум. Копируйте точное сообщение об ошибке и т.д.