HTTP 附带cookies模拟登录原理很简单,首先构建HTTP请求,登录成功后将返回的cookies信息保存起来,然后客户端用保存的cookies进行Get请求进行,进行欺骗浏览器访问,此次我是用博客园的进行登录跳转,没想到这网站post的数据是用RSA加密,内心这个崩溃啊,早上是用HTTP请求模拟微信公众号给用户发送信息,没想到微信也是对请求后跳转的网页进行了加密处理,下面是模拟登录的代码
/// 获取Cookies
/// </summary>
/// <param name="postData">post到URL的数据</param>
/// <param name="url"></param>
/// <returns></returns>
public static CookieContainer GetCookies(string postData, string url)
{
try
{
CookieContainer cookies = null;
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.CookieContainer = cookies;
request.ContentType = "application / json; charset = utf - 8";
request.Method = "post";
request.ContentLength = postData.Length;
Stream requestStream = request.GetRequestStream();
Byte[] bytes = System.Text.Encoding.UTF8.GetBytes(postData);
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//校验是否成功跳转到登录成功后的页面
//using (StreamReader sReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8")))
//{
// String text = sReader.ReadToEnd();
//}
return cookies;
}
catch (Exception ex)
{
throw new Exception(ex.StackTrace);
}
}
/// <summary>
/// 对SSL/TSL管道建立安全信任关系
/// </summary>
public class AcceptAllCertificatePolicy : ICertificatePolicy
{
public AcceptAllCertificatePolicy()
{
}
public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
{
// Always accept
return true;
}
}
/// <summary>
/// 根据获取的cookies进行Get请求
/// </summary>
/// <param name="cookie">拿到的Cookies数据</param>
/// <param name="url">附带cookies进行跳转的URL</param>
/// <returns></returns>
static string GetContent(CookieContainer cookie, string url)
{
string content = string.Empty; //保存cookie检验后获取的数据
HttpWebRequest httpRequest = HttpWebRequest.Create(url) as HttpWebRequest;
httpRequest.CookieContainer = cookie;
httpRequest.Referer = url;
httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko";
httpRequest.Accept = "text/html, application/xhtml+xml, */*";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.Method = "GET";
HttpWebResponse httpResponse = httpRequest.GetResponse() as HttpWebResponse;
using (Stream responsestream = httpResponse.GetResponseStream())
{
using (StreamReader sr = new StreamReader(responsestream, System.Text.Encoding.UTF8))
{
content = sr.ReadToEnd();
}
}
return content;
}