2010-06-18 12 views
0

J'essaie d'accéder à un site Web ASPX où les pages suivantes sont renvoyées en fonction des données de poste . Malheureusement, toutes mes tentatives pour obtenir les pages suivantes échouent. Heureusement, quelqu'un ici a une idée où trouver l'erreur!Traitement d'un site Web à l'aide de données POST et de cookies

Dans la première étape, j'ai lu l'ID de session du cookie ainsi que la valeur de la variable viewstate dans la page html renvoyée. La deuxième étape a pour but de renvoyer le au serveur pour obtenir la page désirée.

renifler les données dans le navigateur Web donne

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 

Actuellement, mon script ressemble à ceci

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()); 
     } 
    } 
} 

Toute idée de ce qui ne va pas? Toute aide est très appréciée!

Mise à jour

Merci pour la réponse rapide!

J'ai basculé pour utiliser le HttpURLConnection au lieu de l'URLConnection qui implémente setRequestMethod(). J'ai également corrigé les erreurs mineures que vous avez mentionnées, par ex. supprimé le premier appel setRequestProperty obsolète.

Malheureusement, cela ne change rien ... Je pense que je définis tous les paramètres pertinents, mais toujours obtenir la première page de la liste, seulement. Il semble que le "__EVENTTARGET = ctl00 $ ContentBody $ pgrBottom $ lbGoToPage_3" est ignoré. Je n'ai aucune idée pourquoi.

En interne, le formulaire sur le site ressemble à ceci:

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

Il est appelé par le javascript suivant:

<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> 

Espérons que cela aide à trouver une solution?

Salutations maik.

Répondre

0

Voulez-vous vraiment GET ou POST? Si vous voulez POST, alors vous pouvez avoir besoin de la ligne setRequestMethd().

Vous définissez le type de contenu deux fois. Je pense que vous devrez peut-être les combiner en une seule ligne. Ensuite, ne fermez pas le flux de sortie avant d'essayer de lire dans le flux d'entrée. À part cela, y a-t-il plus de consignation que vous pouvez mettre dans/indices que vous pouvez donner pour savoir comment cela se passe mal dans?

0

Hey utilisez le code suivant

chaîne userAgent = "Mozilla/5.0 (Windows NT 6.1, Win64, 64 bits; 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();