Обработка веб-сайта с использованием данных POST и файлов cookie - PullRequest
0 голосов
/ 19 июня 2010

Я пытаюсь получить доступ к ASPX-сайту, где последующие страницы возвращаются на основе размещать данные. К сожалению, все мои попытки получить следующие страницы потерпели неудачу. Надеюсь, у кого-то здесь есть идея, где найти ошибку!

На первом этапе я считываю идентификатор сеанса из файла cookie, а также значение Переменная viewstate в возвращенной HTML-странице. Шаг второй намеревается отправить его вернуться на сервер, чтобы получить нужную страницу.

Анализ данных в веб-браузере дает

Host=www.geocaching.com
User-Agent=Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100618
Iceweasel/3.5.9 (like Firefox/3.5.9)
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language=en-us,en;q=0.5
Accept-Encoding=gzip,deflate
Accept-Charset=ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive=300
Connection=keep-alive
Referer=http://www.geocaching.com/seek/nearest.aspx?state_id=149
Cookie=Send2GPS=garmin; BMItemsPerPage=200; maprefreshlock=true; ASP.
NET_SessionId=c4jgygfvu1e4ft55dqjapj45
Content-Type=application/x-www-form-urlencoded
Content-Length=4099
POSTDATA=__EVENTTARGET=ctl00%24ContentBody%24pgrBottom%
24lbGoToPage_3&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPD[...]2Xg%3D%
3D&language=on&logcount=on&gpx=on

В настоящее время мой сценарий выглядит следующим образом

import java.net.*;
import java.io.*;
import java.util.*;
import java.security.*;
import java.net.*;

public class test1 {
    public static void main(String args[]) {
        // String loginWebsite="http://geocaching.com/login/default.aspx";
        final String loginWebsite = "http://www.geocaching.com/seek/nearest.aspx?state_id=159";
        final String POST_CONTENT_TYPE = "application/x-www-form-urlencoded";

        // step 1: get session ID from cookie
        String sessionId = "";
        String viewstate = "";
        try {
            URL url = new URL(loginWebsite);

            String key = "";
            URLConnection urlConnection = url.openConnection();

            if (urlConnection != null) {
                for (int i = 1; (key = urlConnection.getHeaderFieldKey(i)) != null; i++) {
                    // get ASP.NET_SessionId from cookie
                    // System.out.println(urlConnection.getHeaderField(key));
                    if (key.equalsIgnoreCase("set-cookie")) {
                        sessionId = urlConnection.getHeaderField(key);
                        sessionId = sessionId.substring(0, sessionId.indexOf(";"));

                    }
                }

                BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

                // get the viewstate parameter
                String aLine;
                while ((aLine = in.readLine()) != null) {
                    // System.out.println(aLine);
                    if (aLine.lastIndexOf("id=\"__VIEWSTATE\"") > 0) {
                        viewstate = aLine.substring(aLine.lastIndexOf("value=\"") + 7, aLine.lastIndexOf("\" "));
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println(sessionId);
        System.out.println("\n");
        System.out.println(viewstate);
        System.out.println("\n");

        // String goToPage="3";

        // step2: post data to site
        StringBuilder htmlResult = new StringBuilder();
        try {

            String encoded = "__EVENTTARGET=ctl00$ContentBody$pgrBottom$lbGoToPage_3" + "&" + "__EVENTARGUMENT=" + "&"
                + "__VIEWSTATE=" + viewstate;

            URL url = new URL(loginWebsite);
            URLConnection urlConnection = url.openConnection();
            urlConnection = url.openConnection();

            // Specifying that we intend to use this connection for input
            urlConnection.setDoInput(true);

            // Specifying that we intend to use this connection for output
            urlConnection.setDoOutput(true);

            // Specifying the content type of our post
            urlConnection.setRequestProperty("Content-Type", POST_CONTENT_TYPE);

            // urlConnection.setRequestMethod("POST");

            urlConnection.setRequestProperty("Cookie", sessionId);
            urlConnection.setRequestProperty("Content-Type", "text/html");

            DataOutputStream out = new DataOutputStream(urlConnection.getOutputStream());
            out.writeBytes(encoded);
            out.flush();
            out.close();

            BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

            String aLine;
            while ((aLine = in.readLine()) != null) {
                System.out.println(aLine);
            }

        } catch (MalformedURLException e) {
            // Print out the exception that occurred
            System.err.println("Invalid URL " + e.getMessage());
        } catch (IOException e) {
            // Print out the exception that occurred
            System.err.println("Unable to execute " + e.getMessage());
        }
    }
}

Есть идеи, что случилось? Любая помощь очень ценится!

Обновление

Спасибо за быстрый ответ!

Я переключился на использование HttpURLConnection вместо URLConnection, который реализует setRequestMethod (). Я также исправил мелкие ошибки, которые вы упомянули, например, убрал устаревший первый вызов setRequestProperty.

К сожалению, это ничего не меняет ... Думаю, я установил все соответствующие параметры, но все равно получаю только первую страницу списка. Кажется, что "__EVENTTARGET = ctl00 $ ContentBody $ pgrBottom $ lbGoToPage_3" игнорируется. Понятия не имею почему.

Внутренне форма на сайте выглядит так:

<form name="aspnetForm" method="post" action="nearest.aspx?state_id=159" id="aspnetForm">

Он вызывается следующим javascript:

<script type="text/javascript"> 
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script> 

Надеюсь, это поможет найти решение?

Поздравления MAIK.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2016

Эй, используйте следующий код

String userAgent = "Mozilla / 5.0 (Windows NT 6.1; Win64; x64; rv: 25.0) Gecko / 20100101 Firefox / 25.0";

        org.jsoup.nodes.Document jsoupDoc = Jsoup.connect(url).timeout(15000).userAgent(userAgent).referrer("http://calendar.legis.ga.gov/Calendar/?chamber=House").ignoreContentType(true)
                .data("__EVENTTARGET", eventtarget).data("__EVENTARGUMENT", eventarg).data("__VIEWSTATE", viewState).data("__VIEWSTATEGENERATOR", viewStateGenarator)
                .data("__EVENTVALIDATION", viewStateValidation).parser(Parser.xmlParser()).post();
0 голосов
/ 19 июня 2010

Вы действительно хотите получить или отправить?Если вы хотите выполнить POST, тогда вам может понадобиться строка setRequestMethd ().

Вы устанавливаете Content-Type дважды - я думаю, что вам может понадобиться объединить их в одну строку.

Затем не закрывайте выходной поток, прежде чем пытаться читать из входного потока.

Кроме этого, есть ли еще какие-либо записи в журнале, которые вы можете указать / подсказки, которые вы можете указать относительно того, как все идет не так?в

...