2009-03-10 8 views
2

je l'ai fait ce code pour se connecter, pour récupérer et afficher une page Web:Comment récupérer une page Web html redirigée par programme?

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

Mais, à la page suivante après la connexion est un html redirection comme:

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

Comment suivre ce lien et récupérer la page suivante? Envoyez simplement une nouvelle demande WebRequest au fichier bb.php.

Répondre

2

J'ai trouvé le temps de finir, voici la réponse (j'ai essayé d'être aussi clair que possible):

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

Assurez-vous que vous utilisez le même CookieContainer car je suppose que login.php utilise des sessions basées sur des cookies pour vous souvenir de vous. Découvrez la propriété HttpWebRequest.CookieContainer. Cela vous oblige à diffuser votre requête Web à une demande HttpWebRequest.

Ajouté: (Impossible d'écrire un exemple de code dans le commentaire.)

Je fais juste le code sans épreuvage maintenant ...

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

S'il vous plaît me donner un exemple; D – belaz

0

Il est une propriété de HttpWebRequest appelé AllowAutoRedirects. Définissez ceci à true. Il existe également une propriété appelée MaximumAutomaticRedirections. Réglez cela à une certaine valeur pour vous assurer que tous sont suivis.

+1

C'est seulement pour 30x HTTP niveau réoriente, bien que; il ne permet pas (l'horreur qui est) méta-rafraîchir. – bobince

+0

Je suis corrigé. Merci pour l'info. – NotMe

0

Vous ne pouvez pas le faire facilement, car la balise meta est lue par le client et exécutée.

Dans ce cas, lorsque vous utilisez HttpWebRequest, la requête ne s'intéresse pas aux fonctions que le texte peut avoir.

Vous devez donc faire une autre requête sur la page dans l'attribut URL (bb.php).

-

Si le serveur a fait la redirection que vous n'auriez pas le problème.

Questions connexes