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();
        }
예제 #5
0
        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;
            }
        }
예제 #6
0
 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); }
     }
 }
예제 #7
0
        //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);
                        }
                    }
                }
            }
        }