• 使用C#的HttpWebRequest模拟登陆网站


    很久没有写新的东西了,今天在工作中遇到的一个问题,感觉很有用,有种想记下来的冲动。

    这篇文章是有关模拟登录网站方面的。

    实现步骤;

    1. 启用一个web会话
    2. 发送模拟数据请求(POST或者GET)
    3. 获取会话的CooKie 并根据该CooKie继续访问登录后的页面,获取后续访问的页面数据。

    我们以登录人人网为例,首先需要分析人人网登录时POST的数据格式,这个可以通过IE9中只带的F12快捷键,调出开发人员工具。如下图:

    通过开始捕获得到POST的地址和POST的数据

    POST数据:

    email=aaa@163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476

    POST地址:

    http://www.renren.com/PLogin.do

    下面就是代码示例来得到登录后页面(http://guide.renren.com/guide)的数据

    HTMLHelper类

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Threading;

    namespace Test
    {
    public class HTMLHelper
    {
    /// <summary>
    /// 获取CooKie
    /// </summary>
    /// <param name="loginUrl"></param>
    /// <param name="postdata"></param>
    /// <param name="header"></param>
    /// <returns></returns>
    public static CookieContainer GetCooKie(string loginUrl, string postdata, HttpHeader header)
    {
    HttpWebRequest request = null;
    HttpWebResponse response = null;
    try
    {
    CookieContainer cc = new CookieContainer();
    request = (HttpWebRequest)WebRequest.Create(loginUrl);
    request.Method = header.method;
    request.ContentType = header.contentType;
    byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);
    request.ContentLength = postdatabyte.Length;
    request.AllowAutoRedirect = false;
    request.CookieContainer = cc;
    request.KeepAlive = true;

    //提交请求
    Stream stream;
    stream = request.GetRequestStream();
    stream.Write(postdatabyte, 0, postdatabyte.Length);
    stream.Close();

    //接收响应
    response = (HttpWebResponse)request.GetResponse();
    response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);

    CookieCollection cook = response.Cookies;
    //Cookie字符串格式
    string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);

    return cc;
    }
    catch (Exception ex)
    {

    throw ex;
    }
    }

    /// <summary>
    /// 获取html
    /// </summary>
    /// <param name="getUrl"></param>
    /// <param name="cookieContainer"></param>
    /// <param name="header"></param>
    /// <returns></returns>
    public static string GetHtml(string getUrl, CookieContainer cookieContainer,HttpHeader header)
    {
    Thread.Sleep(1000);
    HttpWebRequest httpWebRequest = null;
    HttpWebResponse httpWebResponse = null;
    try
    {
    httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(getUrl);
    httpWebRequest.CookieContainer = cookieContainer;
    httpWebRequest.ContentType = header.contentType;
    httpWebRequest.ServicePoint.ConnectionLimit = header.maxTry;
    httpWebRequest.Referer = getUrl;
    httpWebRequest.Accept = header.accept;
    httpWebRequest.UserAgent = header.userAgent;
    httpWebRequest.Method = "GET";
    httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    Stream responseStream = httpWebResponse.GetResponseStream();
    StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
    string html = streamReader.ReadToEnd();
    streamReader.Close();
    responseStream.Close();
    httpWebRequest.Abort();
    httpWebResponse.Close();
    return html;
    }
    catch (Exception e)
    {
    if (httpWebRequest != null) httpWebRequest.Abort();
    if (httpWebResponse != null) httpWebResponse.Close();
    return string.Empty;
    }
    }
    }

    public class HttpHeader
    {
    public string contentType { get; set; }

    public string accept { get; set; }

    public string userAgent { get; set; }

    public string method{get;set;}

    public int maxTry { get; set; }
    }
    }
    复制代码

     

    测试用例:

    复制代码
      HttpHeader header = new HttpHeader();
    header.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*";
    header.contentType = "application/x-www-form-urlencoded";
    header.method = "POST";
    header.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
    header.maxTry = 300;

    string html = HTMLHelper.GetHtml("http://guide.renren.com/guide", HTMLHelper.GetCooKie("http://www.renren.com/PLogin.do",
    "email=aaa@163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476", header), header);

    Console.WriteLine(html);


    Console.ReadLine();
    复制代码

     



    上一篇文章中我们讲了,如何采用程序模拟登录网站,并获取登录后网站的内容,今天在此基础上继续将,通过程序登录了网站后而直接进入登录后的页面。

    首先还是发起一个启用一个web会话,然后发送模拟数据请求,获取会话的CooKie,再根据该CooKie将其写入到本地,通过程序直接打开登录后的页面。

    该功能可用于无法修改第三方系统源代码而要做系统单点登录。

     

    我们先在HTMLHelper类中添加一个方法:

    复制代码
     1 /// <summary>
    2 /// 获取CookieCollection
    3 /// </summary>
    4 /// <param name="loginUrl"></param>
    5 /// <param name="postdata"></param>
    6 /// <param name="header"></param>
    7 /// <returns></returns>
    8 public static CookieCollection GetCookieCollection(string loginUrl, string postdata, HttpHeader header)
    9 {
    10 HttpWebRequest request = null;
    11 HttpWebResponse response = null;
    12 try
    13 {
    14 CookieContainer cc = new CookieContainer();
    15 request = (HttpWebRequest)WebRequest.Create(loginUrl);
    16 request.Method = header.method;
    17 request.ContentType = header.contentType;
    18 byte[] postdatabyte = Encoding.UTF8.GetBytes(postdata);
    19 request.ContentLength = postdatabyte.Length;
    20 request.AllowAutoRedirect = false;
    21 request.CookieContainer = cc;
    22 request.KeepAlive = true;
    23
    24 //提交请求
    25 Stream stream;
    26 stream = request.GetRequestStream();
    27 stream.Write(postdatabyte, 0, postdatabyte.Length);
    28 stream.Close();
    29
    30 //接收响应
    31 response = (HttpWebResponse)request.GetResponse();
    32 response.Cookies = request.CookieContainer.GetCookies(request.RequestUri);
    33
    34 CookieCollection cook = response.Cookies;
    35 //Cookie字符串格式
    36 string strcrook = request.CookieContainer.GetCookieHeader(request.RequestUri);
    37
    38 return cook;
    39 }
    40 catch (Exception ex)
    41 {
    42
    43 throw ex;
    44 }
    45 }
    复制代码


    再根据获取的CookieCollection写入本地,并打开登录后的页面

    复制代码
     1   [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    2
    3 public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
    4
    5
    6 HttpHeader header = new HttpHeader();
    7 header.accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-silverlight-2-b1, */*";
    8 header.contentType = "application/x-www-form-urlencoded";
    9 header.method = "POST";
    10 header.userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
    11 header.maxTry = 300;
    12
    13
    14 CookieCollection mycookie = HTMLHelper.GetCookieCollection("http://www.renren.com/PLogin.do",
    15 "email=aaa%40163.com&password=111&icode=&origURL=http%3A%2F%2Fwww.renren.com%2Fhome&domain=renren.com&key_id=1&_rtk=90484476", header);
    16
    17
    18 foreach (Cookie cookie in mycookie) //将cookie设置为浏览的cookie
    19 {
    20
    21 InternetSetCookie(
    22
    23 "http://" + cookie.Domain.ToString(),
    24
    25 cookie.Name.ToString(),
    26
    27 cookie.Value.ToString() + ";expires=Sun,22-Feb-2099 00:00:00 GMT");
    28
    29 }
    30 System.Diagnostics.Process.Start("http://guide.renren.com/guide");
    复制代码

    这样即可直接通过程序打开登录后的页面:

     

     

     

  • 相关阅读:
    Javascript倒计时
    Windows Live Writer的使用
    liunx下查看服务器硬件信息
    Ant+JSDocTookit生成Javascript文档
    文本文件及二进制文件的大小, Unicode字符编码
    读书笔记之:Linux与Unix shell编程指南v1
    读书笔记之:Linux程序设计(第2版)
    JM8.6中的encode_one_macroblock注释
    在fedora中挂载windows分区
    fedora14的yum源总结
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/10102421.html
Copyright © 2020-2023  润新知