博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用C#的HttpWebRequest模拟登陆网站
阅读量:6494 次
发布时间:2019-06-24

本文共 8248 字,大约阅读时间需要 27 分钟。

很久没有写新的东西了,今天在工作中遇到的一个问题,感觉很有用,有种想记下来的冲动。

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

实现步骤;

  1. 启用一个web会话
  2. 发送模拟数据请求(POST或者GET)
  3. 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据。

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

 

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

POST数据:

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 {
/// /// 获取CooKie /// /// /// /// ///
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; } } /// /// 获取html /// /// /// /// ///
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; } } }

 

测试用例:

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类中添加一个方法:

View Code
1 ///   2 /// 获取CookieCollection  3 ///   4 ///   5 ///   6 ///   7 /// 
8 public static CookieCollection GetCookieCollection(string loginUrl, string postdata, HttpHeader header) 9 {
10 HttpWebRequest request = null; 11 HttpWebResponse response = null; 12 try 13 {
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写入本地,并打开登录后的页面

View Code
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");

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

 

 

 

 

 

转载地址:http://ipkyo.baihongyu.com/

你可能感兴趣的文章
Java WEB开发时struts标签 显示set内容
查看>>
spring-data-elasticsearch 概述及入门(二)
查看>>
Solr启动和结束命令
查看>>
thymeleaf 知多少
查看>>
1.12 xshell密钥认证
查看>>
3.2 用户组管理
查看>>
awk
查看>>
AliOS Things SMP系统及其在esp32上实现示例
查看>>
postgresql 聚合函数 的编写
查看>>
循环遍历二叉树
查看>>
while循环 和 运算符
查看>>
MySQL压缩包安装
查看>>
SpringMVC参数绑定
查看>>
阿里云MVP:开发者的超能力,用技术创造更好世界
查看>>
云计算教学实践40:open***架构实施方案(一)跨机房异地灾备
查看>>
Vue和React的对比
查看>>
MyBatis 源码解析 —— SqlSessionFactory
查看>>
如何解决CentOS 7.*无法使用tab补全功能
查看>>
ORA-00119: invalid specification for system par...
查看>>
rpc.rstatd-4.0.1.tar.gz安装问题
查看>>