本站业务范围:1、PC端软件开发、网站开发 2、移动端APP、网站、微信接口、微商城开发 3、视频教程、课程设计和辅导 4、单片机开发 5、串口通讯调试
 当前位置:文章中心 >> Asp.net专题(WCF/WPF/WF)
立即购买视频教程 C#利用HttpWebRequest模拟登陆网站高级教程
夜鹰教程网 来源:www.yyjcw.com 日期:2017-10-22 10:43:39
C#版HttpWebRequest模拟登陆网站

这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



这篇文章是有关模拟登录网站方面的。

实现步骤;

  1. 启用一个web会话

  2. 发送模拟数据请求(POST或者GET)

  3. 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据。

我们以登录人人网为例,首先需要分析人人网登录时POST的数据格式,这个可以通过IE9中只带的F12
快捷键,调出开发人员工具。如下图:

1.jpg

 

通过开始捕获得到POST的地址和POST的数据

POST数据:

email=aaa@163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%
2Fhome&domain=renren.com&key_id=1&_rtk=90484476

POST地址:

http://www.renren.com/PLogin.do

下面就是代码示例来得到登录后页面(http://guide.renren.com/guide)的数据

HTMLHelper类

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net;using System.IO;using System.Threading;namespace Test
{   public class HTMLHelper
    {       /// <summary>
        /// 获取CooKie       /// </summary>
       /// <param name="loginUrl"></param>
       /// <param name="postdata"></param>
       /// <param name="header"></param>
       /// <returns></returns>       public static CookieContainer GetCooKie(string loginUrl, string postdata, HttpHeader header)
       {
           HttpWebRequest request = null;
           HttpWebResponse response = null;           try
           {
               CookieContainer cc = new CookieContainer();
               request = (HttpWebRequest)WebRequest.Create(loginUrl);
               request.Method = header.method;
               request.ContentType = header.contentType;               byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);
               request.ContentLength = postdatabyte.Length;
               request.AllowAutoRedirect = false;
               request.CookieContainer = cc;
               request.KeepAlive = true;               //提交请求               Stream stream;
               stream = request.GetRequestStream();
               stream.Write(postdatabyte, 0, postdatabyte.Length);
               stream.Close();               //接收响应               response = (HttpWebResponse)request.GetResponse();
               response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);

               CookieCollection cook = response.Cookies;               //Cookie字符串格式               string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);               return cc;
           }           catch (Exception ex)
           {               
               throw ex;
           }
       }       /// <summary>
       /// 获取html       /// </summary>
       /// <param name="getUrl"></param>
       /// <param name="cookieContainer"></param>
       /// <param name="header"></param>
       /// <returns></returns>       public static string GetHtml(string getUrl, CookieContainer cookieContainer,HttpHeader header)
       {
           Thread.Sleep(1000);
           HttpWebRequest httpWebRequest = null;
           HttpWebResponse httpWebResponse = null;           try
           {
               httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(getUrl);
               httpWebRequest.CookieContainer = cookieContainer;
               httpWebRequest.ContentType = header.contentType;
               httpWebRequest.ServicePoint.ConnectionLimit = header.maxTry;
               httpWebRequest.Referer = getUrl;
               httpWebRequest.Accept = header.accept;
               httpWebRequest.UserAgent = header.userAgent;
               httpWebRequest.Method = "GET";
               httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
               Stream responseStream = httpWebResponse.GetResponseStream();
               StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);               string html = streamReader.ReadToEnd();
               streamReader.Close();
               responseStream.Close();
               httpWebRequest.Abort();
               httpWebResponse.Close();               return html;
           }           catch (Exception e)
           {               if (httpWebRequest != null) httpWebRequest.Abort();               if (httpWebResponse != null) httpWebResponse.Close();               return string.Empty;
           }
       }
    }   public class HttpHeader
   {       public string contentType { get; set; }       public string accept { get; set; }       public string userAgent { get; set; }       public string method{get;set;}       public int maxTry { get; set; }
   }
}

 2.jpg

测试用例:

  HttpHeader header = new HttpHeader();
                header.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*";
                header.contentType = "application/x-www-form-urlencoded";
                header.method = "POST";
                header.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
                header.maxTry = 300;                string html = HTMLHelper.GetHtml("http://guide.renren.com/guide", HTMLHelper.GetCooKie("http://www.renren.com/PLogin.do",                    "email=aaa@163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476", header), header);

                Console.WriteLine(html);


               Console.ReadLine();

 


通过程序登录了网站后而直接进入登录后的页面。

首先还是发起一个启用一个web会话,然后发送模拟数据请求,获取会话的CooKie,再根据该CooKie将其写入到本地,通过程序直接打开登录后的页面。

该功能可用于无法修改第三方系统源代码而要做系统单点登录。

 

