Вход на веб-сайт через C#, переход на другую веб-страницу, а затем вывод исходного кода в виде строки
Я относительно новичок в работе с веб-страницами на C#. То, что я пытаюсь сделать, это войти в определенный веб-сайт (https://www15.swalife.com/PortalWeb/portal/cwaLogon.jsp) и позволяет перенаправить страницу на страницу по умолчанию, а затем перейти оттуда к (https://www15.swalife.com/csswa/ea/plt/accessELITT.do) и загрузка исходного кода и вывод его в строку.
я выяснил, как загрузить исходный код через HTTPWebRequest и HTTPWebResponse, но у меня возникли проблемы с кодированием функции входа в систему. Я предполагаю, что мне придется что-то делать с постом? Я посмотрел на http://www.dreamincode.net/forums/topic/152297-c%23-log-in-to-website-programmatically/ также.
спасибо заранее!!
EDIT:
код, предоставляемый jimmyjambles работает безотказно, разве это не достаточно дать мне исходный код страницы я хотел. Код предполагает, что процесс входа в систему не удалось, но я считаю, что с небольшой настройкой я мог бы заставить его работать...также всем, у кого есть проблемы с:
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(AcceptAllCertifications);
попробуйте изменить функции" public string "и" public bool "на" public static string "и" public static bool " соответственно:)
EDIT 2:
ответ HTML:
"<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">n<HTML>n<HEAD>nnnnnnn<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">n<META name="GENERATOR" content="IBM WebSphere Studio">n<TITLE>endSession.jsp</TITLE>n<LINK rel="stylesheet" href="eipPortletStyles/swalife.css" type="text/css">nt<script type="text/javascript" language="JavaScript" nttsrc="eipCommonJavaScript/eipGeneralFunctions.js"/> </script>nttn<script type="text/javascript">nntfunction refreshParent()nt{nt if(window.parent)nt {nt if(window.parent.name == 'appMainFrame')nt window.parent.location = "/csswa/ea/plt/logout.do";nt // alert('Your session has expired. Please login again. ');nt }nt}nn</script>n</HEAD>n<BODY onload="refreshParent();">n nt t<div class="eipErrors">n ttt<div class="legendLabel">Message</div>n tttn ttt <div class="errorsHeader formTitle">You Have Exited Out of Crew Web Access.<br> ttt n ttt </div>n ttt n ttt<div class="errorsHeader formTitle"> Please Close this Window and <font size="+1">Log Out of SWALife</font> to Complete the Log Out Process. </div>n tt<div class="errorsText">n tt n ttttn tt</div>n ttn tttn ttn tt<div class="errorsFooter">You will need to log back in before continuing.</div> tn ttn t</div>n n</BODY>n</HTML>n"
2 ответов
чтобы использовать HttpWebRequest для доступа к вторичному URL-адресу после входа в систему, вам нужно будет иметь в виду несколько вещей.
во-первых, как упоминал Каспера, вам нужно будет проверить форму входа в систему и определить атрибут "имя" элементов управления, используемых для получения данных входа в систему.
как только вы это сделаете, вам нужно будет отформатировать строку post соответственно и предоставить ее WebRequest.
последнее соображение заключается в том, что после входа в систему вы необходимо будет хранить и поддерживать куки, назначенные вам с сервера, который держит вас вошли в систему.
Я взял фрагмент WebRequest из эта статья msdn и изменил его, чтобы выполнить второй запрос страницы после входа в систему.
string loginurl = "http://www.gmail.com";
string secondurl = "http://mail.google.com/prefs";
string username = "bob@gmail.com";
string password = "12345";
GetSecondaryLoginPage(loginurl, secondurl, username, password);
public string GetSecondaryLoginPage(string loginurl, string secondurl, string username, string password, string cookieName = null)
{
// Create a request using a URL that can receive a post.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginurl);
// Set the Method property of the request to POST.
request.Method = "POST";
CookieContainer container = new CookieContainer();
if (cookieName != null)
container.Add(new Cookie(cookieName, username, "/", new Uri(loginurl).Host));
request.CookieContainer = container;
// Create POST data and convert it to a byte array. Modify this line accordingly
string postData = String.Format("username={0}&password={1}", username, password);
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();
// Get the response.
WebResponse response = request.GetResponse();
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
using (StreamWriter outfile =
new StreamWriter("output.html"))
{
outfile.Write(responseFromServer.ToString());
}
// Clean up the streams.
reader.Close();
dataStream.Close();
response.Close();
request = (HttpWebRequest)WebRequest.Create(secondurl);
request.CookieContainer = container;
response = request.GetResponse();
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
reader = new StreamReader(dataStream);
// Read the content.
responseFromServer = reader.ReadToEnd();
// Clean up the streams.
reader.Close();
dataStream.Close();
response.Close();
return responseFromServer;
}
public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true;
}
добавлены только строки для postData и cookies.
вам нужно будет изменить строку
string postData = String.Format("username={0}&password={1}", username, password);
на основе ваших элементов управления в форме, так как вы выложили свой сайт пытаюсь работа с я могу догадаться, что вы, вероятно, ищете
string postData = String.Format("uid={0}&portalBase=cwa&password={1}", username, password);
использование WebBrowser в форме довольно легко. Начните с перехода к cwaLogon.страница jsp и найдите элементы управления вводом и вызовите "click" на кнопке отправки. Либо это, либо сделайте соответствующие GET/POSTs, используя HTTPWebRequest и Response. Использование Fiddler2 для проверки того, что публиковать, - отличное начало.