/* * 采集网页 * 肖俊 * 2013-11-12 * */ using NaiBa.Util; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Globalization; using System.IO; using System.IO.Compression; using System.Net; using System.Security.Cryptography; using System.Security.Policy; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Web; namespace AllBase { public class GetHtml { /// /// 加载远程图片 /// /// /// public static Image LoadImage(string url) { try { System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); System.Net.WebResponse webres = webreq.GetResponse(); System.IO.Stream stream = webres.GetResponseStream(); return Image.FromStream(stream); } catch { return null; } } /// /// 读取网络图片转为Img以在DataGridView中显示,用于HttpWebRequest直接读取可能403的情况 /// /// /// /// public static Image GetUrlImg(string imgUrl, out string rst) { rst = ""; //return LoadImage(imgUrl); Image image = null; HttpWebResponse response = null; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(imgUrl); request.KeepAlive = true; request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0"); request.Headers.Add("Upgrade-Insecure-Requests", @"1"); request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); request.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9"); //request.IfModifiedSince = DateTime.Parse("Fri, 18 Jul 2025 06:00:49 GMT"); // 没改动不更新,CS程序无缓存不使用 response = (HttpWebResponse)request.GetResponse(); using (Stream stream = response.GetResponseStream()) { image = Image.FromStream(stream); } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { response = (HttpWebResponse)ex.Response; rst = ReadResponse(response); } if (string.IsNullOrEmpty(rst)) rst = ex.Message; } catch (Exception e) { rst = e.Message; } if (response != null) { response.Close(); response.Dispose(); } return image; //try //{ // if (!string.IsNullOrEmpty(prodSelect?.main_img)) // { // using (Stream stream = WebRequest.Create(prodSelect.main_img.Replace("https", "http")).GetResponse().GetResponseStream()) // { // image = Image.FromStream(stream); // } // } //} //catch (Exception ex) //{ //} } public static string ReadResponse(HttpWebResponse response, Encoding encoding = null) { using (Stream responseStream = response.GetResponseStream()) { Stream streamToRead = responseStream; if (response.ContentEncoding.ToLower().Contains("gzip")) { streamToRead = new GZipStream(streamToRead, CompressionMode.Decompress); } else if (response.ContentEncoding.ToLower().Contains("deflate")) { streamToRead = new DeflateStream(streamToRead, CompressionMode.Decompress); } if (encoding == null) encoding = Encoding.UTF8; using (StreamReader streamReader = new StreamReader(streamToRead, encoding)) { try { return streamReader.ReadToEnd(); } catch (Exception ex) { return ex.Message; } } } } /// /// 代理抓取 /// /// /// public static string ByProxy(string url) { string html = "", newurl = GetProxyUrlx(url); Random ro = new Random(); int i = 0; MultiThreadClient mc = new MultiThreadClient(); ReTry: html = mc.GetHtml(newurl); if (IsError(ref html)) { Thread.Sleep(ro.Next(2000, 6000)); if (i < 4) { i++; goto ReTry; } newurl = GetProxyUrlx(url); html = mc.GetHtml(newurl); if (IsError(ref html)) return mc.GetHtml(url); return html; } Thread.Sleep(100 + BaseClass.WaitTime / 2 + ro.Next(BaseClass.WaitTime)); Clear(ref html); return html; } /// /// 清理、处理代码 /// /// private static void Clear(ref string html) { html = UrlDecode(html); html = html.Replace("\\", ""); } /// /// 是否错误 /// /// /// public static bool IsError(ref string html) { return string.IsNullOrEmpty(html) || html.Length < 100 || html.Contains("您的访问出错了") || html.Contains("访问异常出错"); } /// /// 获取代理地址 /// /// /// public static string GetProxyUrlx(string url) { if (string.IsNullOrEmpty(url)) return null; if (BaseClass.ProxyOut.Count == 0) { BaseClass.ViewCode += "代理异常"; return url; } Random ra = new Random(); string p = BaseClass.ProxyOut[ra.Next(BaseClass.ProxyOut.Count)]; return "http://" + p + "/url=" + url.Replace(".google.", ".goo00gle.") .Replace("?", "%3f").Replace("=", "%3d").Replace("&", "%26"); } /// /// ascii码转译为汉字 /// /// 带ASCII码的字符串 /// 还原字符串 public static void AsciiToString(ref string temp) { if (string.IsNullOrEmpty(temp)) return; //return; try { if (temp.Contains("&#")) { Regex reUnicode = new Regex(@"&#[x]([0-9A-Fa-f]{4,5});", RegexOptions.Compiled); temp = reUnicode.Replace(temp, m => { short c; if (short.TryParse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out c)) return "" + (char)c; return m.Value; }); } if (temp.Contains("\\u")) { Regex reUnicode = new Regex(@"\\u([0-9a-fA-F]{4,5})", RegexOptions.Compiled); temp = reUnicode.Replace(temp, m => { short c; if (short.TryParse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out c)) return "" + (char)c; return m.Value; }); } } catch { } //string html = "´,´©,©>,>µ,µ®,®°,°¡,¡, »,»" + // "¦,¦÷,÷¿,¿¬,¬§,§•,•½,½«,«¶,¶¨,¨" + // "¸,¸¼,¼<,<±,±×,×¢,¢¾,¾¯,¯“,"" + // "™,™€,€£,£¥,¥„,„…,…·,·›,›ª,ª" + // "ˆ,ˆ“,“—,—’,’º,º†,†‹,‹–,–" + // "‚,‚”,”‡,‡‘,‘‰,‰­,­˜,˜≈,≈" + // "⁄,⁄←,←∂,∂♠,♠∩,∩≥,≥≤,≤″,″∑,∑♣,♣" + // "↔,↔◊,◊′,′↑,↑↓,↓♥,♥−,−∏,∏‍,‍♦,♦" + // "∞,∞≠,≠√,√‌,‌≡,≡∫,∫‾,‾→,→α,αη,η" + // "μ,μπ,πθ,θβ,βγ,γν,νψ,ψυ,υχ,χι,ι" + // "ω,ωρ,ρξ,ξδ,δκ,κο,οσ,σζ,ζε,ε" + // "λ,λφ,φτ,τΑ,ΑΗ,ΗΜ,ΜΠ,ΠΘ,ΘΒ,ΒΓ,Γ" + // "Ν,ΝΨ,ΨΥ,ΥΧ,ΧΙ,ΙΩ,ΩΡ,ΡΞ,ΞΔ,ΔΚ,Κ" + // "Ο,ΟΣ,ΣΖ,ΖΕ,ΕΛ,ΛΦ,ΦΤ,Τς,ς&,&"; //string[] h = html.Split(';'); //string s1; //string s2; //foreach (string s in h) //{ // s2 = s.Substring(2, s.Length - 2) + ";"; // if (!temp.Contains(s2)) // continue; // s1 = s.Substring(0, 1); // temp = temp.Replace(s2, s1); //} //return temp; } /// /// html解码,\u解码 /// /// /// public static string UrlDecode(string html) { string temp = HttpUtility.UrlDecode(html); Regex reUnicode = new Regex(@"\\u([0-9a-fA-F]{4})", RegexOptions.Compiled); return reUnicode.Replace(temp, m => { short c; if (short.TryParse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out c)) return "" + (char)c; return m.Value; }); } /// /// 本地+国内+美国 /// /// /// /// public static string GetByMyself(string url, out bool isError, bool isServer) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = isServer ? 40 : 20; string Html = mu.GetHtml(url); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(ProxyIpInUrl(url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(ProxyIpOutUrl(url)); if (string.IsNullOrEmpty(Html) || mu.IsError) { isError = true; return null; } isError = false; return Html; } /// /// 国内+本地+美国 /// /// /// /// public static string GetByIn(string url, out bool isError, bool isServer) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = isServer ? 40 : 20; ; string Html = mu.GetHtml(ProxyIpInUrl(url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(url); if (string.IsNullOrEmpty(Html) || mu.IsError) { mu.TimeOut = 30; Html = mu.GetHtml(ProxyIpOutUrl(url)); } if (string.IsNullOrEmpty(Html) || mu.IsError) { isError = true; return null; } isError = false; return Html; } /// /// 国内+本地+美国 /// /// /// /// public static string PostByIn(string url, out bool isError, bool isServer, string data) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = isServer ? 40 : 20; ; string Html = mu.GetHtml(ProxyIpInUrl(url), Encoding.UTF8.GetBytes(data)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(url, Encoding.UTF8.GetBytes(data)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(ProxyIpOutUrl(url), Encoding.UTF8.GetBytes(data)); if (string.IsNullOrEmpty(Html) || mu.IsError) { isError = true; return null; } isError = false; return Html; } /// /// 美国+国内+本地 /// /// /// /// public static string GetByOut(string url, out bool isError, bool isServer) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = isServer ? 60 : 30; ; string Html = mu.GetHtml(ProxyIpOutUrl(url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(ProxyIpInUrl(url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(url); if (string.IsNullOrEmpty(Html) || mu.IsError) { isError = true; return null; } isError = false; return Html; } /// /// 美国服务器出口 /// /// /// public static string ByUsa(string url) { bool isError; return ByUsa(url, out isError, false, false, false, false); } /// /// 美国服务器出口 /// /// /// public static string ByUsa(string url, bool mobile) { bool isError; return ByUsa(url, out isError, mobile, false, false, false); } /// /// 美国服务器出口 /// /// /// public static string ByUsa(bool isUtf8, string url) { bool isError; return ByUsa(url, out isError, false, false, isUtf8, false); } /// /// 美国服务器出口 /// /// /// public static string ByUsa(string url, bool mobile, bool isGbk) { bool isError; return ByUsa(url, out isError, mobile, isGbk, false, false); } /// /// 美国服务器出口 /// /// /// public static string ByUsaWhoies(string domain) { bool isError; return ByUsa(domain, out isError, false, false, false, true); } /// /// 美国服务器出口 /// /// /// /// public static string ByUsa(string url, out bool isError, bool mobile, bool isGbk, bool isUtf8, bool isWhois) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = 30; mu.IsGbk = isGbk; mu.IsUtf8 = isUtf8; if (mobile) mu.AddCookies = "Moblie"; mu.IsWhoies = isWhois; string Html = mu.GetHtml(GetProxyUrl(BaseClass.ProxyOut, url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(GetProxyUrl(BaseClass.ProxyOut, url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(GetProxyUrl(BaseClass.ProxyOut, url)); if (string.IsNullOrEmpty(Html) || mu.IsError) { isError = true; return null; } isError = false; return Html; } /// /// 局域网出口 /// /// /// /// public static string ByLocation(string url) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = 30; string Html = mu.GetHtml(GetProxyUrl(BaseClass.ProxyIn, url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(GetProxyUrl(BaseClass.ProxyIn, url)); if (string.IsNullOrEmpty(Html) || mu.IsError) Html = mu.GetHtml(GetProxyUrl(BaseClass.ProxyIn, url)); if (string.IsNullOrEmpty(Html) || mu.IsError) { return null; } return Html; } /// /// 远程下载文件 /// /// /// /// public static bool ByUsaDownload(string url, string path) { string newUrl = GetProxyUrl(BaseClass.ProxyOut, url); bool ok = DownloadFile(newUrl, path); if (!ok) DownloadFile(GetProxyUrl(BaseClass.ProxyOut, url), path); if (!ok) DownloadFile(GetProxyUrl(BaseClass.ProxyOut, url), path); return ok; } /// /// HTTPS专用出口 /// /// /// public static string ByHttps(string url) { bool isError; return ByHttps(url, out isError, false); } /// /// HTTPS专用出口 /// /// /// public static string ByHttps(string url, bool mobile) { bool isError; return ByHttps(url, out isError, mobile); } /// /// HTTPS专用出口 /// /// /// /// public static string ByHttps(string url, out bool isError, bool mobile) { MultiThreadClient mu = new MultiThreadClient(); mu.TimeOut = 60; if (mobile) mu.IsMoblie = true; string urlx = GetProxyUrl(BaseClass.ProxyHttps, url); string Html = mu.GetHtml(urlx); if (string.IsNullOrEmpty(Html) || mu.IsError) { urlx = GetProxyUrl(BaseClass.ProxyHttps, url); Html = mu.GetHtml(urlx); } if (string.IsNullOrEmpty(Html) || mu.IsError) { isError = true; return null; } isError = false; return Html; } /// /// 转换URL /// /// /// /// public static string GetProxyUrl(List ips, string url) { if (ips.Count == 0) return url; Random ra = new Random(Guid.NewGuid().GetHashCode()); string ip = ips[ra.Next(ips.Count)]; return "http://" + (ip.Contains(":") ? ip : ip + ":6000") + "/url=" + ReplaceUrl(url); } /// /// utf8 下载页面 /// /// /// public static string Utf8(string url) { if (string.IsNullOrEmpty(url)) return ""; try { WebClientx web = new WebClientx(); web.Timeout = 60; web.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); web.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); web.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"); web.Proxy = null; byte[] b = web.DownloadData(url); return Encoding.UTF8.GetString(b); } catch { return ""; } } /// /// Whois 查询 /// /// /// public static string Whois(string url) { if (string.IsNullOrEmpty(url)) return ""; try { WebClientx web = new WebClientx(); web.Timeout = 30; web.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); web.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); web.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"); web.Headers.Add("Add-Cookies", "whois"); web.Proxy = null; byte[] b = web.DownloadData(url); return Encoding.UTF8.GetString(b); } catch { return ""; } } /// /// 模拟百度抓取 /// /// /// public static string ByBaidu(string url) { string userAgent = "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"; return ByBaidu(url, userAgent); } /// /// 模拟百度蜘蛛下载页面 /// /// /// public static string ByBaidu(string url, bool redirect) { if (string.IsNullOrEmpty(url)) return ""; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.Accept = "*/*"; request.Headers.Add("Accept-Language", "zh-CN"); request.Headers.Add("Accept-Encoding", "gzip,deflate"); request.UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"; request.AllowAutoRedirect = redirect; request.Timeout = 20000; request.ReadWriteTimeout = 20000; request.Proxy = null; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream receiveStream = response.GetResponseStream(); MemoryStream ms = new MemoryStream(); int num = 0; byte[] buffer = new byte[10240]; do { num = receiveStream.Read(buffer, 0, buffer.Length); if (num > 0) ms.Write(buffer, 0, num); } while (num > 0); byte[] b = ms.ToArray(); ms.Close(); b = ZipHelper.Decompress(b); string contentType = response.Headers["Content-Type"]; string newurl = response.Headers["Location"]; if (!string.IsNullOrEmpty(newurl)) return "重定向:" + newurl; string html = ""; if (!string.IsNullOrEmpty(contentType)) { string c = GetRegexString(contentType, "charset\\s*=\\s*(\\S+)").Trim(); if (!string.IsNullOrEmpty(c)) html = Encoding.GetEncoding(c).GetString(b); } if (string.IsNullOrEmpty(html)) { html = Encoding.GetEncoding("UTF-8").GetString(b); string r = @"]*?charset=[""']*([\w-]+)[""']*"; string c = GetRegexString(html.ToLower(), r); if (c.IndexOf("'") > -1) c = c.Substring(0, c.IndexOf("'")); if (c.IndexOf("\"") > -1) c = c.Substring(0, c.IndexOf("\"")); if (c.IndexOf(" ") > -1) c = c.Substring(0, c.IndexOf(" ")); if (c.IndexOf(">") > -1) c = c.Substring(0, c.IndexOf(">")); if (c.ToLower() != "utf-8" && !string.IsNullOrEmpty(c)) html = Encoding.GetEncoding(c).GetString(b); else if (string.IsNullOrEmpty(c)) html = Encoding.GetEncoding("gbk").GetString(b); } if (!string.IsNullOrEmpty(html)) { if (html.Substring(0, 1) == "锘") html = Encoding.GetEncoding("UTF-8").GetString(b); //if (html.Contains("�") && (html.Length - html.Replace("�", "").Length > 3)) // html = Encoding.GetEncoding("gbk").GetString(b); } if (string.IsNullOrEmpty(html) && !string.IsNullOrEmpty(newurl)) html = "重定向:" + newurl; return html; } catch (Exception e) { return e.Message; } } /// /// 自动识别代码模拟浏览器 /// /// /// public static string GetUrl(string getUrl, ref string cookies, ref string codeType) { if (string.IsNullOrEmpty(getUrl)) return ""; try { int retryTimes = 0; GotoAgen: if (string.IsNullOrEmpty(cookies)) cookies = null; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(getUrl); request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"; request.Method = "GET"; request.Accept = "*/*"; request.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); request.Headers.Add("Accept-Encoding", "gzip,deflate"); request.Headers.Add("Cookie", cookies); request.Proxy = null; request.AllowAutoRedirect = false; request.Timeout = 10000; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream receiveStream = response.GetResponseStream(); MemoryStream ms = new MemoryStream(); int num = 0; byte[] buffer = new byte[20480]; do { try { num = receiveStream.Read(buffer, 0, buffer.Length); if (num > 0) ms.Write(buffer, 0, num); } catch { num = 0; } } while (num > 0); byte[] b = ms.ToArray(); ms.Close(); b = ZipHelper.Decompress(b); string cookies1 = response.Headers.Get("Set-Cookie"); string location = response.Headers.Get("Location"); //跳转地址 if (!string.IsNullOrEmpty(cookies1)) cookies = UpCookies(cookies, cookies1); string contentType = response.Headers["Content-Type"]; string html = ""; if (string.IsNullOrEmpty(location)) //不是跳转 { if (!string.IsNullOrEmpty(contentType)) { codeType = GetRegexString(contentType, "charset\\s*=\\s*(\\S+)").Trim(); if (!string.IsNullOrEmpty(codeType)) html = Encoding.GetEncoding(codeType).GetString(b); } if (string.IsNullOrEmpty(html)) { codeType = "UTF-8"; html = Encoding.GetEncoding(codeType).GetString(b); string r = @"<\s*meta.+charset\s*=\s*[""']*(\S+)[""'\s>]*"; string c = GetRegexString(html, r).Trim(); if (c.IndexOf("'") > -1) c = c.Substring(0, c.IndexOf("'")); if (c.IndexOf("\"") > -1) c = c.Substring(0, c.IndexOf("\"")); if (c.IndexOf(" ") > -1) c = c.Substring(0, c.IndexOf(" ")); if (c.IndexOf(">") > -1) c = c.Substring(0, c.IndexOf(">")); if (!string.IsNullOrEmpty(c) && c.ToLower() != "utf-8") { html = Encoding.GetEncoding(c).GetString(b); codeType = c; } } } if (retryTimes < 4 && (!string.IsNullOrEmpty(location) || string.IsNullOrEmpty(html))) { //下面是支持301和302跳转部分 if (location.Length > 8 && (location.Substring(0, 7) == "http://" || location.Substring(0, 8) == "https://" || location.Substring(0, 6) == "ftp://")) { getUrl = location; } else { if (location.Substring(0, 1) == "/") { string[] l = getUrl.Split('/'); if (l.Length > 3) { getUrl = ""; for (int i = 0; i < 3; i++) getUrl += l[i] + "/"; getUrl += location.Substring(1, location.Length - 1); } } else { if (getUrl.Substring(getUrl.Length - 1, 1) == "/") getUrl += location; else getUrl += "/" + location; } } retryTimes++; goto GotoAgen; } return html; } catch { return ""; } } /// /// 更新cookies /// /// /// /// private static string UpCookies(string old, string newc) { if (string.IsNullOrEmpty(old)) { return newc; } if (string.IsNullOrEmpty(newc)) { return old; } int io = 0; old = old.Trim(); newc = newc.Trim(); string[] o = old.Split(';'); string[] n = newc.Split(';'); List c = new List(); for (int i = 0; i < o.Length; i++) { CoockiesValue cv = new CoockiesValue(); io = o[i].IndexOf("="); if (io > -1) { cv.Title = o[i].Substring(0, io).Trim(); cv.Value = o[i].Substring(io + 1, o[i].Length - io - 1).Trim(); } else { if (!string.IsNullOrEmpty(o[i])) cv.Title = o[i].Trim(); } if (!string.IsNullOrEmpty(cv.Title)) c.Add(cv); } for (int i = 0; i < n.Length; i++) { CoockiesValue cv = new CoockiesValue(); io = o[i].IndexOf("="); if (io > -1) { cv.Title = o[i].Substring(0, io).Trim(); cv.Value = o[i].Substring(io + 1, o[i].Length - io - 1).Trim(); } else { if (!string.IsNullOrEmpty(o[i])) cv.Title = o[i].Trim(); } if (!string.IsNullOrEmpty(cv.Title)) { bool isHad = false; for (int j = 0; j < c.Count; j++) { if (cv.Title == c[j].Title) { c[j].Value = cv.Value; isHad = true; break; } } if (!isHad) c.Add(cv); } } string temp = ""; for (int i = 0; i < c.Count; i++) { if (string.IsNullOrEmpty(c[i].Value)) temp += c[i].Title + "; "; else temp += c[i].Title + "=" + c[i].Value + "; "; } return temp; } /// /// cookies值 /// public class CoockiesValue { /// /// 名称 /// public string Title { get; set; } /// /// 值 /// public string Value { get; set; } } /// /// 模拟百度蜘蛛下载页面 /// /// /// public static string ByBaidu(string url, string userAgent) { if (string.IsNullOrEmpty(url)) { return ""; } try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.Accept = "*/*"; request.Headers.Add("Accept-Language", "zh-CN"); request.Headers.Add("Accept-Encoding", "gzip,deflate"); request.UserAgent = userAgent; request.AllowAutoRedirect = false; request.Timeout = 10000; request.ReadWriteTimeout = 10000; request.Proxy = null; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream receiveStream = response.GetResponseStream(); MemoryStream ms = new MemoryStream(); int num = 0; byte[] buffer = new byte[0x400]; do { num = receiveStream.Read(buffer, 0, buffer.Length); if (num > 0) ms.Write(buffer, 0, num); } while (num > 0); byte[] b = ms.ToArray(); ms.Close(); b = ZipHelper.Decompress(b); string contentType = response.Headers["Content-Type"]; string html = ""; if (!string.IsNullOrEmpty(contentType)) { string c = GetRegexString(contentType, "charset\\s*=\\s*(\\S+)").Trim(); if (!string.IsNullOrEmpty(c)) html = Encoding.GetEncoding(c).GetString(b); } if (string.IsNullOrEmpty(html)) { html = Encoding.GetEncoding("UTF-8").GetString(b); string r = @"]*?charset=[""']*([\w-]+)[""']*"; string c = GetRegexString(html.ToLower(), r); if (c.IndexOf("'") > -1) c = c.Substring(0, c.IndexOf("'")); if (c.IndexOf("\"") > -1) c = c.Substring(0, c.IndexOf("\"")); if (c.IndexOf(" ") > -1) c = c.Substring(0, c.IndexOf(" ")); if (c.IndexOf(">") > -1) c = c.Substring(0, c.IndexOf(">")); if (c.ToLower() != "utf-8" && !string.IsNullOrEmpty(c)) html = Encoding.GetEncoding(c).GetString(b); else if (string.IsNullOrEmpty(c)) html = Encoding.GetEncoding("gbk").GetString(b); } if (!string.IsNullOrEmpty(html)) { if (html.Substring(0, 1) == "锘") html = Encoding.GetEncoding("UTF-8").GetString(b); //if (html.Contains("�") && (html.Length - html.Replace("�", "").Length > 3)) // html = Encoding.GetEncoding("gbk").GetString(b); } return html; } catch (Exception e) { return e.Message; } } /// /// 返回单个正则分析结果 /// /// /// /// public static string GetRegexString(string HtmlString, string RegexString) { MatchCollection mc = Regex.Matches(HtmlString, RegexString, RegexOptions.IgnoreCase); if (mc.Count > 0) return mc[0].Groups[1].ToString(); return ""; } /// /// Gbk 下载页面 /// /// /// public static string Gbk(string url) { if (string.IsNullOrEmpty(url)) return ""; try { WebClientx web = new WebClientx(); web.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); web.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); web.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"); web.Proxy = null; byte[] b = web.DownloadData(url); return Encoding.GetEncoding("gbk").GetString(b); } catch { return ""; } } /// /// post 数据 /// /// /// /// public static string PostUtf8(string url, StringBuilder postData) { try { WebClientx wc = new WebClientx(); byte[] sendData = Encoding.GetEncoding("utf-8").GetBytes(postData.ToString()); wc.Headers.Add("ContentLength", sendData.Length.ToString()); wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); wc.Proxy = null; return Encoding.UTF8.GetString(wc.UploadData(url, "POST", sendData)); } catch { return ""; } } /// /// post 数据 /// /// /// /// public static string PostUtf8(string url, byte[] byteData, int time) { WebClientx webClient = new WebClientx(); try { webClient.Timeout = time; webClient.Headers.Add("Accept-Encoding", "gzip,deflate"); webClient.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)"); webClient.Proxy = null; byte[] b = webClient.UploadData(url, byteData); string contentType = webClient.ResponseHeaders["Content-Type"]; webClient.Dispose(); webClient = null; string html = ""; if (!string.IsNullOrEmpty(contentType)) { string c = BaseRegex.GetMatchRegexString(contentType, "charset\\s*=\\s*(\\S+)"); if (!string.IsNullOrEmpty(c)) { c = c.Trim(); html = Encoding.GetEncoding(c).GetString(b); } } if (string.IsNullOrEmpty(html)) { html = Encoding.GetEncoding("UTF-8").GetString(b); string r = @"<\s*meta.+charset\s*=\s*[""']*(\S+)[""'\s>]*"; string temp = BaseRegex.GetMatchRegexString(html.ToLower(), r); if (string.IsNullOrEmpty(temp)) return html; string c = temp.Trim(); if (c.IndexOf("'") > -1) c = c.Substring(0, c.IndexOf("'")); if (c.IndexOf("\"") > -1) c = c.Substring(0, c.IndexOf("\"")); if (c.IndexOf(" ") > -1) c = c.Substring(0, c.IndexOf(" ")); if (c.IndexOf(">") > -1) c = c.Substring(0, c.IndexOf(">")); if (!string.IsNullOrEmpty(c) && c.ToLower() != "utf-8") html = Encoding.GetEncoding(c).GetString(b); } return html; } catch { return ""; } } /// /// 浏览器标识 /// public static string UserAgent = @"Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/57.0.2987.133+Safari/537.36 Mozilla/5.0+(Windows+NT+6.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/57.0.2987.133+Safari/537.36 Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/54.0.2840.99+Safari/537.36 Mozilla/5.0+(Windows+NT+5.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/31.0.1650.63+Safari/537.36 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.1;+Win64;+x64;+Trident/5.0) Mozilla/5.0+(Windows+NT+5.1)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36 Mozilla/5.0+(Windows+NT+6.3;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko Mozilla/5.0+(Windows+NT+10.0;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/57.0.2987.133+Safari/537.36 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.1;+WOW64;+Trident/5.0) Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/57.0.2987.133+Safari/537.36 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.1+(KHTML,+like+Gecko)+Chrome/21.0.1180.89+Safari/537.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/45.0.2454.101+Safari/537.36 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2372.400 QQBrowser/9.5.10548.400"; public static async Task PostJsonAsync(string url, object postData, int timeOut = 0) { return await PostUtf8Async(url, JsonHelper.SerializeObject(postData), contentType: "application/json", timeOut: timeOut); } public static async Task PostJsonAsync(string url, string postData, int timeOut = 0) { return await PostUtf8Async(url, postData, contentType: "application/json", timeOut: timeOut); } public static string PostJson(string url, object postData, int timeOut = -1) { return PostUtf8(url, JsonHelper.SerializeObject(postData), contentType: "application/json", timeOut: timeOut); } public static string PostJson(string url, string postData, int timeOut = -1) { return PostUtf8(url, postData, contentType: "application/json", timeOut: timeOut); } /// /// post 数据 /// /// /// /// public static string PostUtf8(string url, string postData, string contentType = "", int timeOut = -1) { HttpWebResponse response = null; string result; try { HttpWebRequest request; request = (HttpWebRequest)WebRequest.Create(url); request.KeepAlive = true; request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; if (!string.IsNullOrEmpty(contentType)) request.ContentType = contentType; //request.Headers.Add("sec-ch-ua", @"""Not(A:Brand"";v=""8"", ""Chromium"";v=""144"", ""Google Chrome"";v=""144"""); //request.Headers.Add("sec-ch-ua-mobile", @"?0"); //request.Headers.Add("sec-ch-ua-platform", @"""Windows"""); //request.Headers.Add("Upgrade-Insecure-Requests", @"1"); //request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36"; //request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; request.Accept = "*/*"; if (timeOut == -1) { request.Timeout = BaseClass.TimeOut * 1000; request.ReadWriteTimeout = BaseClass.TimeOut * 1000; } else { request.Timeout = timeOut * 1000; request.ReadWriteTimeout = timeOut * 1000; } //request.Headers.Add("Sec-Fetch-Site", @"none"); //request.Headers.Add("Sec-Fetch-Mode", @"navigate"); //request.Headers.Add("Sec-Fetch-User", @"?1"); //request.Headers.Add("Sec-Fetch-Dest", @"document"); request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); request.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9"); request.AllowAutoRedirect = false; request.Proxy = null; request.Method = "POST"; request.ServicePoint.Expect100Continue = false; string body = postData; byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body); request.ContentLength = postBytes.Length; Stream stream = request.GetRequestStream(); stream.Write(postBytes, 0, postBytes.Length); stream.Close(); response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { response = (HttpWebResponse)ex.Response; result = ReadResponse(response); return result; } else return ex.Message; } catch (Exception e) { if (response != null) response.Close(); return e.Message; } result = ReadResponse(response); return result; ////return PostUtf8(url, Encoding.UTF8.GetBytes(postData)); ////bool isError = false; //string[] l = UserAgent.Split('\n'); //try //{ // string codeType = "utf-8"; // HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); // request.UserAgent = l[new Random(Guid.NewGuid().GetHashCode()).Next(l.Length)].Trim(); // byte[] byteData = Encoding.GetEncoding(codeType).GetBytes(postData); // request.Method = "POST"; // request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; // if (timeOut == -1) // { // request.Timeout = BaseClass.TimeOut * 1000; // request.ReadWriteTimeout = BaseClass.TimeOut * 1000; // } // else // { // request.Timeout = timeOut * 1000; // request.ReadWriteTimeout = timeOut * 1000; // } // request.Proxy = null; // request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); // request.ContentType = "application/x-www-form-urlencoded; charset=" + codeType; // if (!string.IsNullOrEmpty(contentType)) // { // request.ContentType = contentType; // } // request.ContentLength = byteData.Length; // request.Referer = url; // request.CookieContainer = new CookieContainer(); // request.AllowAutoRedirect = false; // using (Stream requestStream = request.GetRequestStream()) // { // requestStream.Write(byteData, 0, byteData.Length); // } // HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Stream receiveStream = response.GetResponseStream(); // StreamReader readStream = new StreamReader(receiveStream, Encoding.GetEncoding(codeType)); // //string data = readStream.ReadToEnd().Trim(); // //if (string.IsNullOrEmpty(data)) // //{ // // return "{\"code\": 400,\"data\": []}"; // //} // //return data; // return ReadResponse(response); //} //catch (Exception e) //{ // //LogSave.Add(url + "---------" + e.ToString()); // //if (!isError) // //{ // // isError = true; // // goto reTry; // //} // return "{\"code\": 400,\"msg\":\"" + e.Message + "\"}"; //} } public static async Task PostUtf8Async(string url, string postData, string contentType = "", int timeOut = -1) { HttpWebResponse response = null; string result; try { HttpWebRequest request; request = (HttpWebRequest)WebRequest.Create(url); request.KeepAlive = true; request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; request.Headers.Add("sec-ch-ua", @"""Not(A:Brand"";v=""8"", ""Chromium"";v=""144"", ""Google Chrome"";v=""144"""); request.Headers.Add("sec-ch-ua-mobile", @"?0"); request.Headers.Add("sec-ch-ua-platform", @"""Windows"""); request.Headers.Add("Upgrade-Insecure-Requests", @"1"); request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"; request.Headers.Add("Sec-Fetch-Site", @"none"); request.Headers.Add("Sec-Fetch-Mode", @"navigate"); request.Headers.Add("Sec-Fetch-User", @"?1"); request.Headers.Add("Sec-Fetch-Dest", @"document"); request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate"); request.Headers.Set(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.9"); request.Method = "POST"; request.ServicePoint.Expect100Continue = false; if (!string.IsNullOrEmpty(contentType)) { request.ContentType = contentType; } string body = postData; byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body); request.ContentLength = postBytes.Length; Stream stream = request.GetRequestStream(); stream.Write(postBytes, 0, postBytes.Length); stream.Close(); response = (HttpWebResponse)await request.GetResponseAsync(); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { response = (HttpWebResponse)ex.Response; result = ReadResponse(response); return result; } else return ex.Message; } catch (Exception e) { if (response != null) response.Close(); return e.Message; } result = ReadResponse(response); return result; } /// /// post 数据 /// /// /// /// public static string PostUtf8(string url, byte[] byteData) { WebClientx webClient = new WebClientx(); try { webClient.Timeout = 70; webClient.Headers.Add("Accept-Encoding", "gzip,deflate"); webClient.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)"); webClient.Proxy = null; byte[] b = webClient.UploadData(url, byteData); string contentType = webClient.ResponseHeaders["Content-Type"]; webClient.Dispose(); webClient = null; string html = ""; if (!string.IsNullOrEmpty(contentType)) { string c = BaseRegex.GetMatchRegexString(contentType, "charset\\s*=\\s*(\\S+)"); if (!string.IsNullOrEmpty(c)) { c = c.Trim(); html = Encoding.GetEncoding(c).GetString(b); } } if (string.IsNullOrEmpty(html)) { html = Encoding.GetEncoding("UTF-8").GetString(b); string r = @"<\s*meta.+charset\s*=\s*[""']*(\S+)[""'\s>]*"; string temp = BaseRegex.GetMatchRegexString(html.ToLower(), r); if (string.IsNullOrEmpty(temp)) return html; string c = temp.Trim(); if (c.IndexOf("'") > -1) c = c.Substring(0, c.IndexOf("'")); if (c.IndexOf("\"") > -1) c = c.Substring(0, c.IndexOf("\"")); if (c.IndexOf(" ") > -1) c = c.Substring(0, c.IndexOf(" ")); if (c.IndexOf(">") > -1) c = c.Substring(0, c.IndexOf(">")); if (!string.IsNullOrEmpty(c) && c.ToLower() != "utf-8") html = Encoding.GetEncoding(c).GetString(b); } return html; } catch { return ""; } } /// /// post 数据 /// /// /// /// public static string PostUtf8ForOplb(string url, string postData, string verifyAuthToken) { //return PostUtf8(url, Encoding.UTF8.GetBytes(postData)); bool isError = false; string[] l = UserAgent.Split('\n'); reTry: try { string codeType = "utf-8"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.UserAgent = l[new Random(Guid.NewGuid().GetHashCode()).Next(l.Length)].Trim(); byte[] byteData = Encoding.GetEncoding(codeType).GetBytes(postData); request.Method = "POST"; request.Headers.Add("X-PDD-VerifyAuthToken", verifyAuthToken); request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.Timeout = BaseClass.TimeOut * 1000; request.ReadWriteTimeout = BaseClass.TimeOut * 1000; request.Proxy = null; request.ContentType = "application/x-www-form-urlencoded; charset=" + codeType; request.ContentLength = byteData.Length; request.Referer = url; request.CookieContainer = new CookieContainer(); request.AllowAutoRedirect = false; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(byteData, 0, byteData.Length); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream receiveStream = response.GetResponseStream(); StreamReader readStream = new StreamReader(receiveStream, Encoding.GetEncoding(codeType)); return readStream.ReadToEnd().Trim(); } catch (Exception e) { if (!isError) { isError = true; goto reTry; } return ""; } } /// /// POST读取详细 /// /// 提交地址 /// 提交数据 /// 代码 /// public static string PostData(string strUrl, string data, string codeType) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl); request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"; byte[] byteData = Encoding.GetEncoding(codeType).GetBytes(data); request.Method = "POST"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.Timeout = 10000; request.ReadWriteTimeout = 10000; request.ContentType = "application/x-www-form-urlencoded; charset=" + codeType; request.ContentLength = byteData.Length; request.Referer = strUrl; request.Proxy = null; request.CookieContainer = new CookieContainer(); request.AllowAutoRedirect = false; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(byteData, 0, byteData.Length); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream receiveStream = response.GetResponseStream(); StreamReader readStream = new StreamReader(receiveStream, Encoding.GetEncoding(codeType)); return readStream.ReadToEnd(); } catch { return ""; } } /// /// POST读取详细 /// /// 提交地址 /// 提交数据 /// 浏览器头 /// public static string GetUtf8(string strUrl, string userAgen) { try { WebClientx web = new WebClientx(); web.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); web.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); web.Headers.Add("User-Agent", userAgen); web.Proxy = null; byte[] b = web.DownloadData(strUrl); return Encoding.UTF8.GetString(b); } catch { return ""; } } /// /// URL GB2312转码 /// /// /// public static string UrlEncodeGb2312(string IndexKey) { if (string.IsNullOrEmpty(IndexKey)) return ""; return HttpUtility.UrlEncode(IndexKey, Encoding.GetEncoding("GB2312")); byte[] sarr = Encoding.GetEncoding("gb2312").GetBytes(IndexKey); IndexKey = ""; for (int i = 0; i < sarr.Length; i++) { IndexKey += "%"; IndexKey += sarr[i].ToString("X2"); } return IndexKey; } /// /// URL UTF-8转码 /// /// /// public static string UrlEncodeUtf8(string IndexKey) { if (string.IsNullOrEmpty(IndexKey)) return ""; return HttpUtility.UrlEncode(IndexKey, Encoding.UTF8); byte[] sarr = System.Text.Encoding.UTF8.GetBytes(IndexKey); IndexKey = ""; for (int i = 0; i < sarr.Length; i++) { IndexKey += "%"; IndexKey += sarr[i].ToString("X2"); } return IndexKey; } /// /// 用IE打开网址 /// /// public static void OpenUrl(string url) { try { //if (url.Contains("http")) // Process.Start("iexplore.exe", url); //else Process.Start(url); } catch { } } /// /// 下载文件 /// /// 下载地址 /// 保存目录 /// public static bool DownloadFile(string Urlstring, string FilePath) { try { WebClientx mywebclient = new WebClientx(); mywebclient.Proxy = null; if (File.Exists(FilePath)) File.Delete(FilePath); mywebclient.DownloadFile(Urlstring, FilePath); return true; } catch { return false; } } /// /// 下载文件 /// /// 下载地址 /// 保存目录 /// public static bool DownloadFile(string Urlstring, out byte[] b) { b = new byte[0]; int times = 0; Next: try { WebClientx mywebclient = new WebClientx(); b = mywebclient.DownloadData(Urlstring); return true; } catch { if (times < 4) { times++; Thread.Sleep(3000); goto Next; } return false; } } /// /// 读取网址,兼容https,兼容任意编码 /// /// /// public static string GetUrl(string url) { WebClientx webClient = new WebClientx(); try { webClient.Timeout = 30; webClient.Headers.Add("Accept-Encoding", "gzip,deflate"); webClient.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)"); webClient.Proxy = null; byte[] b = webClient.DownloadData(url); b = ZipHelper.Decompress(b); string contentType = webClient.ResponseHeaders["Content-Type"]; webClient.Dispose(); webClient = null; string html = ""; if (!string.IsNullOrEmpty(contentType)) { string c = BaseRegex.GetMatchRegexString(contentType, "charset\\s*=\\s*(\\S+)"); if (!string.IsNullOrEmpty(c)) { c = c.Trim(); html = Encoding.GetEncoding(c).GetString(b); } } if (string.IsNullOrEmpty(html)) { html = Encoding.GetEncoding("UTF-8").GetString(b); string r = @"<\s*meta.+charset\s*=\s*[""']*(\S+)[""'\s>]*"; string c = BaseRegex.GetMatchRegexString(html.ToLower(), r).Trim(); if (c.IndexOf("'") > -1) c = c.Substring(0, c.IndexOf("'")); if (c.IndexOf("\"") > -1) c = c.Substring(0, c.IndexOf("\"")); if (c.IndexOf(" ") > -1) c = c.Substring(0, c.IndexOf(" ")); if (c.IndexOf(">") > -1) c = c.Substring(0, c.IndexOf(">")); if (!string.IsNullOrEmpty(c) && c.ToLower() != "utf-8") html = Encoding.GetEncoding(c).GetString(b); } return html; } catch (Exception e) { LogSave.AddView(url + " 错误:" + e.Message.Replace("\r\n", " ")); return null; } finally { try { webClient.Dispose(); webClient = null; } catch { } } } /// /// 获取域名 /// /// /// public static string GetDomain(string url) { try { url = url.ToLower(); string temp = BaseRegex.GetMatchRegexString(url, @"([a-z0-9-\.]+\.[a-z]{2,8})"); if (!string.IsNullOrEmpty(temp) && temp.Length > 1 && (temp.Substring(0, 1) == "." || temp.Substring(0, 1) == "-")) return null; if (!string.IsNullOrEmpty(temp)) return temp; if (url.Contains("//") && url.IndexOf("//") + 2 < url.Length) url = url.Substring(url.IndexOf("//") + 2, url.Length - url.IndexOf("//") - 2); if (url.Contains("/") && url.IndexOf("/") > 0) url = url.Substring(0, url.IndexOf("/")); return url; } catch { return null; } } /// /// 获取域名&ip /// /// /// public static string GetDomainIp(string url) { if (string.IsNullOrEmpty(url)) return null; url = url.ToLower(); string temp = BaseRegex.GetMatchRegexString(url, @"http[s]{0,1}://([a-z0-9-\.]+\.[a-z]{2,8}|[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3})"); if (!string.IsNullOrEmpty(temp) && temp.Length > 1 && (temp.Substring(0, 1) == "." || temp.Substring(0, 1) == "-")) return null; if (!string.IsNullOrEmpty(temp)) return temp; return null; } /// /// 解析域名ip /// /// /// public static string GetIp(string domain) { try { for (int i = 0; i < 2; i++) { IPAddress[] aryIP = Dns.GetHostEntry(domain).AddressList; if (aryIP.Length > 0) return aryIP[0].ToString(); Thread.Sleep(1000); //重试,防止DNS缓存 } return null; } catch { //SocketServer.ViewCode += "域名:" + domain + "无法解析\r\n"; return null; } } /// /// 是否是域名 /// /// /// public static bool IsDomain(string domain) { string temp = BaseRegex.GetMatchRegexString(domain, @"([a-z0-9-\.]+\.[a-z]{2,8})"); if (!string.IsNullOrEmpty(temp) && temp.Length > 1 && (temp.Substring(0, 1) == "." || temp.Substring(0, 1) == "-")) return false; if (temp == domain) return true; return false; } /// /// 获取顶级域名 /// /// /// public static string GetMainDomain(string domain) { if (string.IsNullOrEmpty(domain)) return ""; domain = domain.ToLower(); if (!domain.Contains(".") || domain.Length < 4) return ""; string[] d = domain.Split('.'); string main = d[d.Length - 2] + "." + d[d.Length - 1]; //原始域名 if (d.Length > 2 && (d[d.Length - 2] == "com" || d[d.Length - 2] == "net" || d[d.Length - 2] == "org" || d[d.Length - 2] == "gov" || d[d.Length - 2] == "edu" || d[d.Length - 2] == "co")) main = d[d.Length - 3] + "." + main; return main; } /// /// 解密Jsion /// /// /// public static string Decode(string s) { s = WebUtility.HtmlDecode(s); Regex reUnicode = new Regex(@"\\u([0-9a-fA-F]{4})", RegexOptions.Compiled); return reUnicode.Replace(s, m => { short c; if (short.TryParse(m.Groups[1].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out c)) { return "" + (char)c; } return m.Value; }); } #region 解码 /// /// 解码 /// /// /// public static string DecodeString(string code) { try { string code1 = code.Trim().Replace("_1/", "c") .Replace("_2/", "Y") .Replace("_3/", "A") .Replace("_4/", "Z") .Replace("_5/", "h") .Replace("_6/", "n") .Replace("_7/", "I") .Replace("_8/", "l") .Replace("_9/", "t") .Replace("_10/", "e") .Replace("_11/", "K") .Replace("_12/", "r") .Replace("_13/", "o") .Replace("_14/", "q") .Replace("_15/", "W") .Replace("_16/", "+") .Replace("_17/", "H") .Replace("_18/", "m") .Replace("_19/", "F") .Replace("_20/", "x") .Replace("_21/", "v") .Replace("_22/", "B") .Replace("_23/", "=") .Replace("\0_0/", "_"); byte[] inArray = Convert.FromBase64String(code1); string html = Encoding.UTF8.GetString(inArray); //html = // html.Replace("_1_", "=") // .Replace("_2_", "?") // .Replace("_3_", "/") // .Replace("_4_", ".") // .Replace("_5_", "&") // .Replace("_6_", "<") // .Replace("_7_", ">") // .Replace("_8_", "'") // .Replace("_9_", "\"") // .Replace("0_0", "_"); //html = html.Replace("_9=4_00", "\"1.00").Replace("_9?4_00", "\"1.00").Replace("_9/4_00", "\"1.00"); return html; } catch (Exception e) { //LogSave.Add("解码数据错误:" + code); return "解码数据错误:" + e.Message; } } #endregion /// /// 获取国内IP /// /// public static string ProxyIpIn() { if (BaseClass.ProxyIn.Count == 0) return ""; Random ra = new Random(Guid.NewGuid().GetHashCode()); return BaseClass.ProxyIn[ra.Next(BaseClass.ProxyIn.Count)]; } /// /// 获取美国IP /// /// public static string ProxyIpOut() { if (BaseClass.ProxyOut.Count == 0) return ""; Random ra = new Random(Guid.NewGuid().GetHashCode()); return BaseClass.ProxyOut[ra.Next(BaseClass.ProxyOut.Count)]; } /// /// 获取国内IP代理URL地址 /// /// public static string ProxyIpInUrl(string url) { if (BaseClass.ProxyIn.Count == 0) return url; Random ra = new Random(Guid.NewGuid().GetHashCode()); string ip = BaseClass.ProxyIn[ra.Next(BaseClass.ProxyIn.Count)]; return "http://" + ip + ":6000/url=" + ReplaceUrl(url); } /// /// 获取美国IP代理URL地址 /// /// public static string ProxyIpOutUrl(string url) { if (BaseClass.ProxyOut.Count == 0) return url; Random ra = new Random(Guid.NewGuid().GetHashCode()); string ip = BaseClass.ProxyOut[ra.Next(BaseClass.ProxyOut.Count)]; return "http://" + ip + ":6000/url=" + ReplaceUrl(url); } /// /// 替换链接,防止防火墙 /// /// /// public static string ReplaceUrl(string url) { if (string.IsNullOrEmpty(url)) return ""; string newurl = ""; string[] l = url.Split('.'); for (int i = 0; i < l.Length; i++) { if (l[i].Length > 2) newurl += l[i].Substring(0, l[i].Length - 2) + "***ooo***" + l[i].Substring(l[i].Length - 2, 2); else newurl += l[i]; if (i < l.Length - 1) newurl += "."; } return newurl.Replace(".google.", ".goo00gle.").Replace("?", "%3f").Replace("=", "%3d").Replace("&", "%26"); } /// /// 还原链接 /// /// /// public static string ReplaceUrlBak(string url) { if (string.IsNullOrEmpty(url)) return ""; string newurl = url.Replace("***ooo***", ""); if (string.IsNullOrEmpty(newurl)) return ""; return newurl.Replace(".goo00gle.", ".google.").Replace("%3f", "?").Replace("%3d", "=").Replace("%26", "&"); } /// /// 生成URL绝对地址 /// /// 新URL /// 源地址 /// public static string BuildUrl(string url, string oldurl) { if (string.IsNullOrEmpty(url)) return oldurl; if (url.Contains("tencent:/")) return url; if (url.Length > 8 && url.Substring(0, 8).Contains("://")) { if (url.Length - url.Replace("/", "").Length == 2) url += "/"; return url; } string homeurl = BaseRegex.GetMatchRegexString(oldurl.ToLower(), "(http://[^/]*?)/"); if (string.IsNullOrEmpty(homeurl)) { homeurl = BaseRegex.GetMatchRegexString(oldurl.ToLower(), "(http://[^/]+)") + "/"; if (string.IsNullOrEmpty(homeurl)) { //BaseClass.ViewCode += "网址:" + oldurl + "识别失败\r\n"; return url; } } if (url.Substring(0, 1) == "/") { string newurlx = homeurl + url; newurlx = newurlx.Replace("//", "/").Replace("http:/", "http://"); return newurlx; } string[] l = oldurl.Split('/'); int cute = l.Length; if (l.Length > 3) cute--; while (url.Contains("../")) { int s = url.IndexOf("../"); if (s == 0) url = url.Substring(3); else url = url.Substring(0, s) + url.Substring(s + 3); cute--; if (cute < 3) cute = 3; } string newurl = ""; for (int i = 0; i < cute; i++) newurl += l[i] + "/"; newurl = newurl + url; return newurl.Replace("//", "/").Replace("http:/", "http://").Replace("/./", "/"); } /// /// 获取代理地址 /// /// /// public static string GetProxyUrl(string url) { if (string.IsNullOrEmpty(url)) return null; if (BaseClass.Proxy.Count == 0) { BaseClass.ViewCode += "代理异常"; return url; } Random ra = new Random(); string p = BaseClass.Proxy[ra.Next(BaseClass.Proxy.Count)]; return "http://" + p + "/url=" + url.Replace(".google.", ".goo00gle.") .Replace("?", "%3f").Replace("=", "%3d").Replace("&", "%26"); } public static string GetUrlCodex(string url) { WebClientx webClient = new WebClientx(); try { webClient.Timeout = 30; webClient.Headers.Add("Accept-Encoding", "gzip,deflate"); webClient.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)"); webClient.Proxy = null; byte[] b = webClient.DownloadData(url); b = ZipHelper.Decompress(b); string contentType = webClient.ResponseHeaders["Content-Type"]; //webClient.Dispose(); //webClient = null; string html = ""; if (!String.IsNullOrEmpty(contentType)) { string c = BaseRegex.GetMatchRegexString(contentType, "charset\\s*=\\s*(\\S+)"); if (!String.IsNullOrEmpty(c)) { c = c.Trim(); html = Encoding.GetEncoding(c).GetString(b); } } if (String.IsNullOrEmpty(html)) { html = Encoding.GetEncoding("UTF-8").GetString(b); //string r = @"<\s*meta.+charset\s*=\s*[""']*(\S+)[""'\s>]*"; //string c = BaseRegex.GetMatchRegexString(html.ToLower(), r).Trim(); //if (c.IndexOf("'") > -1) // c = c.Substring(0, c.IndexOf("'")); //if (c.IndexOf("\"") > -1) // c = c.Substring(0, c.IndexOf("\"")); //if (c.IndexOf(" ") > -1) // c = c.Substring(0, c.IndexOf(" ")); //if (c.IndexOf(">") > -1) // c = c.Substring(0, c.IndexOf(">")); //if (!String.IsNullOrEmpty(c) && c.ToLower() != "utf-8") // html = Encoding.GetEncoding(c).GetString(b); } return html; } catch (Exception e) { LogSave.AddView(url + " 错误:" + e.Message.Replace("\r\n", " ")); return null; } finally { try { webClient.Dispose(); webClient = null; } catch { } } } #region DES加密 | 解密 //加解密密钥 private static string skey = "AFZ94w3a"; #region DESEnCode DES加密 public static string DESEnCode(string pToEncrypt) { try { //pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt); des.Key = ASCIIEncoding.ASCII.GetBytes(skey); des.IV = ASCIIEncoding.ASCII.GetBytes(skey); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}", b); } ret.ToString(); return ret.ToString(); } catch (Exception e) { //throw; } return ""; } #endregion #region DESDeCode DES解密 public static string DESDeCode(string pToDecrypt) { try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = new byte[pToDecrypt.Length / 2]; for (int x = 0; x < pToDecrypt.Length / 2; x++) { int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)); inputByteArray[x] = (byte)i; } des.Key = ASCIIEncoding.ASCII.GetBytes(skey); des.IV = ASCIIEncoding.ASCII.GetBytes(skey); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); return System.Text.Encoding.Default.GetString(ms.ToArray()); } catch (Exception e) { //throw; } return ""; } #endregion #endregion /// /// 字符串转Unicode /// /// 源字符串 /// Unicode编码后的字符串 public static string String2Unicode(string source) { var bytes = Encoding.Unicode.GetBytes(source); var stringBuilder = new StringBuilder(); for (var i = 0; i < bytes.Length; i += 2) { stringBuilder.AppendFormat("\\u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0')); } return stringBuilder.ToString(); } /// /// Unicode转字符串 /// /// 经过Unicode编码的字符串 /// 正常字符串 public static string Unicode2String(string source) { return new Regex(@"\\u([0-9A-F]{4})", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace(source, x => Convert.ToChar(Convert.ToUInt16(x.Result("$1"), 16)).ToString()); } } }