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

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

无论使用任何语言做模拟登陆或者抓取访问页面,无外乎以下思路:
第一 启用一个web访问会话方法或者实例化一个web访问类,如.net中的HttpWebRequest;
第二 模拟POST或者GET方式提交的数据;
第三 模拟请求的头;
第四 提交请求并获得响应,及对响应做我们所需要的处理。
这里我们以人人网的登录为例,将涉及到POST以及GET两种请求方式。
在之前的文章《免费网页抓包工具,火狐插件FireBug的抓包使用教程》中我们知道,登陆人人网的时候,一共做了一个POST请求以及两个GET请求,如下图:
人人网登录请求
观察这三个请求的详细信息,不难看出第一个GET请求的地址可以由POST的响应得到,而第二个GET请求的地址又由第一个GET的响应得到。
先来模拟第一个POST请求
view plaincopy to clipboardprint?
    HttpWebRequest request = null;   
    HttpWebResponse response = null;   
    string gethost = string.Empty;   
    CookieContainer cc = new CookieContainer();   
    string Cookiesstr = string.Empty;   
    try  
    {   
            //第一次POST请求   
        string postdata = "email=" + UserName.Replace("@", "%40") + "&password=" + PassWord + "&origURL=" + HostUrl + "&domain=renren.com";//模拟请求数据,数据样式可以用FireBug插件得到。人人网POST数据时,用户名邮箱中的“@”变为“%40”,所以我们也要作此变化   
        string  LoginUrl="http://www.renren.com/PLogin.do";   
          request = (HttpWebRequest)WebRequest.Create(LoginUrl);//实例化web访问类   
        request.Method = "POST";//数据提交方式为POST   
          //模拟头   
        request.ContentType = "application/x-www-form-urlencoded";   
          byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);   
          request.ContentLength = postdatabytes.Length;   
          //request.Referer = "http://www.renren.com/Login.do?rf=r&domain=renren.com&origURL=" + HostUrl;   
          request.AllowAutoRedirect = false;   
          request.CookieContainer = cc;   
          request.KeepAlive = true;   
          //提交请求   
        Stream stream;   
          stream = request.GetRequestStream();   
          stream.Write(postdatabytes, 0, postdatabytes.Length);   
          stream.Close();   
          //接收响应   
        response = (HttpWebResponse)request.GetResponse();   
          //保存返回cookie   
          response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);   
          CookieCollection cook = response.Cookies;   
          string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);   
          Cookiesstr = strcrook;   
          //取第一次GET跳转地址   
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);   
          string content = sr.ReadToEnd();   
          response.Close();   
          string[] substr = content.Split(new char[] { '"' });   
          gethost = substr[1];   
    }   
    catch (Exception)   
    {   
          //第一次POST出错;   
    }  
