【转载】.NET模拟POST登录并保持登录状态

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

原理就是先对一个地址(地址是用户名和密码输入框所在的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 = 0, j;
while (i < paramList.Length)
{
j = paramList.IndexOfAny(reserved, i);
if (j == -1)
{
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, 1));
i = j + 1;
}
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
req.ContentLength = SomeBytes.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(SomeBytes, 0, SomeBytes.Length);
newStream.Close();
}
else
{
req.ContentLength = 0;
}
//返回请求
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 = 0, j;
while (i < paramList.Length)
{
j = paramList.IndexOfAny(reserved, i);
if (j == -1)
{
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, 1));
i = j + 1;
}
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
request.ContentLength = SomeBytes.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(SomeBytes, 0, 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登录并保持登录状态,码迷,mamicode.com

时间: 2024-08-09 06:20:51

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

模拟支付宝、淘宝登录2

最终我决定通过webbrowser模拟登陆支付宝,获取数据.根据业务需求,我需要把获取支付宝的数据做成接口,供业务去调用.难点在于如何可以稳定的切换账号,并且保证服务24小时可用.需要处理一系列的异常和超时.缺点是这边变成单线程,登录获取数据只能一个进行完了再进行下一个. 简单列下登录流程 爬虫服务                                                                                                 接口

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

知识点使用:1.格式化输出的两种方法---% .formate 2.while循环的使用,及跳出循环的两种方法---break(跳出循环体).continue(结束本次循环,继续下次循环) 3.if条件语句的使用 """ 功能:模拟用户登录,(3次重试机会,登录成功展示登录账号密码) 作者:诸葛 日期:29/06/2019 """ i = 3 username = 'zzl' password = '123456' #思路一:先验证账号,再验证密

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

一.创建应用 1.在 QQ互联 创建应用 地址:https://connect.qq.com/manage.html#/ 然后进行实名认证,创建应用,审核通过 然后点击查看,可以获得 APP ID 和 APP Key 回调地址如下 2.授权的基本原理 可以参考官方文档 1)根据QQ登录链接可以回调获得 code 2)根据APP ID .APP Key 和 code 可获得 token 3)根据 token 获得 OpenId 4)  根据 OpenId 可以获得用户的基本信息 其中 OpenId

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

Post 传值(看不见的传值) Get 传值(看得见的传值) Session - 全局变量组 存放位置:服务端 作用:只要里面有内容,那么这个网站中所有的C#端都能访问到这个变量 -- object类型 格式: web1 后台代码: public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Button1.Click += Button1_

django 注册、登录及第三方接口程序(4):扩展邮箱注册,登录,微博登录

1.邮箱注册 这里需要扩展User,两种解决办法,1,注册时将email字段内容赋给username,这种瞒天过海型的,另一种就是扩展user,这里介绍django1.5的扩展方法. 1.setting配置 AUTH_USER_MODEL = 'manager.MyUser' # 扩展表的位置,appname.Model, MyUser是manager app下models中的用户类 AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends

Android Cookie共享到WebView避免再次登录(保持登录状态)

最近在做项目时用到了webview打开指定链接的网页,可已经把webview设置了cookie但始终跳转到登录页面,这明显是cookie没有设置成功导致webview没有将设置好的cookie发送出去…… 1 2 3 4 5 CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true)

单点登录和 单一登录的 区别?

1.单点登录: 单点登录是登录之后 所有该域名的网站都可以不用登录了把 包括子域名. 单点登录是从一个系统登录以后,其他地方不用登录... 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 较大的企业内部,一般都有很多的业务支持系统为其提供相应的管理和IT服务 单点登录的机制也一样,如下图所示,当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系

安卓第三方登录之微信登录(图文详解)

安卓第三方登录之微信登录  一.成为开发者 到微信开放平台管理中心(https://open.weixin.qq.com/),认证成为开发者 二.创建应用 “创建移动应用”   填写基本的应用信息 填写平台信息 可参照后面的步准备好要填写的信息. 应用包的名称: keystore 第一步:用 Android Studio 生成 keystore 第二步:Create New 第三步:填写相关信息,里面内容什么含义自行Google 创建key的文件夹,也可保存到其它地方 创建新的签名,填写组织的相

Node.js+express+MySQL仿美团注册登录绑定第三方登录

原文连接 准备 在开始做这个前,希望你已经配置好的Node,express和MySQL的开发环境.也可以参考参考文章 开发环境的配置 新建项目 参考Mac下express的安装和新建项目 mysql模块 在package.json文件的dependencies下加入下面的代码"mysql": "latest", 最终的效果: 然后cd到项目所在的目录,在终端中执行npm install,项目就会配置mysql模块. 新建数据库配置文件 在项目目录下新建一个db目录,