首先,我们先定义一些变量:
C# code

private const string NET_SESSIONID= "ASP.NET_SessionId=";private const string CLIENTKEY = "ClientKey=";string aspcookie = "";private string html = "";private string sessionId = "";private string clientKey = "";private string viewState = "";

一、利用HttpWebRequest获取CSDN的登录信息,如ASP.NET_SessionId、ClientKey、__VIEWSTATE。这步可以放在Login_Load中,下面是代码:
C# code

private void Login_Load(object sender, EventArgs e){    HttpWebRequest request = WebRequest.Create("http://passport.csdn.net/UserLogin.aspx") as HttpWebRequest;    request.Credentials = CredentialCache.DefaultCredentials;    request.Accept = "*/*";    request.Referer = "http://passport.csdn.net/UserLogin.aspx";    request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)";    request.Method = "GET";    request.KeepAlive = true;    request.Headers.Set("Accept-Language", "zh-CN");    request.Headers.Set("Accept-Encoding", "gzip, deflate");

    HttpWebResponse response = request.GetResponse() as HttpWebResponse;    System.IO.Stream responseStream = response.GetResponseStream();    System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("utf-8"));    html = reader.ReadToEnd();

string viewStateFlag = "id=\"__VIEWSTATE\" value=\"";int i = html.IndexOf(viewStateFlag) + viewStateFlag.Length;int j = html.IndexOf("\"", i);    viewState = html.Substring(i, j - i);

    aspcookie = response.Headers.Get("Set-Cookie");    sessionId = GetSessionId();    clientKey = GetClientKey();// 获取图片验证码    GetCode();}/// <summary>/// 获取ClientKey/// </summary>/// <returns></returns>private string GetClientKey(){// 这个仅仅是用来获取ClientKey值的长度 string id = "bb32434c-3bb3-4e44-92c3-8952f631ca87";int index = aspcookie.IndexOf(CLIENTKEY) + CLIENTKEY.Length;    String str = aspcookie.Substring(index, id.Length);return str;}/// <summary>/// 获取ASP.NET_SessionId=/// </summary>/// <returns></returns>private string GetSessionId(){string id = "5mhl0tvbw5shlpnhxgwnck45";int index = aspcookie.IndexOf(NET_SESSIONID) + NET_SESSIONID.Length;    String str = aspcookie.Substring(index, id.Length);return str;}

二、获取图片验证码,在这一步中需要注意的是,因为我们用的是另外一个HttpWebRequest去获取,所以为了保持获取的验证码与登录页面的Session一致,我们需要把Session等信息放入Header中去,下面是代码:
C# code

/// <summary>/// 产生新的验证码/// </summary>private void GetCode(){try    {    CookieCollection cookies = new CookieCollection();    cookies.Add(new Cookie("ASP.NET_SessionId",sessionId));    cookies.Add(new Cookie("ClientKey",clientKey));

    HttpWebRequest httpWebRequest;    HttpWebResponse webResponse;byte[] byteRequest = { };    httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://passport.csdn.net/ShowExPwd.aspx");    CookieContainer co = new CookieContainer();    co.Add(new Uri("http://passport.csdn.net"), cookies);    httpWebRequest.CookieContainer = co;    httpWebRequest.Accept = "*/*";    httpWebRequest.Referer = "http://passport.csdn.net/UserLogin.aspx";    httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)";    httpWebRequest.Method = "GET";    httpWebRequest.Headers.Set("Accept-Encoding", "gzip, deflate");    httpWebRequest.Headers.Set("Accept-Language", "zh-CN");    httpWebRequest.KeepAlive = true;

    webResponse = (HttpWebResponse)httpWebRequest.GetResponse();    Stream responseStream = webResponse.GetResponseStream();    Image original = Image.FromStream(responseStream);    Bitmap bitMap = new Bitmap(original);this.pictureBox1.Image = bitMap;    responseStream.Close();    }catch (Exception exception)    {    MessageBox.Show("ERROR:" + exception.Message);    }}

三、最后一步是登录事件,登录很简单,把相关的信息放入请求数据中就行了。
C# code