我们先在HTMLHelper类中添加一个方法:

 1 /// <summary> 2 /// 获取CookieCollection 3 /// </summary> 4 /// <param name="loginUrl"></param> 5 /// <param name="postdata"></param> 6 /// <param name="header"></param> 7 /// <returns></returns> 8        public static CookieCollection GetCookieCollection(string loginUrl, string postdata, HttpHeader header) 9        {10            HttpWebRequest request = null;11            HttpWebResponse response = null;12            try13            {14                CookieContainer cc = new CookieContainer();15                request = (HttpWebRequest)WebRequest.Create(loginUrl);16                request.Method = header.method;17                request.ContentType = header.contentType;18                byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);19                request.ContentLength = postdatabyte.Length;20                request.AllowAutoRedirect = false;21                request.CookieContainer = cc;22                request.KeepAlive = true;23 24                //提交请求25                Stream stream;26                stream = request.GetRequestStream();27                stream.Write(postdatabyte, 0, postdatabyte.Length);28                stream.Close();29 30                //接收响应31                response = (HttpWebResponse)request.GetResponse();32                response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);33 34                CookieCollection cook = response.Cookies;35                //Cookie字符串格式36                string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);37 38                return cook;39            }40            catch (Exception ex)41            {42 43                throw ex;44            }45        }


再根据获取的CookieCollection写入本地,并打开登录后的页面

 1   [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 2  3         public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData); 4  5  6   HttpHeader header = new HttpHeader(); 7                 header.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*"; 8                 header.contentType = "application/x-www-form-urlencoded"; 9                 header.method = "POST";10                 header.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";11                 header.maxTry = 300;12 13 14  CookieCollection mycookie = HTMLHelper.GetCookieCollection("http://www.renren.com/PLogin.do",15                     "email=aaa%40163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476", header);16 17 18  foreach (Cookie cookie in mycookie) //将cookie设置为浏览的cookie  19                 {20 21                     InternetSetCookie(22 23                          "http://" + cookie.Domain.ToString(),24 25                          cookie.Name.ToString(),26 27                          cookie.Value.ToString() + ";expires=Sun,22-Feb-2099 00:00:00 GMT");28 29                 }30                 System.Diagnostics.Process.Start("http://guide.renren.com/guide");

复制代码

这样即可直接通过程序打开登录后的页面:

3.jpg

复制链接 网友评论 收藏本文 关闭此页
上一条: HTTP请求/响应报文与工作原理详解…  下一条: C#开发Windows Service 服务程序
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  推荐教程/优惠活动

  热门服务/教程目录

  夜鹰教程网  新手必看,详细又全面。
  夜鹰教程网  购买教程  夜鹰教程网  在线支付-方便
  夜鹰教程网  担保交易-快捷安全   夜鹰教程网  闪电发货
  夜鹰教程网  电话和QQ随时可以联系我们。
  夜鹰教程网 不会的功能都可以找我们,按工作量收费。

客服电话:153 9760 0032

购买教程QQ:1416759661  
  热点推荐
表单提交中get和post方式的区别有…
解决ASP中UTF-8与GB2312编码转换乱…
asp数组中REDIM的用法(动态数组)…
生成html的新方法ASP
ASP字符串函数大全
ASP生成Word文件的代码
ASP中Randomize随机函数的使用
十天学会ASP教程之第一天:安装调…
自定义的asp日期格式化函数
防范ASP网站漏洞的八大法则之一
十天学会ASP教程之第二天:表单传…
asp中关于从utf8页面到gb2312页面…
ASP教程:实现长文章分页功能
IIS6架设网站的问题总结
五分钟打开 allow_url_fopen 的最…
  尊贵服务
夜鹰教程网 承接业务:软件开发 网站开发 网页设计 .Net+C#+VS2008+MSsql+Jquery+ExtJs全套高清完整版视频教程
  最近更新
C# Json数据中的特殊字符导致页面…
博客园是有开发博客查询相关的接口…
C#里面的ref和out区别
C#调用API让声卡发出声音
.NET使用反射读取用户自定义的枚举…
.net操作SqlServer数据库增删改查…
如何将WCF服务部署到远程服务器
对WebApi 实现服务端信息的监控
用WCF生成Restful风格的接口返回 …
只有一个地址如何调用WCF服务
WCF简介
搭一个简单的wcf服务
WCF配置说明
WCF传输的数据量过大问题的解决方…
asp.net大文件分块上传文件秒传断…
  工具下载  需要远程协助? 

sql2008视频教程 c#视频教程

VIP服务:如果您的某个功能不会做,可以加我们QQ,给你做DEMO!

JQUERY  Asp.net教程

MVC视频教程  vs2012
.NET+sql开发
手机:15397600032 C#视频教程下载
微信小程序 vue.js高级实例视频教程

教程咨询QQ:1416759661


这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



关于我们 | 购买教程 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3