HttpWebRequest request = null;
HttpWebResponse response = null;
string gethost = string.Empty;
CookieContainer cc = new CookieContainer();
string Cookiesstr = string.Empty;
try
{
        //第一次POST请求
    string postdata = "email=" + UserName.Replace("@", "%40") + "&password=" + PassWord + "&origURL=" + HostUrl + "&domain=renren.com";//模拟请求数据,数据样式可以用FireBug插件得到。人人网POST数据时,用户名邮箱中的“@”变为“%40”,所以我们也要作此变化
    string  LoginUrl="http://www.renren.com/PLogin.do";
      request = (HttpWebRequest)WebRequest.Create(LoginUrl);//实例化web访问类
    request.Method = "POST";//数据提交方式为POST
      //模拟头
    request.ContentType = "application/x-www-form-urlencoded";
      byte[] postdatabytes = Encoding.UTF8.GetBytes(postdata);
      request.ContentLength = postdatabytes.Length;
      //request.Referer = "http://www.renren.com/Login.do?rf=r&domain=renren.com&origURL=" + HostUrl;
      request.AllowAutoRedirect = false;
      request.CookieContainer = cc;
      request.KeepAlive = true;
      //提交请求
    Stream stream;
      stream = request.GetRequestStream();
      stream.Write(postdatabytes, 0, postdatabytes.Length);
      stream.Close();
      //接收响应
    response = (HttpWebResponse)request.GetResponse();
      //保存返回cookie
      response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
      CookieCollection cook = response.Cookies;
      string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
      Cookiesstr = strcrook;
      //取第一次GET跳转地址
    StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      string content = sr.ReadToEnd();
      response.Close();
      string[] substr = content.Split(new char[] { '"' });
      gethost = substr[1];
}
catch (Exception)
{
      //第一次POST出错;
}
注释写的很详细了,在这就不再分析,也许有人对request = (HttpWebRequest)WebRequest.Create(LoginUrl)有疑问,可以去google一下HttpWebRequest和WebRequest的区别,简单来说WebRequest是一个抽象类,不能直接实例化,需要被继承,而HttpWebRequest继承自WebRequest。
再模拟第一个和第二个GET请求
view plaincopy to clipboardprint?
    try  
    {   
        request = (HttpWebRequest)WebRequest.Create(gethost);   
        request.Method = "GET";   
        request.KeepAlive = true;   
        request.Headers.Add("Cookie:" + Cookiesstr);   
        request.CookieContainer = cc;   
        request.AllowAutoRedirect = false;   
        response = (HttpWebResponse)request.GetResponse();   
        //设置cookie   
        Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);   
        //取再次跳转链接   
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);   
        string ss = sr.ReadToEnd();   
        string[] substr = ss.Split(new char[] { '"' });   
        gethost = substr[1];   
        request.Abort();   
        sr.Close();   
        response.Close();   
    }   
    catch (Exception)   
    {   
        //第一次GET出错   
    }   
    try  
    {   
        //第二次GET请求   
        request = (HttpWebRequest)WebRequest.Create(gethost);   
        request.Method = "GET";  
        request.KeepAlive = true;  
        request.Headers.Add("Cookie:" + Cookiesstr);   
        request.CookieContainer = cc;   
        request.AllowAutoRedirect = false;   
        response = (HttpWebResponse)request.GetResponse();   
        //设置cookie   
        Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);   
        request.Abort();   
        response.Close();   
    }   
    catch (Exception)   
    {   
        //第二次GET出错   
    }  
try
{
    request = (HttpWebRequest)WebRequest.Create(gethost);
    request.Method = "GET";
    request.KeepAlive = true;
    request.Headers.Add("Cookie:" + Cookiesstr);
    request.CookieContainer = cc;
    request.AllowAutoRedirect = false;
    response = (HttpWebResponse)request.GetResponse();
    //设置cookie
    Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);
    //取再次跳转链接
    StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
    string ss = sr.ReadToEnd();
    string[] substr = ss.Split(new char[] { '"' });
    gethost = substr[1];
    request.Abort();
    sr.Close();
    response.Close();
}
catch (Exception)
{
    //第一次GET出错
}
try
{
    //第二次GET请求
    request = (HttpWebRequest)WebRequest.Create(gethost);
    request.Method = "GET";
    request.KeepAlive = true;
    request.Headers.Add("Cookie:" + Cookiesstr);
    request.CookieContainer = cc;
    request.AllowAutoRedirect = false;
    response = (HttpWebResponse)request.GetResponse();
    //设置cookie
    Cookiesstr = request.CookieContainer.GetCookieHeader(request.RequestUri);
    request.Abort();
    response.Close();
}
catch (Exception)
{
    //第二次GET出错
}
GET与POST请求大同小异,这里便不再累述。三次请求结束,保存好你的cookie string,每次请求的时候都赋给请求的头部,你就处于登录状态了。
人人网的HttpWebRequest登陆模拟很简单,但是POST及GET涉及到了,是个不错的案例。
当然,在.net想做自动访问的操作还可以使用WebBrowser控件,而且还能够和HttpWebRequest共用cookie,抛砖引玉一下不在本篇文章的讨论范围。

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

你可能感兴趣的文章
Groovy
查看>>
PLAY框架
查看>>
nodejs express rest
查看>>
一台机器同时运行两个或多个Tomcat
查看>>
java深入阅读书单
查看>>
mysql postgreSQL noSQL学习资料
查看>>
js进阶
查看>>
windows下面配置两个tomcat service
查看>>
LAMP学习环境
查看>>
PHP的语言特性-面向对象和C++/java/python的相似之处
查看>>
MEAN:Express相关资料
查看>>
javascript正则表达式分组-捕获性分组/非捕获性分组/正则前瞻
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
flask实例项目发布到centos-nginx+uWSGI+flask
查看>>
Introduction to Algorithms算法导论笔记-Lecture1
查看>>
Introduction to Algorithms-Lecture2数学课
查看>>
LeetCode 461. Hamming Distance
查看>>
LeetCode 476. Number Complement
查看>>
LeetCode 500. Keyboard Row
查看>>
LeetCode 292. Nim Game
查看>>