1>通过HttpWebRequest模拟登陆

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.DirectoryServices.Protocols;
using System.ServiceModel.Security;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;namespace BaiduCang
{/// <summary>/// 有关HTTP请求的辅助类/// </summary>public class HttpWebResponseUtility{private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";/// <summary>/// 创建GET方式的HTTP请求/// </summary>/// <param name="url">请求的URL</param>/// <param name="timeout">请求的超时时间</param>/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>/// <returns></returns>public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies){if (string.IsNullOrEmpty(url)){throw new ArgumentNullException("url");}HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;request.Method = "GET";request.UserAgent = DefaultUserAgent;if (!string.IsNullOrEmpty(userAgent)){request.UserAgent = userAgent;}if (timeout.HasValue){request.Timeout = timeout.Value;}if (cookies != null){request.CookieContainer = new CookieContainer();request.CookieContainer.Add(cookies);}return request.GetResponse() as HttpWebResponse;}/// <summary>/// 创建POST方式的HTTP请求/// </summary>/// <param name="url">请求的URL</param>/// <param name="parameters">随同请求POST的参数名称及参数值字典</param>/// <param name="timeout">请求的超时时间</param>/// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>/// <param name="requestEncoding">发送HTTP请求时所用的编码</param>/// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>/// <returns></returns>public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies){if (string.IsNullOrEmpty(url)){throw new ArgumentNullException("url");}if (requestEncoding == null){throw new ArgumentNullException("requestEncoding");}HttpWebRequest request = null;//如果是发送HTTPS请求if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)){ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);request = WebRequest.Create(url) as HttpWebRequest;request.ProtocolVersion = HttpVersion.Version10;}else{request = WebRequest.Create(url) as HttpWebRequest;}request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.AllowAutoRedirect = false;if (!string.IsNullOrEmpty(userAgent)){request.UserAgent = userAgent;}else{request.UserAgent = DefaultUserAgent;}if (timeout.HasValue){request.Timeout = timeout.Value;}if (cookies != null){request.CookieContainer = new CookieContainer();request.CookieContainer.Add(cookies);}//如果需要POST数据if (!(parameters == null || parameters.Count == 0)){StringBuilder buffer = new StringBuilder();int i = 0;foreach (string key in parameters.Keys){if (i > 0){buffer.AppendFormat("&{0}={1}", key, parameters[key]);}else{buffer.AppendFormat("{0}={1}", key, parameters[key]);}i++;}byte[] data = requestEncoding.GetBytes(buffer.ToString());using (Stream stream = request.GetRequestStream()){stream.Write(data, 0, data.Length);}}return request.GetResponse() as HttpWebResponse;}private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors){return true; //总是接受}/// <summary>/// 获取post中input的值/// </summary>/// <param name="content">返回的html</param>/// <returns></returns>public static Dictionary<string, string> GetPostValuesFromContent(string content){Dictionary<string, string> dics = new Dictionary<string, string>();StringBuilder sbPattern = new StringBuilder();sbPattern.Append("<input").Append("[^>]*?").Append("/?>");Regex regex = new Regex(sbPattern.ToString());MatchCollection matchList = regex.Matches(content);foreach (Match match in matchList){string inputValue = match.Groups[0].Value;sbPattern = new StringBuilder();sbPattern.Append("name=\"").Append("([^\"]*?)").Append("\"");regex = new Regex(sbPattern.ToString());string name = regex.Match(inputValue).Groups[1].Value;sbPattern = new StringBuilder();sbPattern.Append("value=\"").Append("([^\"]*?)").Append("\"");regex = new Regex(sbPattern.ToString());string value = regex.Match(inputValue).Groups[1].Value;dics.Add(name, System.Web.HttpContext.Current.Server.UrlEncode(value));}return dics;}/// <summary>/// 获取post中input的值/// </summary>/// <param name="content">返回的html</param>/// <returns></returns>public static Dictionary<string, string> GetPostValuesFromUrl(string url){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream responseStream = response.GetResponseStream();StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);string content = reader.ReadToEnd();reader.Close();responseStream.Close();return GetPostValuesFromContent(content);}/// <summary>/// 从Headers的Cookie中获取到系统的cookie/// </summary>/// <param name="setCookie">headers中的cookie字符串</param>/// <param name="cookieName">系统cookie的name</param>/// <returns></returns>public static string GetCookieFromSetCookie(string setCookie, string cookieName){StringBuilder sbPattern = new StringBuilder();sbPattern.AppendFormat("{0}=", cookieName).Append("(.*?)").Append(";");Regex regex = new Regex(sbPattern.ToString());Match match = regex.Match(setCookie);return match.Groups[1].Value;}/// <summary>/// 获取登陆后的跳转页面的html/// </summary>/// <param name="cookieName">系统cookie的name</param>/// <param name="cookieValue">系统cookie的value</param>/// <param name="redirectUrl">登陆后跳转的url</param>/// <returns></returns>public static string GetRedirctUrlHtml(string cookieName, string cookieValue, string redirectUrl, Encoding encoding){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(redirectUrl);request.Method = "GET";request.Headers.Add("Cookie", cookieName + "=" + cookieValue);HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream stream = response.GetResponseStream();StreamReader reader = new StreamReader(stream, encoding);return reader.ReadToEnd();}}
}

  

