好了,还是由于工作需要 要登录一个网站并且模拟点击下载某些东西

原理就是先对一个地址(地址是用户名和密码输入框所在的form的action对应的页面)进行POST提交用户名和密码(不考虑验证码,当然验证码也可以破解),用一个CookieContainer保持Response的cookie,保证了每次请求使用同一个已经登录的session。

本类部分代码来源于网上,功能有待完善,目前只实现了登录和登录后访问“后台”页面。

代码:

  public class LogingHelper
{
public static CookieContainer theCC = new CookieContainer();
/// <summary>
/// 登录方法(无验证码)
/// </summary>
/// <param name="url">POST请求的地址
/// <param name="paramList">参数列表 例如 name=zhangsan&pass=lisi
/// <param name="referer">来源地址
/// <returns></returns>
public static string Login(String url, String paramList, string referer)
{
HttpWebResponse res = null;
HttpWebRequest req = null;
string strResult = "";
try
{
req = (HttpWebRequest)WebRequest.Create(url);
//配置请求header
req.Headers.Add(HttpRequestHeader.AcceptCharset, "GBK,utf-8;q=0.7,*;q=0.3");
req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate,sdch");
req.Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8");
req.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
req.KeepAlive = true;
req.Referer = referer;
req.Headers.Add(HttpRequestHeader.CacheControl, "max-age=0");
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.5 Safari/534.7";
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.AllowAutoRedirect = true;
//设置cookieContainer用来接收cookie
req.CookieContainer = theCC;
StringBuilder UrlEncoded = new StringBuilder();
//对参数进行encode
Char[] reserved = { '?', '=', '&' };
byte[] SomeBytes = null;
if (paramList != null)
{
int i = , j;
while (i < paramList.Length)
{
j = paramList.IndexOfAny(reserved, i);
if (j == -)
{
UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, paramList.Length - i)));
break;
}
UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, j - i)));
UrlEncoded.Append(paramList.Substring(j, ));
i = j + ;
}
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
req.ContentLength = SomeBytes.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(SomeBytes, , SomeBytes.Length);
newStream.Close();
}
else
{
req.ContentLength = ;
}
//返回请求
res = (HttpWebResponse)req.GetResponse();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
Stream responseStream = null;
if (res.ContentEncoding.ToLower() == "gzip")
{
responseStream = new System.IO.Compression.GZipStream(res.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress);
}
else if (res.ContentEncoding.ToLower() == "deflate")
{
responseStream = new System.IO.Compression.DeflateStream(res.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress);
}
else
{
responseStream = res.GetResponseStream();
}
StreamReader sr = new StreamReader(responseStream, encode);
strResult = sr.ReadToEnd();
}
catch (Exception e)
{
//writeLog
}
finally
{
res.Close();
}
return strResult;
}
/// <summary> 获取页面HTML
///
/// <param name="url">
/// <param name="paramList">
/// <returns></returns>
public static string getPage(String url, string referer)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string strResult = string.Empty;
req.Headers["If-None-Match"] = "36d0ed736e88c71:d9f";
req.Referer = referer;
req.CookieContainer = theCC;
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = null;
try
{
sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
strResult = sr.ReadToEnd();
}
catch (System.Exception ex)
{
//writeLog
}
finally
{
sr.Close();
}
return strResult;
} /// <summary>
/// 模仿异步请求POST的方法
/// </summary>
/// <param name="url">
/// <param name="referer">
/// <param name="methed">
/// <param name="paramList">
/// <returns></returns>
public static string VisitPage(string url, string referer, string paramList)
{
HttpWebResponse response = null;
string strResult = string.Empty;
try
{
HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.KeepAlive = true;
request.Referer = referer;
request.Headers.Add(HttpRequestHeader.AcceptCharset, "GBK,utf-8;q=0.7,*;q=0.3");
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate,sdch");
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8");
request.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.5 Safari/534.7";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = theCC;
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
StringBuilder UrlEncoded = new StringBuilder();
//对参数进行encode
Char[] reserved = { '?', '=', '&' };
byte[] SomeBytes = null;
if (paramList != null)
{
int i = , j;
while (i < paramList.Length)
{
j = paramList.IndexOfAny(reserved, i);
if (j == -)
{
UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, paramList.Length - i)));
break;
}
UrlEncoded.Append(HttpUtility.UrlEncode(paramList.Substring(i, j - i)));
UrlEncoded.Append(paramList.Substring(j, ));
i = j + ;
}
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
request.ContentLength = SomeBytes.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(SomeBytes, , SomeBytes.Length);
newStream.Close();
}
response = (HttpWebResponse)request.GetResponse();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
Stream responseStream = null;
if (response.ContentEncoding.ToLower() == "gzip")
{
responseStream = new System.IO.Compression.GZipStream(response.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress);
}
else if (response.ContentEncoding.ToLower() == "deflate")
{
responseStream = new System.IO.Compression.DeflateStream(response.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress);
}
else
{
responseStream = response.GetResponseStream();
}
StreamReader sr = new StreamReader(responseStream, encode);
strResult = sr.ReadToEnd();
}
catch
{
//dosomething
}
finally
{
response.Close();
}
return strResult;
}
}

