zoukankan      html  css  js  c++  java
  • 使用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();
    复制代码

     

  • 相关阅读:
    libevent简介[翻译]3 前言
    libevent简介[翻译]2 关于异步IO的简单介绍
    gdb调试子进程
    openSUSE Firewalld
    libevent简介[翻译]1 关于这个文档
    构建libevent pdf 文档
    openSUSE编译libevent
    为openSUSE添加源
    .Net Core3.0 WebApi 项目框架搭建 五:仓储模式
    .Net Core3.0 WebApi 项目框架搭建 四:JWT权限验证
  • 原文地址:https://www.cnblogs.com/opop/p/5445295.html
Copyright © 2011-2022 走看看