2009-03-10 14 views
2

Ich habe diesen Code getan um sich einzuloggen, um eine Webseite abzurufen und zeigen:Wie man eine HTML-umgeleitete Webseite programmgesteuert abruft?

// login info array 
     string postData = "user_name=tler"; 
     postData += "&user_password=lodvader"; 
     byte[] data = Encoding.ASCII.GetBytes(postData); 

     // web request 
     WebRequest req = WebRequest.Create("http://www.lol.com/login.php"); 
     req.Method = "POST"; 
     req.ContentType = "application/x-www-form-urlencoded"; 
     req.ContentLength = data.Length; 

     // stream response to string 
     Stream newStream = req.GetRequestStream(); 
     newStream.Write(data, 0, data.Length); 
     newStream.Close(); 
     StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream(), Encoding.GetEncoding("iso-8859-1")); 

     string responseString = reader.ReadToEnd(); 

     // retrieve text within title 
     Regex rx = new Regex(@"(?<=<title>).+?(?=</title>)"); 

     var variable = rx.Matches(responseString); 

     // output 
     Console.WriteLine(variable[0]); 

     Console.ReadLine(); 

Aber die folgende Seite nach der Anmeldung wird eine HTML-Umleitung wie:

<meta http-equiv="refresh" content="3; URL="bb.php"> 

Wie Sie diesem Link zu folgen und nächste Seite abrufen?

Antwort

2

Ich habe die Zeit gefunden, es zu beenden, hier die Antwort (ich versuchte, so klar wie möglich zu sein):

 // Cookie for our session 
     var cookieContainer = new CookieContainer(); 

     // Encode post variables 
     ASCIIEncoding encoding=new ASCIIEncoding(); 
     byte[] loginDataBytes = encoding.GetBytes("user_name=belaz&user_password=123"); 

     // Prepare our login HttpWebRequest 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://blabla.fr/verify.php"); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.CookieContainer = cookieContainer; 
     request.ContentLength = loginDataBytes.Length; 

     // Write encoded post variable to the stream 
     Stream newStream = request.GetRequestStream(); 
     newStream.Write(loginDataBytes, 0, loginDataBytes.Length); 
     newStream.Close(); 

     // Retrieve HttpWebResponse 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     // Link the response cookie to the domain 
     cookieContainer.Add(new Uri("http://blabla.fr/"),response.Cookies); 

     // Prepare our navigate HttpWebRequest, and set his cookie. 
     HttpWebRequest requestProfile = (HttpWebRequest)WebRequest.Create("http://blabla.fr/bb.php"); 
     requestProfile.CookieContainer = cookieContainer; 

     // Retrieve HttpWebResponse 
     HttpWebResponse responseProfile = (HttpWebResponse)requestProfile.GetResponse(); 

     // Retrieve stream response and read it to end 
     Stream st = responseProfile.GetResponseStream(); 
     StreamReader sr = new StreamReader(st); 
     string buffer = sr.ReadToEnd(); 
2

Senden Sie einfach einen neuen WebRequest an die Datei bb.php. Stellen Sie sicher, dass Sie denselben CookieContainer verwenden, da ich davon ausgehe, dass login.php Cookie-basierte Sitzungen verwendet, um sich an Sie zu erinnern. Schauen Sie sich die HttpWebRequest.CookieContainer Eigenschaft an. Dazu müssen Sie Ihre WebRequest in eine HttpWebRequest-Instanz umwandeln.

Hinzugefügt: (kann nicht Beispielcode in dem Kommentar schreiben.)

ich nur Code bis jetzt ohne Proofing machen würde ...

var cookies = new CookieContainer(); 

var firstReq = (HttpWebRequest)WebRequest.Create(".../login.php"); 
firstReq.CookieContainer = cookies; 

var secondReq = (HttpWebRequest)WebRequest.Create(".../bb.php"); 
secondReq.CookieContainer = cookies 
+0

Bitte geben Sie mir ein Beispiel; D – belaz

0

Es gibt eine Eigenschaft von HttpWebRequest genannt ist AllowAutoRedirects. Setzen Sie dies auf "Wahr". Außerdem gibt es eine Eigenschaft namens MaximumAutomaticRedirections. Setzen Sie diesen Wert auf einen zulässigen Wert, um sicherzustellen, dass alle Werte eingehalten werden.

+1

Das nur ist für 30x HTTP-Ebene leitet, obwohl; es erlaubt nicht (das Schreckliche ist) Meta-Refresh. – bobince

+0

Ich stehe korrigiert. Danke für die Information. – NotMe

0

Sie können es nicht leicht machen, da das Meta-Tag vom Client gelesen und ausgeführt wird.

Wenn Sie in diesem Fall HttpWebRequest verwenden, interessiert sich die Anforderung nicht für die Funktionen des Texts.

Sie müssen also eine weitere Anfrage an die Seite im URL-Attribut (bb.php) machen.

-

Wenn der Server die Umleitung haben würden Sie das Problem nicht.

Verwandte Themen