Я сделал этот код для входа в систему, чтобы получить и показать веб-страницу:
// 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();
Но следующая страница после входа в систему - это перенаправление html, например:
<meta http-equiv="refresh" content="3; URL="bb.php">
Как перейти по этой ссылке и получить следующую страницу?
Я нашел время, чтобы закончить его, вот ответ (я старался быть как можно более ясным):
// 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();
Просто отправьте новый WebRequest в файл bb.php. Убедитесь, что вы используете тот же CookieContainer, поскольку я предполагаю, что login.php использует сеансы на основе файлов cookie, чтобы запомнить вас. Проверьте свойство HttpWebRequest.CookieContainer. Это требует от вас вашего WebRequest для HttpWebRequest.
Добавлено: (Не удалось написать примерный код в комментарии.)
Я просто делаю код без проверки теперь...
var cookies = new CookieContainer();
var firstReq = (HttpWebRequest)WebRequest.Create(".../login.php");
firstReq.CookieContainer = cookies;
var secondReq = (HttpWebRequest)WebRequest.Create(".../bb.php");
secondReq.CookieContainer = cookies
Вы не можете сделать это легко, так как метатег читается клиентом и выполняется.
В этом случае, когда вы используете HttpWebRequest, запрос не заботится о функциях, которые может иметь текст.
Итак, вам нужно сделать еще один запрос на страницу в атрибуте URL (bb.php).
-
Если сервер выполнил перенаправление, у вас не возникло бы проблемы.
Существует свойство HttpWebRequest, называемое AllowAutoRedirects. Установите для этого значение true. Также есть свойство, называемое MaximumAutomaticRedirections. Установите это для некоторого допустимого значения, чтобы убедиться, что все из них соблюдены.