Intereting Posts
«Источник не найден» при отладке приложения Android с помощью Eclipse Android обнаруживает Bluetooth-разъединение сразу Макс. 2 секунды Как разработать интерфейс, который будет выглядеть как родной для Android с помощью jQuery-mobile? Как связать навигационный ящик с кнопкой перетаскивания? Ошибка Runtime.exec (): зависает без предоставления объекта Process Есть ли способ получить фрагмент сверху стека? Android-вкладки в фрагменте с рушащейся панелью инструментов IllegalArgumentException: уже добавлено: Landroid / support / v4 / accessibilityservice / AccessibilityServiceInfoCompat $ AccessibilityServiceInfoIcsImpl; Типы памяти Android (RAM v Внутренняя память) Android webview.loadUrl не загружает другую веб-страницу Ошибка при выполнении периодической синхронизации Выполнение не выполнено для задачи ': app: processDebugManifest' после Android Stdio 2.2 udpate Android throw InflateException двоичная строка XML-файла: ошибка раздувания фрагмента класса Как Canvas определяет границы клипа? Получить язык пользователя в android

Проблемы с передачей файлов cookie для запроса GET (после POST)

Я застрял в этом вопросе уже несколько дней, мои глаза начинают болеть от времени, потраченного на различные комбинации, но безуспешно. Дело в том, что я делаю приложение, которое должно получить данные из Интернета, проанализировать его и затем показать его пользователю. Я пробовал несколько методов для этого, и использование JSOUP было очень полезно, особенно при разборе и получении данных из результатов.

Однако есть одна проблема, которую я не могу решить. Я попытался с помощью обычного HTTPClient и с JSOUP, но я не могу успешно получить нужные мне данные. Вот мой код (версия JSOUP):

public void bht_ht(Context c, int pozivni, int broj) throws IOException { //this is the first connection, to get the cookies (I have tried the version without this method separate, but it's the same Connection.Response resCookie = Jsoup.connect("http://www.bhtelecom.ba/imenik_telefon.html") .method(Method.GET) .execute(); String sessionId = resCookie.cookie("PHPSESSID"); String fetypo = resCookie.cookie("fe_typo_user"); //these two above are the cookies //the POST request, with the data asked Connection.Response res = Jsoup.connect("http://www.bhtelecom.ba/imenik_telefon.html?a=search") .data("di", some_data) .data("br", some_data) .data("btnSearch","Tra%C5%BEi") .cookie("PHPSESSID", sessionId) .cookie("fe_typo_user", fetypo) .method(Method.POST) .execute(); Document dok = res.parse(); //So, here is the GET request for the site which contains the results, and this site is redirected to with HTTP 302 response after the POSt result Document doc = Jsoup.connect("http://www.bhtelecom.ba/index.php?id=3226&") .cookie("PHPSESSID", sessionId) .cookie("fe_typo_user", fetypo) .referrer("http://www.bhtelecom.ba/imenik_telefon.html") .get(); Document doc = res2.parse(); Element elemenat = doc.select("div.boxtexter").get(0); String ime = elemenat.text(); } 

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

Вот POST и GET исходные заголовки, захваченные браузером: (post)

 > POST /imenik_telefon.html?a=search HTTP/1.1 Host: www.bhtelecom.ba > Content-Length: 56 Cache-Control: max-age=0 Origin: > http://www.bhtelecom.ba User-Agent: Mozilla/5.0 (Windows NT 6.1; > WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 > Safari/535.1 Content-Type: application/x-www-form-urlencoded Accept: > text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 > Referer: http://www.bhtelecom.ba/index.php?id=3226& Accept-Encoding: > gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: > ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: > PHPSESSID=opavncj3317uidbt93t9bie980; > fe_typo_user=332a76d0b1d4944bdbbcd28d63d62d75; > __utma=206281024.1997742542.1319583563.1319583563.1319588786.2; __utmb=206281024.1.10.1319588786; __utmc=206281024; __utmz=206281024.1319583563.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) > > di=033&br=123456&_uqid=&_cdt=&_hsh=&btnSearch=Tra%C5%BEi 

(получить)

 > GET /index.php?id=3226& HTTP/1.1 Host: www.bhtelecom.ba Cache-Control: > max-age=0 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) > AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1 > Accept: > text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 > Referer: http://www.bhtelecom.ba/index.php?id=3226& Accept-Encoding: > gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: > ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: > PHPSESSID=opavncj3317uidbt93t9bie980; > __utma=206281024.1997742542.1319583563.1319583563.1319588786.2; __utmb=206281024.1.10.1319588786; __utmc=206281024; __utmz=206281024.1319583563.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); fe_typo_user=07745dd2a36a23c64c2297026061a2c2 

