經過HttpWebRequest實現模擬登錄

1>經過HttpWebRequest模擬登錄html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.DirectoryServices.Protocols;
using System.ServiceModel.Security;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;


namespace BaiduCang
{
    /// <summary>
    /// 有關HTTP請求的輔助類
    /// </summary>
    public class HttpWebResponseUtility
    {
        private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
        /// <summary>
        /// 建立GET方式的HTTP請求
        /// </summary>
        /// <param name="url">請求的URL</param>
        /// <param name="timeout">請求的超時時間</param>
        /// <param name="userAgent">請求的客戶端瀏覽器信息,能夠爲空</param>
        /// <param name="cookies">隨同HTTP請求發送的Cookie信息,若是不須要身份驗證能夠爲空</param>
        /// <returns></returns>
        public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";
            request.UserAgent = DefaultUserAgent;
            if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            if (cookies != null)
            {
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookies);
            }
            return request.GetResponse() as HttpWebResponse;
        }
        /// <summary>
        /// 建立POST方式的HTTP請求
        /// </summary>
        /// <param name="url">請求的URL</param>
        /// <param name="parameters">隨同請求POST的參數名稱及參數值字典</param>
        /// <param name="timeout">請求的超時時間</param>
        /// <param name="userAgent">請求的客戶端瀏覽器信息,能夠爲空</param>
        /// <param name="requestEncoding">發送HTTP請求時所用的編碼</param>
        /// <param name="cookies">隨同HTTP請求發送的Cookie信息,若是不須要身份驗證能夠爲空</param>
        /// <returns></returns>
        public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("url");
            }
            if (requestEncoding == null)
            {
                throw new ArgumentNullException("requestEncoding");
            }
            HttpWebRequest request = null;
            //若是是發送HTTPS請求
            if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
            {
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(url) as HttpWebRequest;
                request.ProtocolVersion = HttpVersion.Version10;
            }
            else
            {
                request = WebRequest.Create(url) as HttpWebRequest;
            }
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.AllowAutoRedirect = false;

            if (!string.IsNullOrEmpty(userAgent))
            {
                request.UserAgent = userAgent;
            }
            else
            {
                request.UserAgent = DefaultUserAgent;
            }

            if (timeout.HasValue)
            {
                request.Timeout = timeout.Value;
            }
            if (cookies != null)
            {
                request.CookieContainer = new CookieContainer();
                request.CookieContainer.Add(cookies);
            }

            //若是須要POST數據
            if (!(parameters == null || parameters.Count == 0))
            {
                StringBuilder buffer = new StringBuilder();
                int i = 0;
                foreach (string key in parameters.Keys)
                {
                    if (i > 0)
                    {
                        buffer.AppendFormat("&{0}={1}", key, parameters[key]);
                    }
                    else
                    {
                        buffer.AppendFormat("{0}={1}", key, parameters[key]);
                    }
                    i++;
                }
                byte[] data = requestEncoding.GetBytes(buffer.ToString());
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
            }

            return request.GetResponse() as HttpWebResponse;
        }

        private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
        {
            return true; //老是接受
        }

        /// <summary>
        /// 獲取post中input的值
        /// </summary>
        /// <param name="content">返回的html</param>
        /// <returns></returns>
        public static Dictionary<string, string> GetPostValuesFromContent(string content)
        {
            Dictionary<string, string> dics = new Dictionary<string, string>();
            StringBuilder sbPattern = new StringBuilder();
            sbPattern.Append("<input").Append("[^>]*?").Append("/?>");
            Regex regex = new Regex(sbPattern.ToString());
            MatchCollection matchList = regex.Matches(content);
            foreach (Match match in matchList)
            {
                string inputValue = match.Groups[0].Value;

                sbPattern = new StringBuilder();
                sbPattern.Append("name=\"").Append("([^\"]*?)").Append("\"");
                regex = new Regex(sbPattern.ToString());
                string name = regex.Match(inputValue).Groups[1].Value;

                sbPattern = new StringBuilder();
                sbPattern.Append("value=\"").Append("([^\"]*?)").Append("\"");
                regex = new Regex(sbPattern.ToString());
                string value = regex.Match(inputValue).Groups[1].Value;

                dics.Add(name, System.Web.HttpContext.Current.Server.UrlEncode(value));
            }

            return dics;
        }


        /// <summary>
        /// 獲取post中input的值
        /// </summary>
        /// <param name="content">返回的html</param>
        /// <returns></returns>
        public static Dictionary<string, string> GetPostValuesFromUrl(string url)
        {
            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();

            return GetPostValuesFromContent(content);
        }


        /// <summary>
        /// 從Headers的Cookie中獲取到系統的cookie
        /// </summary>
        /// <param name="setCookie">headers中的cookie字符串</param>
        /// <param name="cookieName">系統cookie的name</param>
        /// <returns></returns>
        public static string GetCookieFromSetCookie(string setCookie, string cookieName)
        {
            StringBuilder sbPattern = new StringBuilder();
            sbPattern.AppendFormat("{0}=", cookieName).Append("(.*?)").Append(";");
            Regex regex = new Regex(sbPattern.ToString());
            Match match = regex.Match(setCookie);
            return match.Groups[1].Value;
        }

        /// <summary>
        /// 獲取登錄後的跳轉頁面的html
        /// </summary>
        /// <param name="cookieName">系統cookie的name</param>
        /// <param name="cookieValue">系統cookie的value</param>
        /// <param name="redirectUrl">登錄後跳轉的url</param>
        /// <returns></returns>
        public static string GetRedirctUrlHtml(string cookieName, string cookieValue, string redirectUrl, Encoding encoding)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(redirectUrl);
            request.Method = "GET";
            request.Headers.Add("Cookie", cookieName + "=" + cookieValue);

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader reader = new StreamReader(stream, encoding);
            return reader.ReadToEnd();
        }
    }
}

  

