public async Task OnRequest(object sender, SessionEventArgs e) { if (e.WebSession.Request.Url.Contains("music.163.com/eapi/song/enhance") || e.WebSession.Request.Url.Contains("music.163.com/eapi/song/like")) { Console.WriteLine("从代理服务器获取:" + e.WebSession.Request.Url); var proxy = proxySelector.GetTop(); var st = new Stopwatch(); st.Start(); try { byte[] ret = null; using (var wc = new ImpatientWebClient()) { wc.Proxy = new WebProxy(proxy.host, proxy.port); foreach (var aheader in e.WebSession.Request.RequestHeaders) { var str = aheader.Name.ToLower(); if (str == "host" || str == "content-length" || str == "accept" || str == "user-agent" || str == "connection") { continue; } wc.Headers.Add(aheader.Name, aheader.Value); } ret = wc.UploadData(e.WebSession.Request.Url.Replace("https://", "http://"), await e.GetRequestBody()); } st.Stop(); await e.Ok(ret); Console.WriteLine("修改完成,用时 " + st.ElapsedMilliseconds + " ms"); } catch (Exception ex) { Console.WriteLine(ex); } } }
public void UpdateList() { var newProxies = new List <Proxy>(); var ret = ""; using (var wc = new ImpatientWebClient()) ret = wc.DownloadString("https://cn-proxy.com/"); var trs = Regex.Matches(ret, "<tr>(.*?)<\\/tr>", RegexOptions.Singleline); foreach (Match tr in trs) { var tds = Regex.Matches(tr.Groups[1].Value, "<td>(.*?)<\\/td>"); if (tds.Count > 2) { var host = tds[0].Groups[1].Value; if (Regex.IsMatch(host, @"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) { if (int.TryParse(tds[1].Groups[1].Value, out var port)) { newProxies.Add(new Proxy() { host = host, port = port, latency = int.MaxValue }); } } } } lock (this) Proxies = newProxies; }
public void UpdateList() { var newProxies = new List <Proxy>(); var ret = ""; using (var wc = new ImpatientWebClient()) ret = wc.DownloadString("http://cn-proxy.com/"); var tables = Regex.Matches(ret, "<table class=\"sortable\">.+?<tbody>(.*?)<\\/tbody>", RegexOptions.Singleline); var first = true; foreach (Match mat in tables) { if (first) { first = false; continue; } var trs = Regex.Matches(mat.Groups[1].Value, "<tr>(.*?)<\\/tr>", RegexOptions.Singleline); foreach (Match tr in trs) { var tds = Regex.Matches(tr.Groups[1].Value, "<td>(.*?)<\\/td>"); try { newProxies.Add(new Proxy() { host = tds[0].Groups[1].Value, port = int.Parse(tds[1].Groups[1].Value), latency = int.MaxValue }); } catch (Exception) { } } } lock (this) Proxies = newProxies; }
public void UpdateLatency() { var newProxies = Proxies.Select(p => new Proxy { host = p.host, port = p.port }).ToList(); var actions = new List <Action>(); foreach (var proxy in newProxies) { actions.Add(() => { var latency = int.MaxValue; try { using (var wc = new ImpatientWebClient(ProxyTestTimeout)) { wc.Proxy = new WebProxy(proxy.host, proxy.port); var sw = new Stopwatch(); sw.Start(); var ret = wc.DownloadString("https://music.163.com/about"); sw.Stop(); if (ret.Contains("music.126")) { latency = (int)sw.ElapsedMilliseconds; } } lock (this) { proxy.latency = latency; proxy.valid = latency != int.MaxValue; } Console.WriteLine("{0}: OK", proxy); } catch (Exception e) { Console.WriteLine("{0}: {1}", proxy, e.Message); } }); } Parallel.Invoke(new ParallelOptions { MaxDegreeOfParallelism = parallelism }, actions.ToArray()); newProxies = newProxies.Where(p => p.valid).OrderBy(p => p.latency).ToList(); Console.WriteLine("Available proxies: "); newProxies.ForEach(p => Console.WriteLine(p)); lock (this) Proxies = newProxies.Where(p => p.valid).OrderBy(p => p.latency).ToList(); }
public void UpdateLatency() { var tasks = new List <Task>(); List <Proxy> newProxies; lock (this) { newProxies = Proxies.Select(item => new Proxy { host = item.host, port = item.port, latency = item.latency }).ToList(); } foreach (var proxy in newProxies) { tasks.Add(Task.Factory.StartNew(() => { var latency = int.MaxValue; try { using (var wc = new ImpatientWebClient()) { wc.Proxy = new WebProxy(proxy.host, proxy.port); var sw = new Stopwatch(); sw.Start(); var ret = wc.DownloadString("http://music.163.com/about"); sw.Stop(); if (ret.Contains("music.126")) { latency = (int)sw.ElapsedMilliseconds; } } proxy.latency = latency; } catch (Exception) { } })); } Task.WaitAll(tasks.ToArray(), 5000); newProxies = newProxies.OrderBy(o => o.latency).ToList(); lock (this) { Proxies = newProxies; } }
public async Task OnRequest(object sender, SessionEventArgs e) { if (proxiedAddresses.Any(str => e.WebSession.Request.Url.Contains(str))) { Console.WriteLine("从代理服务器获取:" + e.WebSession.Request.Url); var proxy = proxySelector.GetTop(); var st = new Stopwatch(); st.Start(); try { using (var wc = new ImpatientWebClient()) { wc.Proxy = new WebProxy(proxy.host, proxy.port); foreach (var aheader in e.WebSession.Request.RequestHeaders) { var str = aheader.Name.ToLower(); if (skipRequestHeaders.Contains(str)) { continue; } wc.Headers.Add(aheader.Name, aheader.Value); } var body = wc.UploadData(e.WebSession.Request.Url, await e.GetRequestBody()); var headers = new Dictionary <string, HttpHeader>(); foreach (var key in wc.ResponseHeaders.AllKeys) { headers.Add(key, new HttpHeader(key, wc.ResponseHeaders[key])); } await e.Ok(body, headers); } st.Stop(); Console.WriteLine("修改完成,用时 " + st.ElapsedMilliseconds + " ms"); } catch (Exception ex) { Console.WriteLine(ex); } } }
//Modify response public async Task OnResponse(object sender, SessionEventArgs e) { //read response headers var responseHeaders = e.WebSession.Response.ResponseHeaders; if ((e.WebSession.Request.Method == "GET" || e.WebSession.Request.Method == "POST") && e.WebSession.Response.ResponseStatusCode == "200") { if (e.WebSession.Response.ContentType != null && e.WebSession.Response.ContentType.Trim().ToLower().Contains("text") || e.WebSession.Request.Url.StartsWith("http://music.163.com/eapi/song/enhance/player/url")) { if (e.WebSession.Request.Url.StartsWith("http://music.163.com/eapi/song/enhance/player/url")) { Console.WriteLine("从代理服务器获取歌曲地址"); var proxies = ps.GetTopProxies(1); var tasks = new List <Task <byte[]> >(); var st = new Stopwatch(); st.Start(); foreach (var proxy in proxies) { tasks.Add(Task <byte[]> .Factory.StartNew(() => { try { using (var wc = new ImpatientWebClient()) { wc.Proxy = new WebProxy(proxy.host, proxy.port); foreach (var aheader in head) { var str = aheader.Key.ToLower(); if (str == "host" || str == "content-length" || str == "accept" || str == "user-agent" || str == "connection") { continue; } wc.Headers.Add(aheader.Key, aheader.Value.Value); } var ret = wc.UploadData(e.WebSession.Request.Url, body); return(ret); } } catch (Exception) { } return(new byte[0]); })); } var idx = Task.WaitAny(tasks.ToArray()); st.Stop(); await e.SetResponseBody(tasks[idx].Result); Console.WriteLine("修改完成,用时 " + st.ElapsedMilliseconds + " ms"); } else if (e.WebSession.Request.Url.StartsWith("http://music.163.com/eapi/")) { var body = await e.GetResponseBodyAsString(); if (Regex.Match(body, "\"st\":-\\d+").Success) { Console.WriteLine("替换歌曲列表信息"); body = Regex.Replace(body, "\"st\":-\\d+", "\"st\":0"); body = body.Replace("\"pl\":0", "\"pl\":320000"); body = body.Replace("\"dl\":0", "\"dl\":320000"); await e.SetResponseBodyString(body); } } } } }