Wie eine HTML-Webseite umgeleitet programmatisch abzurufen?
-
08-07-2019 - |
Frage
Ich habe diesen Code getan um sich einzuloggen, abzurufen und zu einer Webseite zeigen:
// 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 ist eine HTML-Redirect wie:
<meta http-equiv="refresh" content="3; URL="bb.php">
Wie Sie diesen Link folgen und nächste Seite abrufen?
Lösung 2
Ich habe die Zeit zu beenden gefunden, 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();
Andere Tipps
Sie einfach ein neues WebRequest zur bb.php Datei senden. Stellen Sie sicher, dass Sie die gleiche Cookie verwenden, da nehme ich an, dass login.php Cookie-basierte Sessions verwendet, um Sie zu erinnern. Schauen Sie sich die HttpWebRequest.CookieContainer Eigenschaft. Dies erfordert, dass Sie Ihre WebRequest zu einem HttpWebRequest werfen.
hinzugefügt: (. Kann nicht Beispielcode in dem Kommentar schreiben)
Ich mache nur Code, ohne jetzt Proofing ...
var cookies = new CookieContainer();
var firstReq = (HttpWebRequest)WebRequest.Create(".../login.php");
firstReq.CookieContainer = cookies;
var secondReq = (HttpWebRequest)WebRequest.Create(".../bb.php");
secondReq.CookieContainer = cookies
Es ist eine Eigenschaft von HttpWebRequest namens AllowAutoRedirects . Setzen Sie dies auf true. Auch gibt es eine Eigenschaft namens MaximumAutomaticRedirections . Festgelegt, dass bis zu einem gewissen zulässigen Wert um sicherzustellen, dass alle von ihnen befolgt werden.
Sie können ihm eine einfache Möglichkeit, dies nicht tun, da der Meta-Tag durch den Client gelesen und ausgeführt wird.
In diesem Fall, wenn Sie HttpWebRequest verwenden, wird die Anfrage über die Funktionen nicht kümmert der Text hat.
Sie müssen also eine weitere Anforderung an die Seite in der URL-Attribut tun (bb.php).
-
Wenn der Server die Umleitung täte, würde man nicht das Problem.