using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Cache; using System.Net.Security; using System.Reflection; using System.Runtime.InteropServices; using System.Security; using System.Text; using System.Text.RegularExpressions; namespace IPADDemo.Util { class HttpUtil { } public class Http_Helper { public Http_Helper() { System.Net.ServicePointManager.DefaultConnectionLimit = 1024; } public CookieContainer CookieContainers = new CookieContainer(); public string IE7 = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0C; .NET4.0E)"; public string IE8 = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)"; private RequestCachePolicy rcp = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); public bool isUserAgentSet = false; public string Cookies { get; set; } [DllImport("wininet.dll", CharSet = CharSet.Auto)] public static extern bool DeleteUrlCacheEntry(string lpszUrlName); [SecurityCritical, SuppressUnmanagedCodeSecurity] [DllImport("wininet.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] internal static extern bool InternetGetCookieExW([In] string Url, [In] string cookieName, [Out] StringBuilder cookieData, [In] [Out] ref uint pchCookieData, uint flags, IntPtr reserved); public HttpStatusCode GetResponse(ref string pResponsetext, string pUrl, string pMethod, string pData, string pReferer, int pTime = 10000, string pEncoding = "UTF-8", bool pIsPTHander = true) { Set_Cookies(pUrl); try { DeleteUrlCacheEntry(pUrl); HttpWebRequest pRequest = (HttpWebRequest)WebRequest.Create(pUrl); pRequest.KeepAlive = true; pRequest.Method = pMethod.ToUpper(); pRequest.AllowAutoRedirect = true; pRequest.CookieContainer = CookieContainers; pRequest.Referer = pReferer; pRequest.UserAgent = IE8; pRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; pRequest.Timeout = pTime; pRequest.ReadWriteTimeout = pTime; pRequest.CachePolicy = rcp; pRequest.Headers.Add("x-requested-with", "XMLHttpRequest"); //ProtocolVersion //KeepAlive //Allowautoredirect pRequest.ProtocolVersion = HttpVersion.Version10; pRequest.KeepAlive = false; if (pIsPTHander) { PTRequest(ref pRequest); } Encoding encoding = Encoding.GetEncoding(pEncoding); if (pMethod.ToUpper() != "GET" && pData != null) { byte[] bytes = encoding.GetBytes(pData); pRequest.ContentLength = (long)bytes.Length; pRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; Stream requestStream = pRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } HttpWebResponse httpWebResponse = (HttpWebResponse)pRequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding); pResponsetext = streamReader.ReadToEnd(); pRequest.Abort(); httpWebResponse.Close(); return httpWebResponse.StatusCode; } catch (WebException ex) { try { HttpWebResponse response = (HttpWebResponse)ex.Response; if (response.StatusCode == HttpStatusCode.BadRequest) { using (Stream data = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(data)) { string text = reader.ReadToEnd(); pResponsetext = text; Console.WriteLine(text); } } } } catch { return HttpStatusCode.ExpectationFailed; } return HttpStatusCode.ExpectationFailed; } } public HttpStatusCode GetResponse_WX(ref string pResponsetext, string pUrl, string pMethod, string pData, string pReferer, int pTime = 10000, string pEncoding = "UTF-8", bool pIsPTHander = true) { Set_Cookies(pUrl); try { DeleteUrlCacheEntry(pUrl); HttpWebRequest pRequest = (HttpWebRequest)WebRequest.Create(pUrl); pRequest.KeepAlive = true; pRequest.Method = pMethod.ToUpper(); pRequest.AllowAutoRedirect = true; pRequest.CookieContainer = CookieContainers; pRequest.Referer = pReferer; pRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.556.400 QQBrowser/9.0.2524.400"; pRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; pRequest.Timeout = pTime; pRequest.ReadWriteTimeout = pTime; pRequest.CachePolicy = rcp; pRequest.Headers.Add("x-requested-with", "XMLHttpRequest"); //ProtocolVersion //KeepAlive //Allowautoredirect pRequest.ProtocolVersion = HttpVersion.Version10; pRequest.KeepAlive = false; if (pIsPTHander) { PTRequest(ref pRequest); } Encoding encoding = Encoding.GetEncoding(pEncoding); if (pMethod.ToUpper() != "GET" && pData != null) { byte[] bytes = encoding.GetBytes(pData); pRequest.ContentLength = (long)bytes.Length; pRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; Stream requestStream = pRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } HttpWebResponse httpWebResponse = (HttpWebResponse)pRequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding); pResponsetext = streamReader.ReadToEnd(); pRequest.Abort(); httpWebResponse.Close(); return httpWebResponse.StatusCode; } catch (WebException ex) { try { HttpWebResponse response = (HttpWebResponse)ex.Response; if (response.StatusCode == HttpStatusCode.BadRequest) { using (Stream data = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(data)) { string text = reader.ReadToEnd(); pResponsetext = text; Console.WriteLine(text); } } } } catch { return HttpStatusCode.ExpectationFailed; } return HttpStatusCode.ExpectationFailed; } } public HttpStatusCode GetResponse1(ref string pResponsetext, string pUrl, string pMethod, string pData, string pReferer, int pTime = 10000, string pEncoding = "UTF-8", bool pIsPTHander = true) { Set_Cookies(pUrl); try { DeleteUrlCacheEntry(pUrl); HttpWebRequest pRequest = (HttpWebRequest)WebRequest.Create(pUrl); pRequest.KeepAlive = true; pRequest.Method = pMethod.ToUpper(); pRequest.AllowAutoRedirect = true; pRequest.CookieContainer = CookieContainers; pRequest.Referer = pReferer; pRequest.UserAgent = IE8; pRequest.Accept = "application/json, text/javascript, */*; q=0.01"; pRequest.Timeout = pTime; pRequest.ReadWriteTimeout = pTime; pRequest.CachePolicy = rcp; pRequest.Headers.Add("x-requested-with", "XMLHttpRequest"); pRequest.ProtocolVersion = HttpVersion.Version10; pRequest.KeepAlive = false; if (pIsPTHander) { PTRequest(ref pRequest); } Encoding encoding = Encoding.GetEncoding(pEncoding); if (pMethod.ToUpper() == "POST" && pData != null) { byte[] bytes = encoding.GetBytes(pData); pRequest.ContentLength = (long)bytes.Length; pRequest.ContentType = "application/json; charset=UTF-8"; Stream requestStream = pRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } HttpWebResponse httpWebResponse = (HttpWebResponse)pRequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding); pResponsetext = streamReader.ReadToEnd(); pRequest.Abort(); httpWebResponse.Close(); return httpWebResponse.StatusCode; } catch (WebException ex) { HttpWebResponse response = (HttpWebResponse)ex.Response; if (response.StatusCode == HttpStatusCode.BadRequest) { using (Stream data = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(data)) { string text = reader.ReadToEnd(); pResponsetext = text; Console.WriteLine(text); } } } return HttpStatusCode.ExpectationFailed; } } public HttpStatusCode GetResponse2(ref string pResponsetext, string pUrl, string pMethod, string pData, string pReferer, int pTime = 10000, string pEncoding = "UTF-8", bool pIsPTHander = true) { Set_Cookies(pUrl); try { DeleteUrlCacheEntry(pUrl); HttpWebRequest pRequest = (HttpWebRequest)WebRequest.Create(pUrl); pRequest.KeepAlive = true; pRequest.Method = pMethod.ToUpper(); pRequest.AllowAutoRedirect = true; pRequest.CookieContainer = CookieContainers; pRequest.Referer = pReferer; pRequest.UserAgent = IE8; pRequest.Accept = "application/json, text/javascript, */*; q=0.01"; pRequest.Timeout = pTime; pRequest.ReadWriteTimeout = pTime; pRequest.CachePolicy = rcp; pRequest.Headers.Add("x-requested-with", "XMLHttpRequest"); pRequest.ProtocolVersion = HttpVersion.Version10; pRequest.KeepAlive = false; if (pIsPTHander) { PTRequest(ref pRequest); } Encoding encoding = Encoding.GetEncoding(pEncoding); if (pMethod.ToUpper() == "POST" && pData != null) { byte[] bytes = encoding.GetBytes(pData); pRequest.ContentLength = (long)bytes.Length; pRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; Stream requestStream = pRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } HttpWebResponse httpWebResponse = (HttpWebResponse)pRequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding); pResponsetext = streamReader.ReadToEnd(); pRequest.Abort(); httpWebResponse.Close(); return httpWebResponse.StatusCode; } catch (WebException ex) { HttpWebResponse response = (HttpWebResponse)ex.Response; if (response.StatusCode == HttpStatusCode.BadRequest) { using (Stream data = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(data)) { string text = reader.ReadToEnd(); pResponsetext = text; Console.WriteLine(text); } } } return HttpStatusCode.ExpectationFailed; } } public HttpStatusCode GetResponse3(ref string pResponsetext, string pUrl, string pMethod, string pData, string pReferer, int pTime = 10000, string pEncoding = "UTF-8", bool pIsPTHander = true) { Set_Cookies(pUrl); try { DeleteUrlCacheEntry(pUrl); HttpWebRequest pRequest = (HttpWebRequest)WebRequest.Create(pUrl); pRequest.KeepAlive = true; pRequest.Method = pMethod.ToUpper(); pRequest.AllowAutoRedirect = true; pRequest.CookieContainer = CookieContainers; pRequest.Referer = pReferer; pRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"; pRequest.Accept = "text/plain, */*; q=0.01"; pRequest.Timeout = pTime; pRequest.ReadWriteTimeout = pTime; pRequest.CachePolicy = rcp; pRequest.Headers.Add("x-requested-with", "XMLHttpRequest"); pRequest.ProtocolVersion = HttpVersion.Version10; pRequest.KeepAlive = false; if (pIsPTHander) { PTRequest(ref pRequest); } Encoding encoding = Encoding.GetEncoding(pEncoding); if (pMethod.ToUpper() != "GET" && pData != null) { byte[] bytes = encoding.GetBytes(pData); pRequest.ContentLength = (long)bytes.Length; pRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; Stream requestStream = pRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } HttpWebResponse httpWebResponse = (HttpWebResponse)pRequest.GetResponse(); StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), encoding); pResponsetext = streamReader.ReadToEnd(); pRequest.Abort(); httpWebResponse.Close(); return httpWebResponse.StatusCode; } catch (WebException ex) { HttpWebResponse response = (HttpWebResponse)ex.Response; if (response.StatusCode == HttpStatusCode.BadRequest) { using (Stream data = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(data)) { string text = reader.ReadToEnd(); pResponsetext = text; Console.WriteLine(text); } } } return HttpStatusCode.ExpectationFailed; } } public Stream GetResponseImage(string pUrl, string pReferer = "", string pMethod = "GET", string pData = "", int pTime = 6000, string pEncoding = "UTF-8", bool pIsPTHander = true) { Set_Cookies(pUrl); try { DeleteUrlCacheEntry(pUrl); HttpWebRequest pRequest = (HttpWebRequest)WebRequest.Create(pUrl); pRequest.KeepAlive = true; pRequest.Method = pMethod; pRequest.AllowAutoRedirect = true; pRequest.CookieContainer = CookieContainers; pRequest.Referer = pReferer; pRequest.UserAgent = IE8; pRequest.Accept = "*/*"; pRequest.Timeout = pTime; pRequest.CachePolicy = rcp; pRequest.Headers.Add("x-requested-with", "XMLHttpRequest"); pRequest.ProtocolVersion = HttpVersion.Version10; pRequest.KeepAlive = false; if (pIsPTHander) { PTRequest(ref pRequest); } Encoding encoding = Encoding.GetEncoding(pEncoding); if (pMethod.ToUpper() == "POST" && pData != null) { byte[] bytes = encoding.GetBytes(pData); pRequest.ContentLength = (long)bytes.Length; pRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; Stream requestStream = pRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } ServicePointManager.ServerCertificateValidationCallback += (RemoteCertificateValidationCallback)((se, cert, chain, sslerror) => true); return pRequest.GetResponse().GetResponseStream(); } catch { return (Stream)null; } } /// /// 提取string Cookies /// /// /// public string GetCookieInternal(string pUrl) { string result = ""; uint num = 0u; string url = pUrl.ToString(); uint flags = 8192u; if (InternetGetCookieExW(url, null, null, ref num, flags, IntPtr.Zero)) { num += 1u; StringBuilder stringBuilder = new StringBuilder((int)num); if (InternetGetCookieExW(url, null, stringBuilder, ref num, flags, IntPtr.Zero)) { result = stringBuilder.ToString(); } } return result; } /// /// 提取string Cookies /// /// /// /// public string GetHttpHelperCookieString(Uri pUrl, CookieCollection pCookie = null) { List pList = new List(); if (pCookie == null) pCookie = CookieContainers.GetCookies(pUrl); foreach (Cookie cookie in pCookie) { string name = cookie.Name; string str = cookie.Value; pList.Add(name + "=" + str); } return string.Join("; ", pList); } /// /// 提取string Cookies /// /// /// /// public string GetHttpHelperCookieString(string pUrl, CookieCollection pCookie = null) { List pList = new List(); if (pCookie == null) pCookie = CookieContainers.GetCookies(new Uri(pUrl)); foreach (Cookie cookie in pCookie) { string name = cookie.Name; string str = cookie.Value; pList.Add(name + "=" + str); } return string.Join("; ", pList); } public Dictionary GetHttpHelperCookie(Uri pUrl) { Dictionary dictionary = new Dictionary(); foreach (Cookie cookie in CookieContainers.GetCookies(pUrl)) { string name = cookie.Name; string str = cookie.Value; dictionary[name] = str; } return dictionary; } /// /// 删除Heard /// /// public void PTRequest(ref HttpWebRequest pRequest) { pRequest.Headers.Remove("x-requested-with"); } /// /// 枚举类型 /// public enum InternetFlags { INTERNET_FLAG_RESTRICTED_ZONE = 16, INTERNET_COOKIE_HTTPONLY = 8192, INTERNET_COOKIE_THIRD_PARTY = 131072, } /// /// 设置COOKIES /// /// public void Set_Cookies(string url) { if (Cookies != null) { string[] arrCookie = Cookies.Split(';'); CookieContainer cookie_container = new CookieContainer(); //加载Cookie //cookie_container.SetCookies(new Uri(url), cookie); foreach (string sCookie in arrCookie) { if (sCookie.IndexOf("expires") > 0) continue; cookie_container.SetCookies(new Uri(url), sCookie); } CookieContainers = cookie_container; } } #region 正则提取Cookie public static string LiteCookies(string Cookies) { try { string rStr = ""; Cookies = Cookies.Replace("HttpOnly", "").Replace(";", "; "); Regex r = new Regex("(?<=,|^)(?[^ ]+=[\\s|\"]?(?![\"]?deleted[\"]?)[^;]+)[\"]?;"); Match m = r.Match(Cookies); while (m.Success) { rStr = GetCleanCookie(rStr, m.Groups["cookie"].Value); m = m.NextMatch(); } return rStr; } catch { return ""; } } #endregion #region 获取一次请求中的无重复Cookie private static string GetCleanCookie(string source, string inStr) { if (source != "" && inStr != "") { bool changed = false; string[] tem = source.Split(';'); for (int i = 0; i < tem.Length; i++) { if (tem[i].Split('=')[0] == inStr.Split('=')[0]) { source = source.Replace(tem[i], inStr); changed = true; } } if (!changed) source += ";" + inStr; return source; } else if (inStr != "") return inStr; else if (source != "") return source; else return ""; } #endregion #region 合并多次请求的Cookie,去掉重复部分 public static string MergerCookies(string OldCookie, string NewCookie) { if (!string.IsNullOrEmpty(OldCookie) && !string.IsNullOrEmpty(NewCookie)) { if (OldCookie == NewCookie) return OldCookie; else { List Old = new List(OldCookie.Split(';')); List New = new List(NewCookie.Split(';')); foreach (string n in New) { foreach (string o in Old) { if (o == n || o.Split('=')[0] == n.Split('=')[0]) { Old.Remove(o); break; } } } List list = new List(Old); list.AddRange(New); return string.Join(";", list.ToArray()); } } else if (!string.IsNullOrEmpty(OldCookie)) return OldCookie; else if (!string.IsNullOrEmpty(NewCookie)) return NewCookie; else return ""; } #endregion public byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); // 设置当前流的位置为流的开始 stream.Seek(0, SeekOrigin.Begin); return bytes; } } }