private void btnLogin_Click(object sender, EventArgs e){    HttpWebRequest httpWebRequest;    HttpWebResponse webResponse;

string randnum = txtRandnum.Text;string password = txtPassword.Text;string loginname = txtUserName.Text;

string postData = "ctl00$CPH_Content$tb_LoginNameOrLoginEmail={0}&ctl00$CPH_Content$tb_Password={1}&ctl00$CPH_Content$tb_ExPwd={2}&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE={3}&ClientKey={4}&from={5}&MailParameters=&PrePage=&ctl00$CPH_Content$Image_Login.x=46&ctl00$CPH_Content$Image_Login.y=9";    postData = string.Format(postData, System.Web.HttpUtility.UrlEncode(loginname),System.Web.HttpUtility.UrlEncode(password),System.Web.HttpUtility.UrlEncode(randnum), System.Web.HttpUtility.UrlEncode(viewState), clientKey, System.Web.HttpUtility.UrlEncode("http://hi.csdn.net/"));byte[] byteRequest = Encoding.UTF8.GetBytes(postData);

    CookieCollection cookies = new CookieCollection();    cookies.Add(new Cookie("ASP.NET_SessionId", sessionId));    cookies.Add(new Cookie("ClientKey", clientKey));    cookies.Add(new Cookie("UN",loginname));

    httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("http://passport.csdn.net/UserLogin.aspx");    CookieContainer co = new CookieContainer();    co.Add(new Uri("http://passport.csdn.net"), cookies);    httpWebRequest.CookieContainer = co;    httpWebRequest.ContentType = "application/x-www-form-urlencoded";    httpWebRequest.Accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*";    httpWebRequest.Referer = "http://passport.csdn.net/UserLogin.aspx";    httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)";    httpWebRequest.Method = "POST";    httpWebRequest.KeepAlive = true;    httpWebRequest.Headers.Set("Cache-Control", "no-cache");    httpWebRequest.Headers.Set("Accept-Encoding", "gzip, deflate");    httpWebRequest.Headers.Set("Accept-Language", "zh-CN");

    httpWebRequest.ContentLength = byteRequest.Length;    Stream stream;    stream = httpWebRequest.GetRequestStream();    stream.Write(byteRequest, 0, byteRequest.Length);    stream.Close();    webResponse = (HttpWebResponse)httpWebRequest.GetResponse();    System.IO.Stream responseStream = webResponse.GetResponseStream();

    String header = webResponse.Headers.ToString();    Stream getStream = webResponse.GetResponseStream();long contentLength = webResponse.ContentLength;

byte[] outBytes = new byte[contentLength];    outBytes = ReadFully(getStream);    getStream.Close();

    getStream = new MemoryStream(outBytes);    StreamReader streamReader = new StreamReader(getStream, Encoding.UTF8);string getString = streamReader.ReadToEnd();    streamReader.Close();    getStream.Close();

}

static byte[] ReadFully(Stream stream){byte[] buffer = new byte[128];using (MemoryStream ms = new MemoryStream())    {while (true)    {int read = stream.Read(buffer, 0, buffer.Length);if (read <= 0)return ms.ToArray();        ms.Write(buffer, 0, read);    }    }}

其中,在如果把数据以及需要把哪些数据Post到服务器中花费了不少时间,后来利用HttpAnalyzer来抓取浏览器中登录的数据包与WinForm登录的数据包进行了对比,才找出问题所在。

心中时常装有一盘人生的大棋,天作棋盘,星作棋子,在斗转星移中,只有不断地搏击人生,人生才有意义,生命才能彰显光辉,才能收获一分永恒。

转载于:https://www.cnblogs.com/top5/archive/2011/11/29/2267317.html