В этом GET (его ответе) мне нужны данные, но с любой комбинацией параметров, файлов cookie или всего, что я пробовал, я не мог заставить его «думать», что я сделал POST, и теперь хочу, чтобы эти данные ,

Вот версия моего кода без парсера JSOUP, но я не могу заставить его работать, хотя, когда я проверяю эти файлы cookie, они в порядке, одинаковые для POST и GET, но безуспешно.

 DefaultHttpClient client = new DefaultHttpClient(); String postURL = "http://www.bhtelecom.ba/imenik_telefon.html?a=search"; HttpPost post = new HttpPost(postURL); post.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("di", "035")); params.add(new BasicNameValuePair("br", "819443")); params.add(new BasicNameValuePair("btnSearch","Tra%C5%BEi")); UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8); post.setEntity(ent); HttpResponse responsePOST = client.execute(post); HttpEntity resEntity = responsePOST.getEntity(); if (resEntity != null) { //todo } //checking for cookies, they are OK List<Cookie> cookies = client.getCookieStore().getCookies(); if (cookies.isEmpty()) { Log.d(TAG, "no cookies"); } else { for (int i = 0; i < cookies.size(); i++) { Log.d(TAG, "cookies: " + cookies.get(i).toString()); } } resEntity.consumeContent(); HttpGet get = new HttpGet("http://www.bhtelecom.ba/index.php?id=3226&"); get.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE); HttpResponse responseGET = client.execute(get); HttpEntity entityGET = responseGET.getEntity(); List<Cookie> cookiesGet = client.getCookieStore().getCookies(); if (cookies.isEmpty()) { Log.d(TAG, "no cookies"); } else { for (int i = 0; i < cookiesGet.size(); i++) { Log.d(TAG, "cookies GET: " + cookiesGet.get(i).toString()); } } //a method to check the data, I pass the InputStream to it, and do the operations, I've tried "manually", and passing the InputStream to JSOUP, but without success in either case. samplemethod(entityGET.getContent()); client.getConnectionManager().shutdown(); } catch (Exception e) { e.printStackTrace(); } 

Поэтому, если кто-нибудь может найти ошибку в моей настройке или найти способ сделать эти два запроса, а затем получить данные, HTTP Entity, которые я мог бы использовать в качестве ввода (InputStream) для прекрасного парсера JSOUP, который Быть потрясающим. Или, может быть, я понял все, что нужно странице, и мне нужно сделать мои запросы с разными параметрами, я был бы признателен. Я использовал Wireshark и Charles Debugging Proxy, чтобы получить представление о том, что создавать (попробовал оба, дважды проверить), и нашел только этот идентификатор сеанса, fe_typo_user и некоторые другие параметры, используемые для отслеживания времени на сайте и т. Д., И я попытался Пропуская их тоже "_ utma" " _utmb" … и так далее.

У меня есть некоторые другие методы, используя «более простые», POST-методы с данными в ответ, и я успешно их получил, но эта конкретная проблема с этим сайтом сводит меня с ума. Заранее спасибо за вашу помощь.

После многих, многочасовых попыток и отслеживания входящих / исходящих пакетов, мне наконец удалось найти решение.

Все дело в «ошибке» или поведении HTTPClient. Если вы добавите параметр в сообщение, а параметр – emty, имеет значение «», оно не будет отправлено с запросом. Я не знал этого и думал, что эти параметры, так как они пусты, не изменят enything, а с помощью JSOUP я не передал их на запросы.

Так,

 params.add(new BasicNameValuePair("_uqid", "")); params.add(new BasicNameValuePair("_cdt", "")); params.add(new BasicNameValuePair("_hsh", "")); 

Были местами, представляющими интерес.

Другое дело, так как эта страница имеет ответ 302, и JSOUP имеет значение followRedirects, установленное как «true» как значение по умолчанию, мне пришлось сделать это false также потому, что этот метод POST, а «запрос на последующий запрос» должен быть GET, но JSOUP предполагает Это все еще POST и все испортит.

Так вот, надеюсь, кто-то найдет это полезным 🙂