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

#java #android #http #cookies #jsoup

#java #Android #http #файлы cookie #jsoup

Вопрос:

Я застрял в этой проблеме уже несколько дней, мои глаза начинают болеть от времени, потраченного на попытки разных комбинаций, но безуспешно. Дело в том, что я создаю приложение, которое должно получать данные из Интернета, анализировать их, а затем показывать пользователю. Я пробовал несколько методов для этого, и использование 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ži")
              .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=3226amp;")
            .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 raw, захваченные браузером: (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=3226amp; 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=033amp;br=123456amp;_uqid=amp;_cdt=amp;_hsh=amp;btnSearch=Traži
 

(получение)

 > GET /index.php?id=3226amp; 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=3226amp; 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ži"));
                 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=3226amp;");
                 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-объект, который я затем мог бы использовать в качестве входных данных (InputStream) для парсера lovely JSOUP, это было бы потрясающе. Или, может быть, я получил все это о том, что нужно странице, и мне нужно делать мои запросы с разными параметрами, я был бы признателен. Я использовал Wireshark и Charles Debugging Proxy, чтобы понять, что создавать (попробовал оба, чтобы перепроверить), И нашел только этот идентификатор сеанса, fe_typo_user и некоторые другие параметры, используемые для отслеживания времени на сайте и т. Д., И я тоже пытался передать их, «_utma» «_utmb» … и так далее.

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

Ответ №1:

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

Проблема была с «ошибкой» или поведением HttpClient. Если вы добавляете параметр в post, а параметр является emty, имеет значение «», он не отправляется с запросом. Я этого не знал и думал, что эти параметры, поскольку они пустые, ничего не изменят, и при выполнении работы с 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 и все портит.

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