.NET 网站自动登录相关推荐

  1. 「实用」微信扫码 - 关注公众号后网站自动登录

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:destiny 链接:htt ...

  2. 自动化测试 - 12306火车票网站自动登录工具

    还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 Web的原理就是,浏览器发送一个Request给Web服务器,Web ...

  3. 网络爬虫playwright实现网站自动登录并签到

    网络爬虫使用playwright工具来替代selenium工具,模拟浏览器加载动态网页,应对使用了json.ajax的复杂网站,从而通过网络爬虫实现网站自动登录并签到,设计思想如下: 1.打开网站登录 ...

  4. 自动化测试 (一) 12306火车票网站自动登录工具

    还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解,我们了解了Web ...

  5. 自动化测试项目实战 ——12306火车票网站自动登录工具

    还记得前几年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 通过前两篇博客Fiddler教程和HTTP协议详解,我们了解了Web的原 ...

  6. 微信扫码:关注公众号后网站自动登录的实现原理

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:destiny 链接:segmentfault.com/a/1190000022188562 序言 常见方式 平常大家见到过最多的扫码 ...

  7. 实现微信扫码或关注公众号后网站自动登录

    常见方式 平常大家见到过最多的扫码登录应该是 开放平台网页登录 大概形式就是:点击微信登录后会出现一个黑页面,页面中有一个二维码,扫码后可以自动获取用户信息然后登录,但是这种方式需要申请开放平台比较麻 ...

  8. 【系统自动化开发】Python实现广东省公务员报名系统网站自动登录

    [系统自动化开发]Python实现广东省公务员报名系统网站自动登录 [系统自动化开发]Python实现广东省公务员报名系统网站自动登录 一.原理 二.代码 [系统自动化开发]Python实现广东省公务 ...

  9. 自动化测试实战(一)12306火车票网站自动登录工具

    还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗. 今天我们就开发一个12306网站自动登录软件. 帮助您轻松订票 Web的原理就是,浏览器发送一个Request给Web服务器,Web ...

  10. 网站自动登录功能的设计[转]

    网站的自动登录一直都是有利于提高用户体验的功能,如果设计不好,也非常容易泄漏用户的账户信息. 比较常见的功能实现方案是将用户的登录信息保存在浏览器的Cookie中.看到一些设计有缺陷的网站会将用户的用 ...

最新文章

  1. LR需要理解的一些内容
  2. 瑞幸高层调整:郭谨一担任CEO和董事长 陆正耀出局
  3. 和 Pipelining 说再见,cURL 放弃使用管道技术
  4. python sorted函数倒序_Python sorted函数
  5. 大数据时代的大数据技术与应用有哪些
  6. fractional cascading
  7. 友链——一群dalao
  8. otter实现数据同步,otter manger的安装
  9. 室内定位技术之UWB篇
  10. __ffs 源码分析
  11. 支导线手工和电脑怎么计算方位角并推算坐标
  12. 软件开发随笔系列一——分布式架构实现
  13. 【软件质量】软件复杂性
  14. 先科n612打不开但是充电还是会亮红灯
  15. 在微信平台上做一个公众号,业务序列图
  16. 防爆计算机主板,一台不会害羞的矿用防爆电脑,我只服它!
  17. 继续关注工大gay…
  18. 武汉火神山医院 || BIM与装配式建筑的思考
  19. 第6季2:基于RTSP协议的实时视频流传输的源码分析
  20. android学习:《超级课程表》的课表界面设计

热门文章

  1. rose 2003 7.0_安卓微信7.0.17正式版更新:十大新鲜功能~
  2. android auto 字体大小,Android中给TextView字体大小用dp还是sp?dp和sp有什么区别?
  3. es存在某个字段的查阅_ElasticSearch系列02:ES基础概念详解
  4. 怎么做圆一圈圈扩散效果_推广为什么没有效果,网络推广怎么做才有效果?
  5. select weui 动态加载数据_weui中的picker使用js进行动态绑定数据问题
  6. 注册登录案例用MVC和mysql_用MVC模式实现简单用户登录注册功能
  7. python中堆排序_python堆排序,详细过程图和讲解,这样做小白都会
  8. centos代码切换图形_沙迪克慢走丝代码大全,G代码、T代码、M代码(值得收藏)...
  9. shell脚本按行读取文件的几种方式
  10. JS基础-Array对象手册