zoukankan      html  css  js  c++  java
  • HTTP流获取包括Cookie

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Net.Cache;
    using System.Drawing;
    using System.Text.RegularExpressions;
    using System.Runtime.InteropServices;

    namespace Better.AvhBooking.BookingInterface
    {
        /// <summary>
        /// 访问网络的方法
        /// </summary>
        public enum HttpRequestType
        {
            /// <summary>
            /// Post请求
            /// </summary>
            POST,
            /// <summary>
            /// Get请求
            /// </summary>
            GET
        }
        ///<summary>
        /// 获取Cookie的方法类。
        ///</summary>
        public class CookieManger
        {
            [DllImport("wininet.dll", SetLastError = true)]
            public static extern bool InternetGetCookie(string url, string cookieName, StringBuilder cookieData, ref int size);
            [DllImport("Kernel32.dll", SetLastError = true)]
            private static extern int GetLastError();

            public static CookieContainer GetUriCookieContainer(Uri uri)
            {
                CookieContainer cookies = null;
                //定义Cookie数据的大小。
                int datasize = 256;
                StringBuilder cookieData = new StringBuilder(datasize);

                if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize))
                {
                    int errCode = GetLastError();
                    if (datasize < 0)
                        return null; // 确信有足够大的空间来容纳Cookie数据。
                    cookieData = new StringBuilder(datasize);

                    if (!InternetGetCookie(uri.ToString(), null, cookieData, ref datasize))
                    {
                        errCode = GetLastError();
                        return null;
                    }


                }

                if (cookieData.Length > 0)
                {
                    cookies = new CookieContainer();
                    string[] cooks = cookieData.ToString().Split(';');
                    for (int i = 0; i < cooks.Length; i++)
                    {
                        if (cooks[i].IndexOf(',') == -1)
                            cookies.SetCookies(uri, cooks[i]);
                    }
                }
                return cookies;
            }

            public static string GetCookiesString(CookieContainer cookies, Uri uri)
            {
                if (cookies == null || uri == null)
                    return "";
                CookieCollection cc = cookies.GetCookies(uri);

                string szCookies = "";
                foreach (Cookie cook in cc)
                {
                    szCookies = szCookies + cook.Name + "=" + cook.Value + ";";
                }

                return szCookies;
            }

        }
        public static class Http
        {
            [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);
            /// <summary>
            /// 以Post请求获取一个页面
            /// </summary>
            /// <param name="target">目标地址</param>
            /// <param name="refere">请求源</param>
            /// <param name="cookie">Cookie</param>
            /// <param name="parameters">参数列表</param>
            /// <returns></returns>
            public static string GetPostHtml(string target, string refere, ref string cookie, params string[] parameters)
            {
                return GetHtml(target, refere, ref cookie, HttpRequestType.POST, Encoding.GetEncoding("gb2312"), 60, false, parameters);
            }
            public static string GetPostHtmlPar(string target, string refere, ref string cookie, string parameters)
            {
                string[] args = null;
                if (parameters != null)
                    args = parameters.Split(new string[] { "&" }, StringSplitOptions.None);
                return GetPostHtml(target, refere, ref cookie, args);
            }
            public static string GetHtmlPar(string target, string refere, ref  string cookie, string parameters)
            {
                string[] args = null;
                if (parameters != null)
                    args = parameters.Split(new string[] { "&" }, StringSplitOptions.None);
                return GetHtml(target, refere, ref cookie, HttpRequestType.GET, Encoding.GetEncoding("gb2312"), 60, false, args);
            }
            /// <summary>
            /// 以Get请求获取一个页面
            /// </summary>
            /// <param name="target">目标地址</param>
            /// <param name="refere">请求源</param>
            /// <param name="cookie">Cookie</param>
            /// <param name="parameters">参数列表</param>
            /// <returns></returns>
            public static string GetHtml(string target, string refere, ref  string cookie, params string[] parameters)
            {
                return GetHtml(target, refere, ref cookie, HttpRequestType.GET, Encoding.GetEncoding("gb2312"), 60, false, parameters);
            }
            /// <summary>
            /// 获取一个Stream
            /// </summary>
            /// <param name="target">目标地址</param>
            /// <param name="refere">请求源</param>
            /// <param name="cookie">Cookie</param>
            /// <param name="parameters">参数列表</param>
            /// <param name="encoding">编码</param>
            /// <param name="timeOut">超时时间</param>
            /// <param name="keepAlive">是否建立持续连接</param>
            /// <param name="method">请求类型</param>
            /// <returns></returns>
            public static Stream GetStream(string target, string refere, ref  string cookie, HttpRequestType method, Encoding encoding, int timeOut, bool keepAlive, params string[] parameters)
            {
                HttpWebResponse response = null;
                Stream responseStream = null;
                Stream returnStream = null;
                try
                {
                    string ps = "";
                    if (parameters != null && parameters.Length >= 1) { ps = string.Join("&", parameters); }

                    byte[] bytes = encoding.GetBytes(ps);
                    string urlPath = "";
                    if (method == HttpRequestType.GET)
                    {
                        if (target.IndexOf("randCode.jsp?che=") < 0)
                        {
                            urlPath = string.Format("{0}?{1}", target, ps);
                        }
                        else
                        {
                            urlPath = target;
                        }
                    }
                    else
                    {
                        urlPath = target;
                    }
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlPath);

                    HttpRequestCachePolicy policy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
                    request.CachePolicy = policy;
                    request.Timeout = timeOut * 0x3e8;
                    request.KeepAlive = keepAlive;
                    request.Method = method.ToString().ToUpper();
                    bool isPost = false;

                    isPost = request.Method.ToUpper() == "POST";

                    if (isPost)
                    {
                        request.ContentType = "application/x-www-form-urlencoded";
                        request.ContentLength = bytes.Length;
                    }
                    request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.1124)";
                    request.Referer = refere;
                    request.Headers.Add("cookie", cookie);
                    request.Headers.Add("Cache-Control", "no-cache");
                    request.Accept = "*/*";
                    request.Credentials = CredentialCache.DefaultCredentials;
                    if (isPost)
                    {
                        Stream requestStream = request.GetRequestStream();
                        requestStream.Write(bytes, 0, bytes.Length);
                        requestStream.Close();
                    }
                    response = (HttpWebResponse)request.GetResponse();
                    responseStream = response.GetResponseStream();

                    byte[] buffer = StreamToBytes(responseStream);

                    returnStream = new MemoryStream(buffer);
                    string outCookie = response.Headers.Get("Set-Cookie");
                    if (outCookie != null)
                    {
                        outCookie = outCookie.Replace(",JSESSIONID=", "; JSESSIONID=");
                        cookie = SetCookies(cookie, outCookie);
                    }
                }
                catch (Exception)
                {
                    returnStream = null;
                }
                finally
                {
                    if (response != null)
                        response.Close();
                    if (responseStream != null)
                        responseStream.Close();
                }
                return returnStream;

            }
            private static byte[] StreamToBytes(Stream stream)
            {
                List<byte> bytes = new List<byte>();
                int temp = stream.ReadByte();
                while (temp != -1)
                {
                    bytes.Add((byte)temp);
                    temp = stream.ReadByte();
                }

                return bytes.ToArray();
            }
            public static string SetCookies(string cookies, string setCookies)
            {
                Dictionary<string, string> newCookies = new Dictionary<string, string>();
                if (cookies != null)
                {
                    string[] tmpCookies = cookies.Split(";".ToCharArray());
                    for (int i = 0; i < tmpCookies.Length; i++)
                    {
                        string[] cookie = tmpCookies[i].Split('=');
                        if (cookie.Length != 2)
                            continue;
                        newCookies.Add(cookie[0].Trim(), cookie[1]);
                    }
                }

                if (setCookies != null)
                {
                    string[] tmpCookies = setCookies.Split(";".ToCharArray());
                    for (int i = 0; i < tmpCookies.Length; i++)
                    {
                        string[] cookie = tmpCookies[i].Split('=');
                        if (cookie.Length != 2)
                            continue;
                        if (newCookies.ContainsKey(cookie[0].Trim()) == false)
                            newCookies.Add(cookie[0].Trim(), cookie[1]);
                        else
                            newCookies[cookie[0].Trim()] = cookie[1];
                    }
                }

                string szNewCookies = "";
                Dictionary<string, string>.Enumerator it = newCookies.GetEnumerator();
                while (it.MoveNext())
                {
                    szNewCookies = szNewCookies + " " + it.Current.Key + "=" + it.Current.Value + ";";
                }

                if (szNewCookies.Length != 0)
                    szNewCookies = szNewCookies.Substring(1, szNewCookies.Length - 1);
                return szNewCookies;
            }
            /// <summary>
            /// 获取一个HTML源
            /// </summary>
            /// <param name="target">目标地址</param>
            /// <param name="refere">请求源</param>
            /// <param name="cookie">Cookie</param>
            /// <param name="parameters">参数列表</param>
            /// <param name="encoding">编码</param>
            /// <param name="timeOut">超时时间</param>
            /// <param name="keepAlive">是否建立持续连接</param>
            /// <param name="method">请求类型</param>
            /// <returns></returns>
            public static string GetHtml(string target, string refere, ref  string cookie, HttpRequestType method, Encoding encoding, int timeOut, bool keepAlive, params string[] parameters)
            {
                string returnHtml = string.Empty;
                Stream stream = null;
                try
                {
                    stream = GetStream(target, refere, ref cookie, method, encoding, timeOut, keepAlive, parameters);

                    returnHtml = new StreamReader(stream, encoding).ReadToEnd();
                }
                catch (Exception)
                {
                    returnHtml = string.Empty;
                }
                finally
                {
                    if (stream != null)
                    {
                        stream.Close();
                    }
                }
                return returnHtml;

            }
            /// <summary>
            /// 获取一张图片
            /// </summary>
            /// <param name="target">目标地址</param>
            /// <param name="refere">请求源</param>
            /// <param name="cookie">Cookie</param>
            /// <param name="method">请求类型</param>
            /// <returns></returns>
            public static Bitmap GetImage(string target, string refere, ref  string cookie, HttpRequestType method)
            {
                return GetImage(target, refere, ref cookie, method, Encoding.GetEncoding("gb2312"), 60, true);
            }
            /// <summary>
            /// 获取一张图片
            /// </summary>
            /// <param name="target">目标地址</param>
            /// <param name="refere">请求源</param>
            /// <param name="cookie">Cookie</param>
            /// <param name="method">请求类型</param>
            /// <param name="encoding">编码</param>
            /// <param name="timeOut">超时时间</param>
            /// <param name="keepAlive">是否建立持续连接</param>
            /// <returns></returns>
            public static Bitmap GetImage(string target, string refere, ref  string cookie, HttpRequestType method, Encoding encoding, int timeOut, bool keepAlive, params string[] parameters)
            {
                Bitmap returnMap = null;
                Stream stream = null;
                try
                {
                    stream = GetStream(target, refere, ref cookie, method, encoding, timeOut, keepAlive, parameters);
                    byte[] buf = new byte[stream.Length];
                    stream.Read(buf, 0, (int)stream.Length);
                    returnMap = new Bitmap(Image.FromStream(stream));
                }
                catch (Exception)
                {
                    returnMap = null;
                }
                finally
                {
                    if (stream != null)
                    {
                        stream.Close();
                    }
                }
                return returnMap;
            }

            public static HttpStatusCode GetResponseStatusCode(string strURL, string strCookieHeader, string strReferer, out string responseUrl, out string page)
            {
                try
                {
                    HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);
                    myHttpWebRequest.ContentType = "text/html";
                    myHttpWebRequest.Method = "GET";
                    myHttpWebRequest.Referer = strReferer;
                    myHttpWebRequest.Headers.Add("cookie:" + strCookieHeader);

                    HttpWebResponse response = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    responseUrl = response.ResponseUri.OriginalString;
                    StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.GetEncoding("gb2312"));
                    page = sr.ReadToEnd();
                    return response.StatusCode;
                }
                catch (Exception ex)
                {
                   
                    responseUrl = "";
                    page = "";
                    return HttpStatusCode.RequestTimeout;
                }
            }

            public static string GetPostXML(string strURL, string strArgs, string strCookieHeader, string strReferer)
            {
                WebClient myWebClient = new WebClient();
                string postData = null;
                byte[] byteArray;
                byte[] responseArray;
                WebHeaderCollection myWebHeaderCollection;

                try
                {
                    byteArray = Encoding.UTF8.GetBytes(strArgs);

                    postData = strArgs;
                    myWebClient.Headers.Add("Content-Type", "text/xml");
                    myWebClient.Headers.Add("Referer", strReferer);
                    myWebClient.Headers.Add("Accept-Language", "zh-cn");
                    myWebClient.Headers.Add("ContentLength", byteArray.Length.ToString());
                    myWebClient.Headers.Add(HttpRequestHeader.Cookie, strCookieHeader);

                    myWebHeaderCollection = myWebClient.Headers;

                    responseArray = myWebClient.UploadData(strURL, "POST", byteArray);

                    return Encoding.Default.GetString(responseArray);
                }
                catch (Exception ex)
                {
                   
                    return "";
                }
            }
            #region 辅助方法

            private static string patternRegion = "<input[^>]*?\\b[^>]*?\\bname=['\"]?{0}['\"]?\\b[^>]*?value=['\"]?(?<value>[^\"]*)['\"]?\\b[^>]*?>";
            //返点
            private static string REGBACKPOINT = "<span id=\"span_fee_0_0\">\\d+(http://www.cnblogs.com/NoRoad/admin/file://d+%7c(///d%7B1,2%7D))//(((//d+(//d+%7C(///d%7B1,2%7D))))//)";

            public static string UpdateAmountSQL = "UPDATE orders SET PayAmount = '{0}' WHERE bigcode = '{1}'";
            private static readonly RegexOptions regexOptions = RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled;

            public static string FindValueByName(string strHTML, string elementName)
            {
                string strValue = "";
                Regex regexRegion = new Regex(string.Format(patternRegion, elementName), regexOptions); //解析Region的正则
                try
                {
                    MatchCollection mc = regexRegion.Matches(strHTML); //strHTML为要分析的网页代码
                    foreach (Match m in mc)
                    {
                        strValue = m.Groups["value"].Value;//取匹配到的命名组的值
                    }
                }
                catch (Exception ex)
                {
                   
                }
                return strValue;
            }
            public static string ChangeReturnHtml(string strHtml)
            {
                int begin = 0;
                int end = 0;
                while (begin != -1)
                {
                    begin = strHtml.ToUpper().IndexOf("<script".ToUpper());
                    end = strHtml.ToUpper().IndexOf("</script>".ToUpper());
                    if (begin != -1)
                        strHtml = strHtml.Remove(begin, end - begin + 9);
                }

                strHtml = MoveOnload(strHtml);

                return strHtml;
            }
            /// <summary>
            /// 移除返回HTML中的onload事件
            /// </summary>
            /// <param name="InputString">返回的HTML</param>
            /// <returns>处理后的html</returns>
            private static string MoveOnload(string InputString)
            {
                int begin = 0;
                int end = 0;
                string _input = "";

                while (begin != -1)
                {

                    if (InputString.Contains("onload"))
                    {
                        _input = InputString.Substring(InputString.IndexOf("onload"));

                        begin = _input.IndexOf("onload");
                        end = _input.IndexOf("\">");
                        if (begin != -1 && end != -1)
                        {
                            _input = _input.Substring(begin, end - begin + 1);
                            InputString = InputString.Replace(_input, "");
                        }
                    }
                    else
                        begin = -1;
                }
                return InputString;
            }
            public static string GetUrlCookies(string Url, string cookieName)
            {
                Uri uri = new Uri(Url);
                CookieContainer cc = CookieManger.GetUriCookieContainer(uri);
                return CookieManger.GetCookiesString(cc, uri);
            }
            public static string GetSessionID(string cookies)
            {
                //Match match = Regex.Match(cookies, @"(?<SessionID>JSESSIONID=([^;]*))", RegexOptions.IgnoreCase);
                try
                {
                    Match match = Regex.Match(cookies, @"(?<SessionID>[^;,\s]*SESSIONID=[^;]*)", RegexOptions.IgnoreCase);
                    if (match.Success == true)
                        return match.Groups["SessionID"].Value.Trim();
                    else
                        return "";
                }
                catch (Exception ex)
                {
                   
                    return "";
                }
            }
            public static void SetUrlCookies(string Url, string cookies)
            {
                if (cookies != null)
                {
                    string[] tmpCookies = cookies.Split(";".ToCharArray());
                    //StringBuilder sbCookieName = new StringBuilder();
                    //StringBuilder sbCookieValue = new StringBuilder();

                    Uri uri = new Uri(Url);
                    for (int i = 0; i < tmpCookies.Length; i++)
                    {
                        string[] cookie = tmpCookies[i].Split('=');
                        if (cookie.Length != 2)
                            continue;
                        //sbCookieName.Append(cookie[0]);
                        //sbCookieValue.Append(cookie[1]);

                        InternetSetCookie(Url, cookie[0], cookie[1]/*+";expires=Sun,22-Feb-2099 00:00:00 GMT;"*/);
                        //InternetSetCookie(Url, "","");
                    }

                    //InternetSetCookie(Url, sbCookieName, sbCookieValue);
                }
            }
            public static string FindBackpoint(string strHTML)
            {
                Regex regs = new Regex(REGBACKPOINT);
                return regs.Match(strHTML).Groups[3].Value;
            }
            #endregion
        }
    }

  • 相关阅读:
    移除TDE
    SQL Server 聚集索引和非聚集索引的区别
    Serivce Broker 简单实用
    SQL Server 2012 ColumnStore索引测试
    UISegmentedControl的所有操作总结
    iPhone开发之深入浅出 — ARC之前世今生(三)
    什么是 ARC?ios5,xcode 4.2
    Present ViewController详解
    UITextField的总结
    iPhone开发资料之内存管理 ,循环引用导致的内存问题
  • 原文地址:https://www.cnblogs.com/NoRoad/p/1945912.html
Copyright © 2011-2022 走看看