2>模拟登陆demo,直接从项目中挖出来的,实现的模拟登陆客户的oa系统和erp系统的功能,然后审核代办消息,审核的功能未实现。代码实现的是模拟登陆成功后,获取跳转后的页面的html。代码中实际地址和账户非真实数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net;
using BaiduCang;
using System.IO;
using System.Text.RegularExpressions;public partial class Default2 : System.Web.UI.Page
{protected void Page_Load(object sender, EventArgs e){//LoginJsjd();//LoginOA();LoginErp();}public void LoginJsjd(){string loginUrl = "http://192.168.0.2/jsjd/login.aspx";string redirectUrl = "http://192.168.0.2/jsjd/wfi.ashx?act=audit&id=e77ff6a5-4e17-4fb6-b696-82bf5b3c717f&msgid=bc5b6d50-f315-414e-841f-e382ca1a4f8e&comment=&result=Approve";Encoding encoding = Encoding.GetEncoding("gb2312");string cookieName = ".ASPXAUTH";Dictionary<string, string> parameters = new Dictionary<string, string>();parameters.Add("txtName", "8888");parameters.Add("txtPassword", "8888");Response.Write(Login(loginUrl, loginUrl, redirectUrl, cookieName, encoding, parameters));}public void LoginOA(){string loginUrl = "http://192.168.0.2:8090/dcwork/j_bsp_security_check/up";string redirectUrl = "http://192.168.0.2:8090/dcwork/processlist.cmd?method=taskinfoportal";Encoding encoding = Encoding.GetEncoding("gb2312");string cookieName = "JSESSIONID";Dictionary<string, string> parameters = new Dictionary<string, string>();parameters.Add("j_username", "888888");parameters.Add("j_password", "888888");Response.Write(Login(loginUrl, loginUrl, redirectUrl, cookieName, encoding, parameters));}public void LoginErp(){string loginUrl = "http://192.168.0.2:8000/OA_HTML/RF.jsp?function_id=26668&resp_id=-1&resp_appl_id=-1&security_group_id=0&lang_code=ZHS&params=KQ0ueFd3h5ncJDQ0.532EQ&oas=NqL6dDNwywXNVCwleKSBLw";string portUrl = "http://192.168.0.2:8000/OA_HTML/OA.jsp?page=/oracle/apps/fnd/sso/login/webui/MainLoginPG&_ri=0&_ti=128180147&language_code=ZHS&requestUrl=&oapc=18&oas=zlyIwYnA_a_ouuYU0LTLzw..";string redirectUrl = "http://192.168.0.2:8000/OA_HTML/OA.jsp?OAFunc=OAHOMEPAGE";Encoding encoding = Encoding.GetEncoding("gb2312");string cookieName = "JSESSIONID";Dictionary<string, string> parameters = new Dictionary<string, string>();parameters.Add("usernameField", "888888");parameters.Add("passwordField", "888888");Response.Write(Login(loginUrl, portUrl, redirectUrl, cookieName, encoding, parameters));}/// <summary>/// 登陆后返回指定页面的html/// </summary>/// <param name="loginUrl">登陆页面url</param>/// <param name="portUrl">登陆提交的post页面url</param>/// <param name="redirectUrl">登陆成功后跳转的页面url</param>/// <param name="cookieName">cookie名称</param>/// <param name="encoding">编码方式</param>/// <param name="nameAndPassword">用户名和密码对应的文本框的name和值</param>/// <returns></returns>public string Login(string loginUrl, string portUrl, string redirectUrl, string cookieName, Encoding encoding, Dictionary<string, string> nameAndPassword){Dictionary<string, string> parameters = HttpWebResponseUtility.GetPostValuesFromUrl(loginUrl);//给参数字典中的用户名和密码赋值foreach (var item in nameAndPassword){parameters[item.Key] = item.Value;}foreach (var item in parameters){Response.Write(string.Format("{0}:{1}", item.Key, item.Value));Response.Write("</br>");}HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(portUrl, parameters, null, null, encoding, null);string setCookie = response.Headers["Set-Cookie"];string cookie = HttpWebResponseUtility.GetCookieFromSetCookie(setCookie, cookieName);return HttpWebResponseUtility.GetRedirctUrlHtml(cookieName, cookie, redirectUrl, encoding);}
}

  

程序员的基础教程:菜鸟程序员

转载于:https://www.cnblogs.com/guohu/p/5476904.html

通过HttpWebRequest实现模拟登陆相关推荐

  1. C# 利用HttpWebRequest模拟登陆获取数据设置Accept-Encoding为gzip,deflate后返回的网页是乱码处理

    原由:在解决模拟登陆抓取数据的时候post一个地址时老是获取的内容是乱码. 经过检查最终应该是编码是HttpWebRequest.Headers.Add("Accept-Encoding&q ...

  2. winform模拟登陆网页_【教程】模拟登陆网站 之 C#版(内含两种版本的完整的可运行的代码)...

    之前已经介绍过了网络相关的一些基础知识了: 以及简单的网页内容抓取,用C#是如何实现的: 现在接着来介绍,以模拟登陆百度首页: 为例,说明如何通过C#模拟登陆网站. 不过,此处需要介绍一下此文前提: ...

  3. 【转】使用C#发送Http 请求实现模拟登陆(以博客园为例)

    [转]使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到cookie即可实现模拟登陆,比如一些抢票软件的原理无非也 ...

  4. 使用C#发送Http 请求实现模拟登陆(以博客园为例)

    使用C#发送Http 请求实现模拟登陆(以博客园为例) 原文:使用C#发送Http 请求实现模拟登陆(以博客园为例) 模拟登陆的原理很简单,就是发送一个Http 请求服务器获得响应,然后客户端获取到c ...

  5. 拱拱Lite开发(3):三翼页及湘大文库下载实现(解析网页获取信息及模拟登陆)

    因为没有三翼新闻及湘大文库的API,简单的方法行不通就只能绕远啦,我们这次来解析网页,嗯,是个体力活其实.因为网页HTML也是有一定格式的,所以只要网页结构不进行大的改动,我们就可以一直这样解析网页获 ...

  6. 基于Python的HTTPS协议模拟登陆+爬取页面

    之前写的一直没成功,原因是用的不是HTTPS相关的函数.这次仔细研究了一下,有几个需要注意的点,一个是POST模拟登陆的时候,header中的cookie值,不同的网站应该会有不同的要求:另一个是GE ...

  7. Python高级爬虫开发,高难度JS解密教程,绝地求生模拟登陆!

    前言 这篇文章因为涉及到JS解密部分,所以难度比较高,Python基础比较薄弱的同学可以来看看思路. 开始 进入到该网站后我们可以看到如下界面,今天要做的内容就是模拟登陆 那么咱们首先抓到登陆的包看看 ...

  8. 批量注册、模拟登陆很难吗?一个Python爬虫案例告诉你答案!

    **批量注册:**自动化批量注册账号,我见过很多人利用selenium这个自动化框架做,但是速度太慢. **模拟登陆:**这里要说明一下,其实你注册一个账号=模拟登陆一个账号,这个原理其实是一样的. ...

  9. python模拟全部代码_Python模拟登陆实现代码

    下面分享一个使用Python进行网站模拟登陆的小例子. 原理 使用Cookie技术,绕开网站登录验证.要使用到cookielib库.流程: 创建一个保存Cookie的容器,可选的有CookieJar, ...

最新文章

  1. 2021China SAFe Day中国规模化敏捷会
  2. 两年的等待,近700页干货,同系列累计销量25万+,第三版内容更扎实
  3. Java创建多线程的三种方法
  4. 1.11 神经网络的权重初始化-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  5. Markdown语法入门
  6. ES5-11原型与原型链深入、对象继承
  7. 戴尔科技:以技术突破创新边界!
  8. 如何在搜狗浏览器中添加扩展工具
  9. pytorch学习——构建多元线性回归的网络结构
  10. Linux下挂载NTFS格式文件系统
  11. 实时检测input的长度_目标检测——TinyYOLOv3
  12. java 代码整洁快捷方式_代码整洁之道:你的代码是否足够优雅、整洁、易懂?...
  13. 用python把excel中的数据变成字典(复制代码即可用)
  14. leetcode938.RangeSumofBST
  15. vc+ mfc 方法怎么被调用_Spring源码阅读(二)我的方法是怎么被自动调用的
  16. java经纬度排序,elasticsearch搜索经纬度(lbs)_geo_distance距离排序实现方案
  17. python画图代码乔治-2020阅读书单
  18. ZooKeeper 客户端: GUI+命令行两大类(史上最全,值得收藏)
  19. 含泪整理最优质草食动物unity3d模型素材,你想要的这里都有
  20. 改变一个ppt所有的幻灯片的背景色和字体颜色

热门文章

  1. 曝iPhone15或换用USB-C接口;Google将下架第三方Android通话录音APP|极客头条
  2. 自律型性格分析,自律型人格的职业规划
  3. html静态网页设计制作 HTML我的家乡沧州网页代码 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  4. Three.js - 模拟太阳、地球、月亮的运动(十一)
  5. CANDENCE :如何新建PCB文件、设置PCB画布尺寸、绘制PCB板框
  6. echarts 地图上边画柱状图
  7. 网络工程师笔记——安全攻击类型
  8. laravel安装的几种方法总结
  9. arm powerpc mips dsp
  10. 百度地图自定义标注样式