1请求登录页面
2根据登录页面获取需要提交的数据
3提交登录数据,并返回CookieContainer
4根据登录后的CookieContainer,设置CookieContainer,获取数据
1请求登录页面,获取需要提交的数据,登录数据数据,并返回CookieContainer
private CookieContainer GetLogInCookie(string Url, string username, string password)
{
RegexOptions options = RegexOptions.None;
Regex nameIt = new Regex("input type=\"hidden\" name=\"lt\" value=\"(?<lt>[^\"]{1,})\"", options);
Regex nameexecution = new Regex("<input type=\"hidden\" name=\"execution\" value=\"(?<lt>[^\"]{1,})\"", options);
Regex name_eventId = new Regex("<input type=\"hidden\" name=\"_eventId\" value=\"(?<lt>[^\"]{1,})\"", options);
Regex name_PostUrl = new Regex("action=\"(?<lt>[^\"]+)\"", options);
CookieContainer InCookieContainer1 = new CookieContainer();
CookieContainer OutCookieContainer1 = new CookieContainer();
//获取登录页,和相关的提交字段
string longInPageinfo = WebHttps.CreateGetHttpResponse(urlLog, Encoding.UTF8, InCookieContainer1, ref OutCookieContainer1);
string ithidden = "";
if (nameIt.IsMatch(longInPageinfo))
{
Match m = nameIt.Match(longInPageinfo);
ithidden = m.Groups["lt"].Value;
}
string executionhidden = "";
if (nameexecution.IsMatch(longInPageinfo))
{
Match m = nameexecution.Match(longInPageinfo);
executionhidden = m.Groups["lt"].Value;
}
string posturl = "";
if (name_PostUrl.IsMatch(longInPageinfo))
{
Match m = name_PostUrl.Match(longInPageinfo);
posturl = m.Groups["lt"].Value;
}
//提交用户名密码及相关数据
string data = "lt=" + ithidden + "&password="+ password + "&username="+ username + "&execution=" + executionhidden + "&_eventId=submit";
CookieContainer OutCookieContainer2 = new CookieContainer();
string dataMain = WebHttps.CreatePostHttpResponse(posturl, Encoding.GetEncoding("GB2312"), data, InCookieContainer1, ref OutCookieContainer2);
if (string.IsNullOrEmpty(dataMain) || InCookieContainer1.Count == 0)
{
return null;
}
return InCookieContainer1;
}
2根据返回的CookieContainer请求数据
private string GetData(CookieContainer InCookieContainer1,string Url)
{
CookieContainer OutCookieContainer4 = new CookieContainer();
string outputdata = WebHttps.CreateGetHttpResponse(Url, Encoding.GetEncoding("GB2312"), InCookieContainer1, ref OutCookieContainer4);
return outputdata;
}
public class WebHttps
{
private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36";
public static string DownFileFolder = @"C:\ydfile";
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
// <summary>
/// 遍历CookieContainer
/// </summary>
/// <param name="cc"></param>
/// <returns></returns>
public static List<Cookie> GetAllCookies(CookieContainer cc)
{
List<Cookie> lstCookies = new List<Cookie>();
Hashtable table = (Hashtable)cc.GetType().InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance, null, cc, new object[] { });
foreach (object pathList in table.Values)
{
SortedList lstCookieCol = (SortedList)pathList.GetType().InvokeMember("m_list",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField
| System.Reflection.BindingFlags.Instance, null, pathList, new object[] { });
foreach (CookieCollection colCookies in lstCookieCol.Values)
foreach (Cookie c in colCookies) lstCookies.Add(c);
}
return lstCookies;
}
public static string CreatePostHttpResponse(string url, Encoding encoding, string databuffer, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer)
{
return CreatePostHttpResponse(url, encoding, databuffer, InCookieContainer, ref OutCookieContainer, false);
}
public static string CreatePostHttpResponse(string url, Encoding encoding, string databuffer, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer, bool savefile)
{
HttpWebRequest request = null;
int countold = InCookieContainer.Count;
//HTTPSQ请求
if (url.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
}
else
{
request = (HttpWebRequest)WebRequest.Create(url);
}
request.Headers["Upgrade-Insecure-Requests"] = "1";
request.CookieContainer = InCookieContainer;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = DefaultUserAgent;
request.Headers["Upgrade-Insecure-Requests"] = "1";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers["Accept-Encoding"] = "gzip, deflate, br";
request.KeepAlive = true;
//如果需要POST数据
byte[] data = encoding.GetBytes(databuffer.ToString());
request.ContentLength = data.Length;
request.AllowAutoRedirect = true;
try
{
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse rsp = (HttpWebResponse)request.GetResponse();
CookieCollection c = rsp.Cookies;
OutCookieContainer.Add(rsp.Cookies);
if (rsp.Cookies.Count != 0)
{
InCookieContainer.Add(rsp.Cookies);
LogInfo.Error("session Post Cookie返回不为空改变");
}
//很奇怪,传进来的InCookieContainer会改变,
int countNew = InCookieContainer.Count;
if (countNew == countold)
{
LogInfo.Error("session Cookie未改变");
}
return GetResponse(rsp, encoding, savefile);
}
catch (Exception ex)
{
LogInfo.Error("session Post登录异常", ex);
return null;
}
}
public static string CreateGetHttpResponse(string url, Encoding encoding, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer)
{
return CreateGetHttpResponse(url, encoding, InCookieContainer, ref OutCookieContainer, false);
}
public static string CreateGetHttpResponse(string url, Encoding encoding, CookieContainer InCookieContainer, ref CookieContainer OutCookieContainer, bool savefile)
{
HttpWebRequest request = null;
//HTTPSQ请求
if (url.Contains("https"))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
}
else
{
request = (HttpWebRequest)WebRequest.Create(url);
}
request.CookieContainer = InCookieContainer;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "GET";
request.Headers["Upgrade-Insecure-Requests"] = "1";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers["Accept-Encoding"] = "gzip, deflate, br";
request.KeepAlive = true;
request.AllowAutoRedirect = true;
request.UserAgent = DefaultUserAgent;
try
{
HttpWebResponse rsp = (HttpWebResponse)request.GetResponse();
OutCookieContainer.Add(rsp.Cookies);
return GetResponse(rsp, encoding, savefile);
}
catch (Exception ex)
{
LogInfo.Error("session Get异常", ex);
return null;
}
}
/// <summary>
/// 把响应流转换为文本。
/// </summary>
/// <param name="rsp">响应流对象</param>
/// <param name="encoding">编码方式</param>
/// <returns>响应文本</returns>
private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
System.IO.Stream stream = null;
StreamReader reader = null;
try
{ // 以字符流的方式读取HTTP响应
stream = rsp.GetResponseStream();
reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
catch (Exception ex)
{
LogInfo.Error("响应文本错误", ex);
return null;
}
finally
{
// 释放资源
if (reader != null) reader.Close();
if (stream != null) stream.Close();
if (rsp != null) rsp.Close();
}
}
private static string GetResponse(HttpWebResponse rsp, Encoding encoding, bool savefile)
{
string ContentType = rsp.ContentType.ToLower();
if (savefile && !string.IsNullOrEmpty(ContentType) && !ContentType.StartsWith("text/"))
{
string disp = rsp.Headers.Get("Content-disposition");
LogInfo.Error("返回文件类型" + disp);
string ext = disp.Substring(disp.LastIndexOf("."));
string filename = disp.Substring(disp.IndexOf("fileName="));
string saveFileName = DownFileFolder;
if (!saveFileName.EndsWith("\\"))
{
saveFileName += "\\";
}
saveFileName = saveFileName + System.Guid.NewGuid().ToString() + "_" + filename;
bool issaveok = SaveBinaryFile(rsp, saveFileName);
if (issaveok)
{
return saveFileName;
}
return null;
}
else
{
return GetResponseAsString(rsp, encoding);
}
}
// 将二进制文件保存到磁盘
private static bool SaveBinaryFile(WebResponse response, string FileName)
{
bool Value = true;
byte[] buffer = new byte[1024];
try
{
if (File.Exists(FileName))
File.Delete(FileName);
Stream outStream = System.IO.File.Create(FileName);
Stream inStream = response.GetResponseStream();
int l;
do
{
l = inStream.Read(buffer, 0, buffer.Length);
if (l > 0)
outStream.Write(buffer, 0, l);
}
while (l > 0);
outStream.Close();
inStream.Close();
LogInfo.Error("保存文件成功FileName=" + FileName);
}
catch (Exception ex)
{
LogInfo.Error("保存文件失败FileName=" + FileName, ex);
Value = false;
}
return Value;
}
}