高分请高手解决C#模拟登陆不能jquery 获取 cookiecookie的问题 源码如下

&&&&&& 实现此功能首先需要借助一些抓包工具,对相应的网站登陆过程进行分析,此过程根据网站的不同,可能复杂,也可能很简单。常用的抓包工具FF下FireBug和IE下的HttpWatch.这两个工具很强大,以此工具获取的信息足以应对C#模拟网站登陆过程所需要的信息。抓包工具的使用教程网上很多,例如,在此就不做过多介绍。当然网上C# C/S结构模拟网站登陆信息也很多,但基本都是代码片段或是逻辑很复杂。所以把我实践的过程写下来与大家分享。此实验过程是基于模拟登陆校内而完成的。
首先使用FireBug 获取登陆相关信息,在点登陆之前先把FireBug中信息清除,这样获取的信息就从点击登陆按钮后开始,以便后续分析,如下图:
每次请求与下一次请求之间的联系就是每次请求后返回的Cookies数据,前一次的返回Cookie数据需要同下一次请求一同发送到服务器,这也是C#模拟网站登陆的关键。详见以下逻辑代码:
2 using System.Collections.G
3 using System.IO;
4 using System.L
5 using System.N
6 using System.T
7 using System.Threading.T
8 using System.Windows.F
10 namespace WebHelp
public class WebAutoLogin
#region 属性
/// &summary&
/// 登陆后返回的Html
/// &/summary&
public static string ResultHtml
/// &summary&
/// 下一次请求的Url
/// &/summary&
public static string NextRequestUrl
/// &summary&
/// 若要从远程调用中获取COOKIE一定要为request设定一个CookieContainer用来装载返回的cookies
/// &/summary&
public static CookieContainer CookieContainer
/// &summary&
/// Cookies 字符创
/// &/summary&
public static string CookiesString
#endregion
#region 方法
/// &summary&
/// 用户登陆指定的网站
/// &/summary&
/// &param name="loginUrl"&&/param&
/// &param name="account"&&/param&
/// &param name="password"&&/param&
public static void PostLogin(string loginUrl, string account, string password)
HttpWebRequest request = null;
HttpWebResponse response = null;
string postdata = "email=" + account + "&password="+password+"&origURL=" + "/home" + "&";//模拟请求数据,数据样式可以用FireBug插件得到。
// string LoginUrl = "/PLogin.do";
request = (HttpWebRequest)WebRequest.Create(loginUrl);//实例化web访问类
request.Credentials = CredentialCache.DefaultC
request.Method = "POST";//数据提交方式为POST
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = false;
// 不用需自动跳转
//必须设置CookieContainer存储请求返回的Cookies
if (CookieContainer != null)
request.CookieContainer = CookieC
request.CookieContainer = new CookieContainer();
CookieContainer = request.CookieC
request.KeepAlive = true;
//提交请求
byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);
request.ContentLength = postdatabytes.L
stream = request.GetRequestStream();
//设置POST 数据
stream.Write(postdatabytes, 0, postdatabytes.Length);
stream.Close();
//接收响应
response = (HttpWebResponse)request.GetResponse();
//保存返回cookie
response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
CookieCollection cook = response.C
string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
CookiesString =
//取下一次GET跳转地址
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string content = sr.ReadToEnd();
sr.Close();
request.Abort();
response.Close();
//依据登陆成功后返回的Page信息,求出下次请求的url
//每个网站登陆后加载的Url和顺序不尽相同,以下两步需根据实际情况做特殊处理,从而得到下次请求的URL
string[] substr = content.Split(new char[] { '"' });
NextRequestUrl = substr[1];
catch (WebException ex)
MessageBox.Show(string.Format("登陆时出错,详细信息:{0}", ex.Message));
/// &summary&
/// 获取用户登陆后下一次请求返回的内容
/// &/summary&
public static void GetPage()
HttpWebRequest request = null;
HttpWebResponse response = null;
request = (HttpWebRequest)WebRequest.Create(NextRequestUrl);
request.Credentials = CredentialCache.DefaultC
request.Method = "GET";
request.KeepAlive = true;
request.Headers.Add("Cookie:" + CookiesString);
request.CookieContainer = CookieC
request.AllowAutoRedirect = false;
response = (HttpWebResponse)request.GetResponse();
//设置cookie
CookiesString = request.CookieContainer.GetCookieHeader(request.RequestUri);
//取再次跳转链接
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string ss = sr.ReadToEnd();
sr.Close();
request.Abort();
response.Close();
//依据登陆成功后返回的Page信息,求出下次请求的url
//每个网站登陆后加载的Url和顺序不尽相同,以下两步需根据实际情况做特殊处理,从而得到下次请求的URL
string[] substr = ss.Split(new char[] { '"' });
NextRequestUrl = substr[1];
ResultHtml =
catch (WebException ex)
MessageBox.Show(string.Format("获取页面HTML信息出错,详细信息:{0}",ex.Message));
#endregion
以下是测试代码,POST请求一次,GET请求三次。最后得到登陆后加载的首页的HTML代码。当然,登陆后就可以依据当前的Cookie数据获取网站的其他子页面HTML。以下是登陆后加载的首页的HTML代码的逻辑。
private void Form1_Load(object sender, EventArgs e)
WebAutoLogin.PostLogin("/PLogin.do", "", "xxxxxxx");
WebAutoLogin.GetPage();
WebAutoLogin.GetPage();
WebAutoLogin.GetPage();
webBrowser1.DocumentText = WebAutoLogin.ResultH
第一次POST数据的URL为登陆提交数据的页面,此地址不一定能在抓包工具中得到,这就需要分析,方法很多(网上很多),例如查看登陆页面源码等。
& POST提交的数据可以在抓包工具中得到,以下是FireBug中得到的信息:
把代码Copy执行以下,自动登录成功了吧!!
好了,就这些了,此过程中就是每次请求都延续应用前一次请求返回的Cookie数据,只要这步原理理解,此过程也就没有什么难度了。
阅读(...) 评论()c#模拟网站登陆获取cookie,并且把cookie保存到数据库中,下次自动提取,希望可以给出完整思路,代码更好_百度知道
c#模拟网站登陆获取cookie,并且把cookie保存到数据库中,下次自动提取,希望可以给出完整思路,代码更好
#模拟网站登陆获取cookie,下次自动提取,代码更好,希望可以给出完整思路,并且把cookie保存到数据库中
我有更好的答案
朋友没分 没人回答的
我是不会 会我就告诉你了
其他类似问题
为您推荐:
cookie的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录 - 文酱 - 推酷
利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录 - 文酱
&&&& 之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java。
&&&& C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助。现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜!
&&&& 这是我们学校图书馆的登录界面的body:
&body onload=&bodyload()&&
&form name=&aspnetForm& method=&post& action=&login.aspx?ReturnUrl=%2fuser%2fuserinfo.aspx& onsubmit=&javascript:return WebForm_OnSubmit();& id=&aspnetForm&&
&input type=&hidden& name=&__EVENTTARGET& id=&__EVENTTARGET& value=&& /&
&input type=&hidden& name=&__EVENTARGUMENT& id=&__EVENTARGUMENT& value=&& /&
&input type=&hidden& name=&__VIEWSTATE& id=&__VIEWSTATE& value=&/wEPDwULLTE0MjY3MDAxNzcPZBYCZg9kFgoCAQ8PFgIeCEltYWdlVXJsBRt+XGltYWdlc1xoZWFkZXJvcGFjNGdpZi5naWZkZAICDw8WAh4EVGV4dAUt5bm/5Lic5bel5Lia5aSn5a2m5Zu+5Lmm6aaG5Lmm55uu5qOA57Si57O757ufZGQCAw8PFgIfAQUcMjAxM+W5tDA35pyIMjHml6UgIOaYn+acn+aXpWRkAgQPZBYEZg9kFgQCAQ8WAh4LXyFJdGVtQ291bnQCCBYSAgEPZBYCZg8VAwtzZWFyY2guYXNweAAM55uu5b2V5qOA57SiZAICD2QWAmYPFQMTcGVyaV9uYXZfY2xhc3MuYXNweAAM5YiG57G75a+86IiqZAIDD2QWAmYPFQMOYm9va19yYW5rLmFzcHgADOivu+S5puaMh+W8lWQCBA9kFgJmDxUDCXhzdGIuYXNweAAM5paw5Lmm6YCa5oqlZAIFD2QWAmYPFQMUcmVhZGVycmVjb21tZW5kLmFzcHgADOivu+iAheiNkOi0rWQCBg9kFgJmDxUDE292ZXJkdWVib29rc19mLmFzcHgADOaPkOmGkuacjeWKoWQCBw9kFgJmDxUDEnVzZXIvdXNlcmluZm8uYXNweAAP5oiR55qE5Zu+5Lmm6aaGZAIID2QWAmYPFQMbaHR0cDovL2xpYnJhcnkuZ2R1dC5lZHUuY24vAA/lm77kuabppobpppbpobVkAgkPZBYCAgEPFgIeB1Zpc2libGVoZAIDDxYCHwJmZAIBD2QWBAIDD2QWBAIBDw9kFgIeDGF1dG9jb21wbGV0ZQUDb2ZmZAIHDw8WAh8BZWRkAgUPZBYGAgEPEGRkFgFmZAIDDxBkZBYBZmQCBQ8PZBYCHwQFA29mZmQCBQ8PFgIfAQWlAUNvcHlyaWdodCAmY29weTsyMDA4LTIwMDkuIFNVTENNSVMgT1BBQyA0LjAxIG9mIFNoZW56aGVuIFVuaXZlcnNpdHkgTGlicmFyeS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuPGJyIC8+54mI5p2D5omA5pyJ77ya5rex5Zyz5aSn5a2m5Zu+5Lmm6aaGIEUtbWFpbDpzenVsaWJAc3p1LmVkdS5jbmRkZLjlteIKM9K+qxtjyYb5tuBVJpjN& /&
&script type=&text/javascript&&
//&![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
theForm = document.aspnetF
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventT
theForm.__EVENTARGUMENT.value = eventA
theForm.submit();
&script src=&/WebResource.axd?d=aUGQsxtqBlPCYSLCotjFAgPO7LVRMgZpwdLaRZWG0_6ihSU9GEuAV24Gz4casq4yN9Ey0mGcWUzl2dmajXQUJps-v9o1&t=261250& type=&text/javascript&&&/script&
&script src=&/WebResource.axd?d=ID2SHi1EXLOLcv8QZV5z65ofzpfIKQP67HbOJyDtBOZGRBT6-d--Al86w9CE4E-H3dCnvuE2ZcqgPXnod-92Tv-ZeIo1&t=261250& type=&text/javascript&&&/script&
&script type=&text/javascript&&
//&![CDATA[
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == &function& && ValidatorOnSubmit() == false) return false;
return true;
&input type=&hidden& name=&__EVENTVALIDATION& id=&__EVENTVALIDATION& value=&/wEWBQLuwfDDAwKOmK5RApX9wcYGAsP9wL8JAqW86pcI915B4NnPkyRLP7m6znmysZd+180=& /&
&input name=&ctl00$ContentPlaceHolder1$txtlogintype& type=&hidden& id=&ctl00_ContentPlaceHolder1_txtlogintype& value=&0& /&
&div id=&Login& class=&clearFix&&
&div class=&LoginTitle&&
登录我的图书馆
&div class=&LeftLogin&&
&div class=&LoginDiv&&
&div class=&loginContent&&
&div class=&loginInfo&&
&span class=&leftInfo&&图书证号:&/span&
&span class=&rightInfo&&
&input name=&ctl00$ContentPlaceHolder1$txtUsername_Lib& type=&text& id=&ctl00_ContentPlaceHolder1_txtUsername_Lib& class=&txtInput& autocomplete=&off& /&&span id=&ctl00_ContentPlaceHolder1_rfv_UserName_Lib& style=&color:Rdisplay:&&请输入证号&/span&
&div class=&loginInfo&&
&span class=&leftInfo&&密&&&&&&&&码:&/span&
&span class=&rightInfo&&
&input name=&ctl00$ContentPlaceHolder1$txtPas_Lib& type=&password& id=&ctl00_ContentPlaceHolder1_txtPas_Lib& class=&txtInput& /&&span id=&ctl00_ContentPlaceHolder1_rfv_Password_Lib& style=&color:Rdisplay:&&请输入密码&/span&
&span id=&ctl00_ContentPlaceHolder1_lblErr_Lib&&&/span&
&div class=&loginInfo&&
&input type=&submit& name=&ctl00$ContentPlaceHolder1$btnLogin_Lib& value=&登录& onclick=&javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&ctl00$ContentPlaceHolder1$btnLogin_Lib&, &&, true, &&, &&, false, false))& id=&ctl00_ContentPlaceHolder1_btnLogin_Lib& class=&btn& /&
&input type=&button& value=&清空& onclick=&rset()& class=&btn&/&
&div class=&RightDescription&&
&img src=&images/pin.gif& /&
如果您使用的是公共电脑,请在使用完毕后,务必退出登录,以保安全。&br /&
首次登录,请先&a href=&changepas.aspx&&修改初始密码&/a&。
&script type=&text/javascript&&
//&![CDATA[
var Page_Validators =
new Array(document.getElementById(&ctl00_ContentPlaceHolder1_rfv_UserName_Lib&), document.getElementById(&ctl00_ContentPlaceHolder1_rfv_Password_Lib&));
&script type=&text/javascript&&
//&![CDATA[
var ctl00_ContentPlaceHolder1_rfv_UserName_Lib = document.all ? document.all[&ctl00_ContentPlaceHolder1_rfv_UserName_Lib&] : document.getElementById(&ctl00_ContentPlaceHolder1_rfv_UserName_Lib&);
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.controltovalidate = &ctl00_ContentPlaceHolder1_txtUsername_Lib&;
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.focusOnError = &t&;
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.errormessage = &请输入证号&;
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.display = &Dynamic&;
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.evaluationfunction = &RequiredFieldValidatorEvaluateIsValid&;
ctl00_ContentPlaceHolder1_rfv_UserName_Lib.initialvalue = &&;
var ctl00_ContentPlaceHolder1_rfv_Password_Lib = document.all ? document.all[&ctl00_ContentPlaceHolder1_rfv_Password_Lib&] : document.getElementById(&ctl00_ContentPlaceHolder1_rfv_Password_Lib&);
ctl00_ContentPlaceHolder1_rfv_Password_Lib.controltovalidate = &ctl00_ContentPlaceHolder1_txtPas_Lib&;
ctl00_ContentPlaceHolder1_rfv_Password_Lib.focusOnError = &t&;
ctl00_ContentPlaceHolder1_rfv_Password_Lib.errormessage = &请输入密码&;
ctl00_ContentPlaceHolder1_rfv_Password_Lib.display = &Dynamic&;
ctl00_ContentPlaceHolder1_rfv_Password_Lib.evaluationfunction = &RequiredFieldValidatorEvaluateIsValid&;
ctl00_ContentPlaceHolder1_rfv_Password_Lib.initialvalue = &&;
&script type=&text/javascript&&
//&![CDATA[
var Page_ValidationActive = false;
if (typeof(ValidatorOnLoad) == &function&) {
ValidatorOnLoad();
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
return true;
&&&&& 最主要的是&form&&/form&里面的内容,也就是我们要提交的表单。要实现登录,就要将表单提交上去,当然,在这之前,我们先要填充该表单。
&&&&& 首先,我们需要提取出需要填充的内容。直接看源代码,我们已经知道需要填充什么数据了,但注意到我们要提交的表单需要填充__VIEWSTATE和
__EVENTVALIDATION,而它们的表单值每次都不一样,所以我们需要提取出来,而不是自己填充。
&&&&&&ViewState是ASP.NET用来保存控件状态信息的。在ASP时代,一个HTML控件的值,比如input控件值会在我们把表单提交到服务器,页面再刷新回来的时候自动清空掉,这是因为web的无状态导致的,所以服务端每次把HTML输出到客户端后就不再与客户端有任何联系。
&&&&& 但是ASP.NET解决了这个问题:当我们在写一个ASP.NET表单的时候,如果标明&form runat = server&,那么ASP.NET就会自动在输出时给页面添加一个隐藏域:
&input type = &hidden& name = &_VIEWSTATE& value = &&&
&&&&& 有了这个隐藏域,页面里其他所有控件的状态,包括页面本身的一些状态都会保存到这个控件值里,这样每次页面提交时就会一起提交到后台,然后由ASP.NET对其中的值进行解码,最后输出时再根据这个值来恢复各个控件的状态。
&&&&& 在上面得到的网页源码中,我么可以看到,_VIEWSTATE的值非常复杂,根本无法阅读,就像是加密后的值一样,但实际上并没有任何加密,仅仅是因为各个控件和页面的状态都存入适当的对象里面,然后把该对象序列化并进行一次Base64编码,最后直接赋值给viewstate控件。所谓的Base64就是一种基于64个可打印字符来表示二进制数据的表示方法,通常用于处理像是MIME的Email或者XML中存储的一些复杂数据,在HTTP环境中专门用来传递较长的标识信息,用作HTTP表单和HTTP GET URL中的参数。
&&&&& 当然,我们会想到:为什么不用Session来保存这些数据呢?因为Session值是保存在服务器内存上的,如果大量使用Session将导致服务器负担加重,而ViewState只是将数据存入到页面隐藏控件里,不会占用服务器资源。所以,我们可以将一些需要服务器保存的变量和对象保存到ViewState里,而Session只应该用在需要跨页面并且与每个访问用户相关的变量和对象存储上。最重要的一点,Session默认情况下20分钟就过期了,但ViewState永远不会过期。
&&&&& ViewState并不能存储所有的.NET数据类型,它仅仅支持String , Integer, Boolean, Array, ArrayList, HashTable,以及一些自定义的类型。
&&&&&& 虽然使用ViewState对服务器内存是友好的,但使用ViewState会增加页面HTML的输出量,像是上面那么一大串的字符串,这样带宽就会被占用得更多。而且ViewState是不安全的,因为所有的ViewState都存储在同一个地方,我们完全可以通过查看源码来找到这个值,只要经过转换就可以获取其中的对象和变量值。
&&&&&& 为了解决这个问题,ASP.NET提供了两种方案:防篡改和加密。这些措施是题外话了,大家有兴趣的可以自己研究下。
&&&&&& __EVENTVALIDATION是ASP.NET2.0新增加的特性(很遗憾,我们学校图书馆使用的就是ASP.NET 2.0,已经断代了很久了,但这种公共管理网站是不会更新的,除非哪天它出现了严重问题),它用于对PostBack的值进行验证,确保其是合法的值。他的工作原理是这样的:在页面render的时候,ASP.NET会对控件所有可能的值以及控件的UniqueID进行Hash计算,得到一个值,所有需要Render的控件都会有一个这样的计算值,并且组成一个列表,然后放在隐藏字段__EVENTVALIDATION中,页面Render后,就会对该字段的额内容进行解包,重新计算并对比Hash值是否一致。这样是为了防范一些模拟的post攻击,但问题也就来了:如果页面非常大或者网速加载较慢,用户在没有加载到该字段的时候就提交,会发数据不完整,那么就会出错。
&&&&& 通过上面的内容,我们已经明白:要使表单提交成功,我们就要得到这两个值。
private List&string& GetElementContent(string url, string elementName, string subElement)
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();
StringBuilder regexStr = new StringBuilder(&(?is)&&);
regexStr.Append(elementName).Append(&[^&]*?&).Append(subElement).Append(@&=(['&&\s]?)([^'&&\s]+)\1[^&]*?&&);
Regex regex = new Regex(regexStr.ToString());
MatchCollection match = regex.Matches(content);
List&string& values = new List&string&();
foreach (Match m in match)
values.Add(m.Groups[2].Value);
&&&&&&该方法就是利用正则表达式对HTML页面中的节点内容进行提取。首先,我们得先得到该页面,于是需要通过HttpWebRequest发出请求,然后由HttpWebResponse得到响应该请求后返回的页面,接着就是利用正则表达式提取了。
&&&&&&如果有心想搞Web的同学,正则表达式一定要懂得写。如果对正则表达式的使用得心应手的话,在实际编码中就会非常方便。
&&&&& 我们来看看这个方法是如何使用的:
List&string& values = GetElementContent(url, &input&, &value&);
List&string& names = GetElementContent(url, &input&, &name&);
&&&&&这样我们就得到了表单中所有要提交的元素的name和value了。
&&&&&接着就是自动填充表单了:
Dictionary&string, string& postPair = new Dictionary&string, string&();
for (int i = 0, len = names.Count(); i & i++)
postPair.Add(names.ElementAtOrDefault(i), values.ElementAtOrDefault(i));
&&&& 利用一个字典,将对应的name和value放进去。当然,要想登录,我们还是得需要用户名和密码:
SetParams(&ctl00$ContentPlaceHolder1$txtUsername_Lib&, &***&, postPair);
SetParams(&ctl00$ContentPlaceHolder1$txtPas_Lib&, &***&, postPair);
&&&&&SetParams()方法的实现如下:
private void SetParams(string element, string content, Dictionary&string, string& dictionary)
for (int i = 0, len = dictionary.Keys.Count(); i & i++)
string key = dictionary.Keys.ElementAtOrDefault(i);
if (key == element)
dictionary[key] =
&&&&&&这样的值我们是不能提交上去的,还需要进行URL编码:
private void UrlEncodeParams(Dictionary&string, string& formParams)
for (int i = 0, len = formParams.Keys.Count(); i & i++)
string key = formParams.Keys.ElementAtOrDefault(i);
formParams[key] = HttpUtility.UrlEncode(formParams[key], Encoding.GetEncoding(&GBK&));
&&&& 然后就是Post该表单了:
private string PostForm(string url, Dictionary&string, string& form)
CookieContainer cookies = new CookieContainer();
string postStr = &&;
foreach (string key in form.Keys)
postStr += key + &=& + form[key] + &&&;
byte[] postData = Encoding.ASCII.GetBytes(postStr.Substring(0, postStr.Length - 1));
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = &POST&;
request.AllowAutoRedirect = false;
request.ContentType = &application/x-www-form-charset=gbk&;
request.CookieContainer = new CookieContainer();
request.UserAgent = &Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11&;
request.ContentLength = postData.L
Stream requestStream = request.GetRequestStream();
requestStream.Write(postData, 0, postData.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
string cookie = response.Headers.Get(&Set-Cookie&);
string resultPage = reader.ReadToEnd();
string html = getHtml(GetCookieName(cookie), GetCookieValue(cookie));
reader.Close();
responseStream.Close();
&&&&&&&该方法才是我们的重点!
&&&&&& 我们要先定义一个CookieContainer用来存储得到的Cookie。提交的表单字符串的形式应该是这样:name1=value1&name2=value2&...。同样,提交上去的时候,我们也是需要对该字符串进行编码。
&&&&&& 重点在于接下来的HttpWebRequest和HttpWebResponse的使用。
&&&&&& 首先,我们的HttpRequest应该是post方式,可以通过request.Method进行设置。request.AllowAutoRedirect=false是为了防止重定向,很多网站都是登录后就马上进行重定向,这样我们就无法得到登录时的Cookie,于是需要禁止该重定向。然后就是request.ContentType = &application/x-www-form-charset=gbk&。Content-Type就是所谓的内容类型,它是HTTP请求的头部信息,用于指定消息的类型,默认是text/plain,即纯文本,这里是application/x-www-form-urlencode,即指定是使用HTTP的POST方式提交表单。然后我们再指定请求的CookieContainer为刚才定义的CookieContainer。然后就是指定代理:request.UserAgent = &Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11&。用户代理字符串用于标识请求的浏览器类型和版本,操作系统,使用语言等各种信息,主要就是用于抓包。采用POST方式提交,都需要指定内容长度:request.ContentLength = postData.Length。
&&&&&& 接着我们再向请求流中写入数据:
Stream requestStream = request.GetRequestStream();
requestStream.Write(postData, 0, postData.Length);
requestStream.Close();
&&&&&& 得到响应后,我们就可以得到响应中的Cookie:
string cookie = response.Headers.Get(&Set-Cookie&);
&&&&&& 通常在响应的头信息里就包含了Cookie,它就是Set-Cookie的值。如果想要知道HTTP的头信息有哪些,可以在谷歌浏览器中按F12进行查看,但记得,要想捕捉这些信息,必须在未登录前就按F12,否则谷歌浏览器是不会跟踪这些信息的。
&&&&&& 然后我们就可以利用该Cookie登录网站并且得到登录后的网站内容:
string html = getHtml(GetCookieName(cookie), GetCookieValue(cookie));
private string GetCookieValue(string cookie)
Regex regex = new Regex(&=.*?;&);
Match value = regex.Match(cookie);
string cookieValue = value.Groups[0].V
return cookieValue.Substring(1, cookieValue.Length - 2);
private string GetCookieName(string cookie)
Regex regex = new Regex(&sulcmiswebpac.*?&);
Match value = regex.Match(cookie);
return value.Groups[0].V
private string getHtml(string name, string value)
CookieCollection cookies = new CookieCollection();
cookies.Add(new Cookie(name, value));
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(&http://222.200.98.171:81/user/bookborrowed.aspx&);
request.Method = &GET&;
request.Headers.Add(&Cookie&, name + &=& + value);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
return reader.ReadToEnd();
&&&&&我们之前得到的cookie字符串中其实就是一个键值对字符串,我们还是需要根据正则表达式提取出cookie的name和value,然后我们定义一个CookieContainer,往里面添加我们捕捉到的Cookie,接着就是需要Cookie的网页发送一个带有该Cookie的HTTP请求。
&&&& 方法很简单,只要合理的使用正则表达式,我们就可以方便的对网页进行处理,而不需要什么第三方的库。
&&&&&每个程序员都需要学会自己造轮子而不是一味的追求轮子,就算是其他语言的轮子,我们依然可以用自己熟悉的语言实现出来,毕竟所有的语言背后的实现思想都是一样的,尤其是面向对象语言,它们都是相互借鉴的,交叉处实在是太多了,C#更是在参考java的基础上创造出来的,有什么理由是java可以C#不可以呢?(有是有,但我们可以模拟)
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 jquery 获取 cookie 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信