2>模擬登錄demo,直接從項目中挖出來的,實現的模擬登錄客戶的oa系統和erp系統的功能,而後審覈代辦消息,審覈的功能未實現。代碼實現的是模擬登錄成功後,獲取跳轉後的頁面的html。代碼中實際地址和帳戶非真實數據。程序員

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Net;
using BaiduCang;
using System.IO;
using System.Text.RegularExpressions;

public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //LoginJsjd();
        //LoginOA();
        LoginErp();
    }

    public void LoginJsjd()
    {
        string loginUrl = "http://192.168.0.2/jsjd/login.aspx";
        string redirectUrl = "http://192.168.0.2/jsjd/wfi.ashx?act=audit&id=e77ff6a5-4e17-4fb6-b696-82bf5b3c717f&msgid=bc5b6d50-f315-414e-841f-e382ca1a4f8e&comment=&result=Approve";
        Encoding encoding = Encoding.GetEncoding("gb2312");
        string cookieName = ".ASPXAUTH";

        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters.Add("txtName", "8888");
        parameters.Add("txtPassword", "8888");

        Response.Write(Login(loginUrl, loginUrl, redirectUrl, cookieName, encoding, parameters));
    }

    public void LoginOA()
    {
        string loginUrl = "http://192.168.0.2:8090/dcwork/j_bsp_security_check/up";
        string redirectUrl = "http://192.168.0.2:8090/dcwork/processlist.cmd?method=taskinfoportal";
        Encoding encoding = Encoding.GetEncoding("gb2312");
        string cookieName = "JSESSIONID";

        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters.Add("j_username", "888888");
        parameters.Add("j_password", "888888");

        Response.Write(Login(loginUrl, loginUrl, redirectUrl, cookieName, encoding, parameters));
    }


    public void LoginErp()
    {
        string loginUrl = "http://192.168.0.2:8000/OA_HTML/RF.jsp?function_id=26668&resp_id=-1&resp_appl_id=-1&security_group_id=0&lang_code=ZHS&params=KQ0ueFd3h5ncJDQ0.532EQ&oas=NqL6dDNwywXNVCwleKSBLw";
        string portUrl = "http://192.168.0.2:8000/OA_HTML/OA.jsp?page=/oracle/apps/fnd/sso/login/webui/MainLoginPG&_ri=0&_ti=128180147&language_code=ZHS&requestUrl=&oapc=18&oas=zlyIwYnA_a_ouuYU0LTLzw..";
        string redirectUrl = "http://192.168.0.2:8000/OA_HTML/OA.jsp?OAFunc=OAHOMEPAGE";
        Encoding encoding = Encoding.GetEncoding("gb2312");
        string cookieName = "JSESSIONID";

        Dictionary<string, string> parameters = new Dictionary<string, string>();
        parameters.Add("usernameField", "888888");
        parameters.Add("passwordField", "888888");

        Response.Write(Login(loginUrl, portUrl, redirectUrl, cookieName, encoding, parameters));
    }

    /// <summary>
    /// 登錄後返回指定頁面的html
    /// </summary>
    /// <param name="loginUrl">登錄頁面url</param>
    /// <param name="portUrl">登錄提交的post頁面url</param>
    /// <param name="redirectUrl">登錄成功後跳轉的頁面url</param>
    /// <param name="cookieName">cookie名稱</param>
    /// <param name="encoding">編碼方式</param>
    /// <param name="nameAndPassword">用戶名和密碼對應的文本框的name和值</param>
    /// <returns></returns>
    public string Login(string loginUrl, string portUrl, string redirectUrl, string cookieName, Encoding encoding, Dictionary<string, string> nameAndPassword)
    {
        Dictionary<string, string> parameters = HttpWebResponseUtility.GetPostValuesFromUrl(loginUrl);

        //給參數字典中的用戶名和密碼賦值
        foreach (var item in nameAndPassword)
        {
            parameters[item.Key] = item.Value;
        }

        foreach (var item in parameters)
        {
            Response.Write(string.Format("{0}:{1}", item.Key, item.Value));
            Response.Write("</br>");
        }


        HttpWebResponse response = HttpWebResponseUtility.CreatePostHttpResponse(
         portUrl, parameters, null, null, encoding, null);

        string setCookie = response.Headers["Set-Cookie"];
        string cookie = HttpWebResponseUtility.GetCookieFromSetCookie(setCookie, cookieName);
        return HttpWebResponseUtility.GetRedirctUrlHtml(cookieName, cookie, redirectUrl, encoding);
    }
}

  

 程序員的基礎教程:菜鳥程序員web

相關文章
相關標籤/搜索