调用示例:

        static void Main(string[] args)
{
string userName = "lxnanhr";
string userPwd = "lxnanhr";
string content = LogingHelper.Login("http://www.aa.com/index.php?c=login&m=chklogin", "uname=xxx&pass=xxx", "http://www.aa.com/index.php?c=login");
Console.WriteLine(content);
Console.WriteLine(LogingHelper.getPage("http://www.aa.com/index.php?c=preview&m=view&resume_id=1179406405&keyword=", "http://www.aa.com/index.php?c=search&m=supersearch#"));
Console.ReadLine();
}

【转载】.NET模拟POST登录并保持登录状态的更多相关文章

  1. php单点登录之模拟淘宝天猫同步登录

    说到单点登录大家都很了解,一个站点登录其他域会自动登录. 单点登录SSO(Single Sign On)的方法有很多,比如:p3p.共享session.共享cookice.第三方OAuth认证. 这里 ...

  2. python小练习--模拟用户登录,(3次重试机会,登录成功展示登录账号密码)

    知识点使用:1.格式化输出的两种方法---% .formate 2.while循环的使用,及跳出循环的两种方法---break(跳出循环体).continue(结束本次循环,继续下次循环) 3.if条 ...

  3. 第三方登录:QQ登录实现(OAuth2.0)

    一.创建应用 1.在 QQ互联 创建应用 地址:https://connect.qq.com/manage.html#/ 然后进行实名认证,创建应用,审核通过 然后点击查看,可以获得 APP ID 和 ...

  4. qq登录,新浪微博登录 ,接口开发

    给linux命令在线中文手册加了,qq登录和新浪微博登录,认证用的是auth2.0,并且用了js api和php api相结合的方式来做的.个人觉得这种方式,兼顾安全和人性化.以前写过一篇关于申请的博 ...

  5. C#-WebForm-Session、Cookie-登录验证(未登录跳至登录界面)、隐藏地址栏传值

    Post 传值(看不见的传值) Get 传值(看得见的传值) Session - 全局变量组 存放位置:服务端 作用:只要里面有内容,那么这个网站中所有的C#端都能访问到这个变量 -- object类 ...

  6. JS-DOM2级封装练习题--点击登录弹出登录对话框

    <!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...

  7. 第三方登录(QQ登录)开发流程详解

    原文:http://www.cnblogs.com/it-cen/p/4338202.html 近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑 ...

  8. 1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)

    开始搭建登录界面 登录界面效果图: 相关的图片资源下载百度云备份链接: http://pan.baidu.com/s/1o71cvMU 密码: 2h7e 步骤开始: 设置辅助窗口的位置在下方 快捷键o ...

  9. linux下开启SSH,并且允许root用户远程登录,允许无密码登录

    参考:http://blog.csdn.net/jia0511/article/details/8237698 1. 允许root用户远程登录 修改ssh服务配置文件 sudo vi /etc/ssh ...

  10. 基于APK的Robotium登录人人网与发状态

    搭建好Robotium的环境,大致就是下载安装jdk并配置环境变量,下载并打开Eclipse,下载安装Android SDK Tools并配置环境变量,下载安装ADT插件,创建并打开Android V ...

随机推荐

  1. 详解Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...

  2. 火狐和IE浏览器的兼容问题汇总

    1.window.event code=(navigator.appName="Netscape")?event.which:event.keycode; 2.event.x mx ...

  3. PHP 关于SQL注入的防范措施。

    最近在使用框架的时候还是有点不安,不知道框架的设计者有没有考虑到SQL-Injection的问题,我在顶层需不需要做一些必要的过滤等等,由 此我特意的去StackOverflow看了下,真是获益良多, ...

  4. red hat enterprise 6安装tftp服务

    1--->检查是否安装tftp rpm -qa tftp* 2--->安装tftp yum install -y tftp-server 3--->chkconfig --list| ...

  5. C#事件支持发布者/订阅者模式(观察者模式)

    C#事件支持发布者/订阅者模式,发布者将事件通知给订阅者,而订阅者在事件发生时调用已经注册好的事件处理函数.        public delegate void delUpdate();  //委 ...

  6. leetcode Online Judge 150题 解答分析之一 Reverse Words in a String

    问题 Given an input string, reverse the string word by word. For example, Given s = "the sky is b ...

  7. JSP自定义标签

    在JSP网页编程中,我们通常不满足于jstl或其他的框架,我们也可以自己写属于自己专用的标签. 在这里介绍一下表格中展示JavaBean的自定义标签的使用 第一步:写一个父标签,用来显示获取数据 新建 ...

  8. Lucky 2048 - The secret of being lucky

    Lucky 2048 uses a normal distribution to create "lucky" start. Generally speaking, it prov ...

  9. flex(兼容写法)

    CSS样式 flex:定义布局为盒模型 flex-v:盒模型垂直布局 flex-1:子元素占据剩余的空间 flex-align-center:子元素垂直居中 flex-pack-center:子元素水 ...

  10. SIP模块版本错误问题:the sip module implements API v??? but XXX module requires API v???

    系统安装了python 2.7,继续安装PyQt4,于是依次下载sip.pyqt4源码进行安装.用以下代码测试: import PyQt4.QtGui 显示出错.错误信息:the sip module ...