Selenium.Chrome相关配置及用法

一、全局配置

options.AddArgument("--no-sandbox");//不在沙盒中运行
options.AddArgument("--headless");//浏览器不提供可视化页面,桌面和状态栏都不会浏览器窗口,静默模式
options.AddArgument("--disable-dev-shm-usage");//克服资源有限的问题
options.AddArgument("--disable-images");//过滤掉图片加载,使页面加载更快
//关闭浏览器头部提示的正在被控制
options.AddExcludedArgument("enable-automation");
options.AddAdditionalCapability("useAutomationExtension", false);
//设置异步加载,异步加载就是不等页面加载完毕,只要页面上出现你所要的值,哪怕页面只渲染了20%,会马上拿到你指定的值,然后就可以进行下一个页面的爬去,速度惊人的快。如果不设置异步加载,经常是因为页面一个广告或图片或JS未加载完毕页面会一直转一直不会去拿你所要的值,而且很多时候还会超时,眼看着页面上有值但是就是拿不到的那种。
options.PageLoadStrategy = PageLoadStrategy.None;

二、页面打开时执行一段JS达到搞事情的目的。

using (driver = new OpenQA.Selenium.Chrome.ChromeDriver(options)){
((OpenQA.Selenium.Chrome.ChromeDriver)driver).ExecuteChromeCommand("Page.addScriptToEvaluateOnNewDocument", new Dictionary<string, object> { { "source", @"Object.defineProperty(navigator, 'webdriver', {
            get: () => false
        })" } });
  		。。。。。
}

这样子去设置js脚本会在页面的JS执行之前优先执行我们的JS,好多反爬虫的网站经常会进行一些检测,我们可以根据分析去做一些处理,使其检测失效。

三、使用代理

在chrome里面使用带用户名和密码的代理,需要使用插件去实现,看一下google插件的文档,其实还是挺好实现的。给一段生成插件的代码:

/// <summary>
/// 生成插件
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <param name="userName"></param>
/// <param name="passWord"></param>
public void GeneratePlug(string ip="",string port="",string userName="",string passWord="") {
    try{
        string FileName = Path.GetDirectoryName(Application.ExecutablePath) + "\\proxy.zip";
        string BackGroundJs = @"var config = {
                                mode: 'fixed_servers',
                                rules: {
                                  singleProxy: {
                                    scheme: 'http',
                                    host: 'mimvp_proxy_host',
                                    port: parseInt(mimvp_proxy_port)
                                  },
                                  bypassList: ['{0}']
                                }
                              };
                            chrome.proxy.settings.set({value: config, scope: 'regular'}, function() {});
                            function callbackFn(details) {
                                return {
                                    authCredentials: {
                                        username: 'mimvp_username',
                                        password: 'mimvp_password'
                                    }
                                };
                            }
                            chrome.webRequest.onAuthRequired.addListener(
                                    callbackFn,
                                    {urls: ['<all_urls>']},
                                    ['blocking']
                            );".Replace("{0}", string.Join(",", Sites).Replace(",", "','"));
        string ManiFest = "{\"version\": \"1.0.0\",\"manifest_version\": 2,\"name\": \"Chrome Proxy\",\"permissions\": [\"proxy\",\"tabs\",\"unlimitedStorage\",\"storage\",\"<all_urls>\",\"webRequest\",\"webRequestBlocking\"],\"background\": {\"scripts\": [\"background.js\"]},\"minimum_chrome_version\":\"22.0.0\"}";
        BackGroundJs =BackGroundJs.Replace("mimvp_proxy_host", ip).Replace("mimvp_proxy_port", port).Replace("mimvp_username", userName).Replace("mimvp_password", passWord);
        List<MemoryStream> ms = new List<MemoryStream> {
            new MemoryStream(System.Text.Encoding.UTF8.GetBytes(BackGroundJs)),
            new MemoryStream(System.Text.Encoding.UTF8.GetBytes(ManiFest))
        };
        List<string> lt = new List<string> { "background.js", "manifest.json" };
        Compress(ms, lt, FileName);
    }
    catch (Exception ex) { }
}

插件生成完毕后需要

options.AddExtension(FileName);

这样的方式进行设置,FileName就是插件的文件地址。

完整的主程代码:

        public void Process(){
            //ChromeDriver检查更新
            UpdateChromeDriver();
            IWebDriver driver = null;
            try{
                CloseWindow();
                //代理初始化
                DataTable dt = DbHelperSQL_SR.GetDataTable("select t.ip,t.port,t.username,t.password from tproxy t WHERE t.status=1");
                if (dt != null && dt.Rows.Count > 0){
                    foreach (DataRow dr in dt.Rows){
                        Agents.Add(new Agent{
                            Ip = dr["ip"].ToString(),
                            Port = dr["port"].ToString(),
                            UserName = dr["username"].ToString(),
                            PassWord = dr["password"].ToString()
                        });
                    }
                }
                //物流初始化
                Dictionary<string, Func<TrackingEntity, IWebDriver, Tracking_Chrome.TrackingRet>> dic = new Dictionary<string, Func<TrackingEntity, IWebDriver, TrackingRet>> {
                    { "DPDUKN:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "DPD-red-EUR By Road:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "DPD-red-Two-Day.co:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "DPD-GB-A32-手机:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "DPD-red-Two-Day-手机:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "DPD-EU-A32-手机:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "DPDUK2:dpd.co,dpd.co.uk",(a,b)=>DPD_CO(a,b)},
                    { "ES-PE-2:correosexpress.com",(a,b)=>ES_PE_2(a,b)},
                    { "PL-DPD境外:dpd.de",(a,b)=>EU_DPD(a,b)},
                    { "EU_DPD:dpd.de",(a,b)=>EU_DPD(a,b)},
                    { "PL-DHL:51tracking.com",(a,b)=>Tracking51(a,b,"dhl-germany-tracking")},
                    { "DHLDE:51tracking.com",(a,b)=>Tracking51(a,b,"dhl-germany-tracking")},
                    { "DEGLS_EU:51tracking.com",(a,b)=>Tracking51(a,b,"gls-tracking")},
                    { "DEDHL:51tracking.com",(a,b)=>Tracking51(a,b,"dhl-germany-tracking")},
                    { "PL-DHL境外:51tracking.com",(a,b)=>Tracking51(a,b,"dhl-germany-tracking")},
                    { "DHL Paket:51tracking.com",(a,b)=>Tracking51(a,b,"dhl-germany-tracking")},
                    { "ES-SEUR-OVERSEA:seur.com",(a,b)=>SEUR(a,b)},
                    { "橙联:51tracking.com",(a,b)=>Tracking51(a,b,"orangeconnex-tracking")}
                };
                //站点初始化
                Sites = dic.Keys.ToList().Map(a =>{
                    return a.Split(':')[1];
                }).Distinct().ToList();
                List<string> lt_shipping_site = dic.Keys.ToList();
                WebAgentList = Sites.Map<string, WebAgent>(a =>{
                    return new WebAgent{
                        Site = a,
                        AgentList = Agents.Map(b =>{
                            return new Agent{
                                Ip = b.Ip,
                                Port = b.Port,
                                UserName = b.UserName,
                                PassWord = b.PassWord,
                                Available = 1
                            };
                        }).ToList()
                    };
                }).ToList();
                //获取数据 生成数据列表
                string Sql = string.Format(@"SELECT
                                        a.ID,
                                        a.Oid,
                                        a.TrackingNumber,
                                        a.ShippingServer,
                                        a.TrackingStatus,
                                        a.TrackingDate,
                                        a.PaidDate,
                                        a.PostalCode
                                        FROM tEBay_Trade a
                                        WHERE  a.IsEffective = 1 AND a.PaidDate > dateadd(DAY, -30, getdate()) AND isnull(TrackingNumber, '') <> ''
                                                AND ((isnull(a.TrackingStatus, '') not in ('Delivered','派送异常','包裹退回') and isnull(a.TrackingStatus, '') not like '%Delivered%') or (isnull(a.TrackingStatus,'') in('派送异常','包裹退回') and datediff(day,a.TrackingDate,getdate())<=10))
                                                AND (a.TrackingDate IS NULL OR datediff(HOUR, a.TrackingDate, getdate()) >= 4)
                                                    AND a.ShippingServer in('{0}') order by a.id desc", string.Join("','", dic.Keys.ToList().Map(a => { return a.Split(':')[0]; })));
                List<TrackingEntity> lt = ConverToListHelper<TrackingEntity>.ConvertToList(DbHelperSQL_SR.ExecuteDatatable(Sql));
                int Total = lt.Count;
                this.Invoke(new Action(() =>{
                    toolStripStatusLabel1.Text = string.Format("总数:{0}", Total);
                }));
                //数据按站点排序
                lt.Each(a =>{
                    string Site = lt_shipping_site.Find(b => b.Split(':')[0] == a.ShippingServer.Trim()).Split(':')[1];
                    a.Site = Site;
                });
                lt.OrderBy(a => a.Site);
                //根据数据列表依次抓取页面数据
                List<TrackingRet> Rets = new List<TrackingRet>();
                OpenQA.Selenium.Chrome.ChromeOptions options = new OpenQA.Selenium.Chrome.ChromeOptions();
                string UserDataDir = System.Configuration.ConfigurationSettings.AppSettings["UserDataDir"].ToString();
                options.AddArgument(string.Format("--user-data-dir={0}", UserDataDir));
                options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36");
                //options.AddArgument("disable-extensions");
                options.AddExcludedArgument("enable-automation");
                options.AddAdditionalCapability("useAutomationExtension", false);
                //设置异步加载
                options.PageLoadStrategy = PageLoadStrategy.None;

                //根据站点一次处理数据
                List<string> sites_temp = lt.Map(aa => { return aa.Site; }).Distinct().ToList();
                foreach (string si in sites_temp){
                    IsChangeAgent = false;
                    List<TrackingEntity> lt_data_site = lt.Filter(c => c.Site == si).ToList();
                    int Ct = lt_data_site.Count / (Agents.Count + 1);
                    if (Ct == 0){
                        Ct = 1;
                    }
                    int CurQty = 0;
                    string FileName = Path.GetDirectoryName(Application.ExecutablePath) + "\\proxy.zip";
            change: if (IsChangeAgent){
                        //切换代理
                        ChangeSite(si);
                        options = new OpenQA.Selenium.Chrome.ChromeOptions();
                        options.AddArgument(string.Format("--user-data-dir={0}", UserDataDir));
                        options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36");
                        options.AddExcludedArgument("enable-automation");
                        options.AddAdditionalCapability("useAutomationExtension", false);
                        options.AddExtension(FileName);
                    }
                    else{
                        options = new OpenQA.Selenium.Chrome.ChromeOptions();
                        options.AddArgument(string.Format("--user-data-dir={0}", UserDataDir));
                        options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36");
                        options.AddArgument("disable-extensions");
                        options.AddExcludedArgument("enable-automation");
                        options.AddAdditionalCapability("useAutomationExtension", false);
                        this.Invoke(new Action(() =>{
                            this.Text = FormTitle + "         当前未使用代理";
                        }));
                        if (File.Exists(FileName)){
                            try{
                                File.Delete(FileName);
                            }
                            catch { }
                        }
                    }
                    //设置异步加载
                    options.PageLoadStrategy = PageLoadStrategy.None;
                    int PageIndex = 0;
                    List<Agent> plt = WebAgentList.Find(wf => wf.Site == si).AgentList.Filter(af => af.Available == 0).ToList();
                    if (plt == null || plt.Count == 0){
                        PageIndex = 1;
                    }
                    else{
                        PageIndex = plt.Count + 1;
                    }
                    int InterCt = Ct;
                    if (PageIndex >= Agents.Count + 1){
                        InterCt = lt_data_site.Count - (PageIndex - 1) * Ct;
                    }
                    using (driver = new OpenQA.Selenium.Chrome.ChromeDriver(options)){
                        ((OpenQA.Selenium.Chrome.ChromeDriver)driver).ExecuteChromeCommand("Page.addScriptToEvaluateOnNewDocument", new Dictionary<string, object> { { "source", @"Object.defineProperty(navigator, 'webdriver', {
                                get: () => undefined
                            })" } });
                        //告诉Selenium在尝试查找元素或与页面进行交互时最多等待5秒
                        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
                        //driver.Manage().Window.Minimize();
                        foreach (TrackingEntity a in lt_data_site.Skip((PageIndex - 1) * Ct).Take(InterCt)){
                            try{
                                KeyValuePair<string, Func<TrackingEntity, IWebDriver, Tracking_Chrome.TrackingRet>> par = dic.Filter(b => b.Key.Split(':')[0] == a.ShippingServer.Trim()).ToList()[0];
                                TrackingRet ret = par.Value(a, driver);
                                Rets.Add(ret);
                                CurQty++;
                                Total--;
                                this.Invoke(new Action(() =>{
                                    toolStripStatusLabel3.Text = string.Format("剩余:{0}", Total);
                                }));
                            }
                            catch (Exception ex){

                            }
                        }
                        if (CurQty < lt_data_site.Count){
                            IsChangeAgent = true;
                            CloseChromeDriver(driver);
                            goto change;
                        }
                    }
                }
                //保存数据
                ConsoleLog("保存数据中...");
                SaveData(Rets);
                ConsoleLog("数据保存完毕.");
                log(DateTime.Now.ToString() + "  数据同步完毕!");
            }
            catch(Exception ex){
                CloseChromeDriver(driver);
                log(ex.Message);
                ConsoleLog(ex.Message);
            }
            finally {
                //关闭程序
                Thread.Sleep(3000);
                Application.Exit();
            }
        }

辅助代码:

        /// <summary>
        /// ChromeDriver检查更新
        /// </summary>
        public void UpdateChromeDriver(){
            //Task t = Task.Run(() => {
                try{
                ConsoleLog("chromedriver更新检测中...");
                    //获取当前浏览器版本
                    string CurrentChromeVer = "";
                    RegistryKey current = Registry.CurrentUser;
                    RegistryKey chromeRegistry = current.OpenSubKey(@"Software\Google\Chrome\BLBeacon", false);
                    if (chromeRegistry != null){
                        string version = chromeRegistry.GetValue("version").DbToString();
                        if (!string.IsNullOrWhiteSpace(version)){
                            CurrentChromeVer = version;
                        }
                    }
                    if (string.IsNullOrEmpty(CurrentChromeVer)){
                        throw new Exception("当前浏览器版本获取失败.");
                    }
                    //获取ChromeDriver版本
                    string CurrentChromeDriverVer = "";
                    string driverPath = AppDomain.CurrentDomain.BaseDirectory + "chromedriver.exe";
                    if (File.Exists(driverPath)){
                        Process pro = new Process();
                        pro.StartInfo.FileName = "cmd.exe";
                        pro.StartInfo.UseShellExecute = false;
                        pro.StartInfo.RedirectStandardInput = true;
                        pro.StartInfo.RedirectStandardOutput = true;
                        pro.StartInfo.RedirectStandardError = true;
                        pro.StartInfo.CreateNoWindow = true;
                        pro.Start();
                        pro.StandardInput.WriteLine(driverPath + " --version");
                        pro.StandardInput.WriteLine("exit");
                        string line = null;
                        string chromeStr = string.Empty;
                        while ((line = pro.StandardOutput.ReadLine()) != null){
                            line = line.Trim();
                            if (line.StartsWith("ChromeDriver")){
                                chromeStr = line;
                                break;
                            }
                        }
                        string outputStr = chromeStr;//输出的格式 ChromeDriver 78.0.3904.70 (edb9c9f3de0247fd912a77b7f6cae7447f6d3ad5-refs/branch-heads / 3904@{#800})
                        if (!string.IsNullOrWhiteSpace(outputStr)){
                            outputStr = outputStr.Replace("ChromeDriver", "").Trim();//78.0.3904.70 (edb9c9f3de0247fd912a77b7f6cae7447f6d3ad5-refs/branch-heads / 3904@{#800})
                            int endIndex = outputStr.IndexOf(" ");
                            if (endIndex != -1){
                                outputStr = outputStr.Substring(0, endIndex);//78.0.3904.70
                                CurrentChromeDriverVer = outputStr;
                            }
                        }
                    }
                    if (string.IsNullOrEmpty(CurrentChromeDriverVer)){
                        throw new Exception("ChromeDriver版本获取失败.");
                    }
                    int index1 = CurrentChromeVer.LastIndexOf(".");
                    int index2 = CurrentChromeDriverVer.LastIndexOf(".");
                    string firstVersion1 = CurrentChromeVer.Substring(0, index1);
                    string firstVersion2 = CurrentChromeDriverVer.Substring(0, index2);
                    Version version1 = new Version(firstVersion1);
                    Version version2 = new Version(firstVersion2);
                    if (version2 < version1){
                        string root = AppDomain.CurrentDomain.BaseDirectory + "temp";
                        if (!System.IO.Directory.Exists(root)){
                            System.IO.Directory.CreateDirectory(root);
                        }
                        //获取镜像页面版本号
                        string newVersion = "";
                        string url = "http://npm.taobao.org/mirrors/chromedriver/";
                        using (System.Net.WebClient client = new System.Net.WebClient()){
                            string html = client.DownloadString(url);
                            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                            doc.LoadHtml(html);
                            //查找以当前浏览器版本号的driver
                            string path = $"//div[@class=\"container\"]//pre//a[starts-with(text(),\"{ firstVersion1}\")]";
                            HtmlAgilityPack.HtmlNode nodes = doc.DocumentNode.SelectNodes(path)?.LastOrDefault();
                            if (nodes != null){
                                newVersion = nodes.InnerText.Trim('/').Trim();
                            }
                        }
                        if (string.IsNullOrEmpty(newVersion)){
                            throw new Exception("镜像页面版本号获取失败.");
                        }
                        //从服务器下载chromedriver
                        url = $"http://npm.taobao.org/mirrors/chromedriver/{newVersion}/chromedriver_win32.zip";
                        System.Net.HttpWebRequest request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
                        request.Method = "GET";
                        request.ContentType = "application/octet-stream";
                        using (System.Net.HttpWebResponse response = request.GetResponse() as System.Net.HttpWebResponse){
                            string fullName = root + "\\chromedriver_win32.zip";
                            if (System.IO.File.Exists(fullName)){
                                System.IO.File.Delete(fullName);
                            }
                            byte[] bytes = GetMemoryStream(response.GetResponseStream()).ToArray();
                            using (System.IO.FileStream fs = new System.IO.FileStream(fullName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite)){
                                fs.Write(bytes, 0, bytes.Length);
                            }
                        }
                        //解压文件
                        root = AppDomain.CurrentDomain.BaseDirectory + "temp\\chromedriver_win32.zip";
                        if (File.Exists(root)){
                            UnZip(root, AppDomain.CurrentDomain.BaseDirectory);
                        }
                        else{
                            throw new Exception("文件下载失败.");
                        }
                        ConsoleLog("升级成功.");
                    }
                    else{
                        ConsoleLog("无需升级.");
                    }
                }
                catch (Exception ex){
                    ConsoleLog("更新出错:" + ex.Message);
                    log("更新出错:" + ex.Message);
                }
            //});
            //await t;
        }

        
        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="zipFile"></param>
        /// <param name="destFolder"></param>
        private void UnZip(string zipFile, string destFolder){
            if (!destFolder.EndsWith("/"))
                destFolder += "/";
            if (!Directory.Exists(destFolder))
                Directory.CreateDirectory(destFolder);
            using (var s = new ZipInputStream(File.OpenRead(zipFile))){
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null){
                    string directoryName = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);
                    if (!string.IsNullOrEmpty(directoryName)){
                        Directory.CreateDirectory(destFolder + directoryName);
                    }
                    if (fileName != String.Empty){
                        using (FileStream streamWriter = File.Create(destFolder + theEntry.Name)){
                            int size;
                            byte[] data = new byte[2048];
                            while (true){
                                size = s.Read(data, 0, data.Length);
                                if (size > 0){
                                    streamWriter.Write(data, 0, size);
                                }
                                else{
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }

        private MemoryStream GetMemoryStream(Stream streamResponse){
            using (MemoryStream _stream = new MemoryStream()){
                int Length = 256;
                Byte[] buffer = new Byte[Length];
                int bytesRead = streamResponse.Read(buffer, 0, Length);
                while (bytesRead > 0){
                    _stream.Write(buffer, 0, bytesRead);
                    bytesRead = streamResponse.Read(buffer, 0, Length);
                }
                return _stream;
            }
        }

        /// <summary>
        /// 获取单个值
        /// </summary>
        /// <param name="driver"></param>
        /// <param name="xpath"></param>
        /// <returns></returns>
        public string ElementGetValue(IWebDriver driver, string xpath)
        {
            try
            {
                int Index = xpath.LastIndexOf("/");
                string LastStr = xpath.Substring(Index);
                if (LastStr.ToLower().Contains("text()") || LastStr.IndexOf("@") == 1)
                {
                    xpath = xpath.Replace(LastStr, "");
                }
                string Attr = "";
                if (LastStr.IndexOf("@") == 1)
                {
                    Attr = LastStr.Substring(2);
                }
                //等待
                new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until<bool>((a) => {
                    try
                    {
                        var cts = a.FindElements(By.XPath(xpath));
                        return cts.Count > 0 && cts[0].Text.Trim() != "" && cts[0].Text.Trim() != "查询中";
                    }
                    catch
                    {
                        return false;
                    }
                });
                var ele = driver.FindElements(By.XPath(xpath))[0];
                if (LastStr.ToLower().Contains("text()"))
                {
                    return ele.Text.Trim();
                }
                else if (Attr != "")
                {
                    return ele.GetAttribute(Attr);
                }
                else
                {
                    return ele.GetProperty("innerHTML");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void CloseChromeDriver(IWebDriver driver){
            try{
                driver.Quit();
                driver.Dispose();
            }
            catch { }
            CloseWindow();
        }

        /// <summary>
        /// 获取窗口句柄
        /// </summary>
        /// <returns></returns>
        public IntPtr GetWindowHandle(){
            string name = Path.GetDirectoryName(Application.ExecutablePath)+"\\chromedriver.exe";
            IntPtr hwd = FindWindow(null, name);
            //log(hwd.ToString());
            //log(name);
            return hwd;
        }

        /// <summary>
        /// 关闭chromedriver窗口
        /// </summary>
        public void CloseWindow(){
            try{
                IntPtr hwd = GetWindowHandle();
                SendMessage(hwd, 0x10, 0, 0);
            }
            catch { }
        }

        /// <summary>
        /// 切换代码
        /// </summary>
        /// <param name="site"></param>
        public void ChangeSite(string site="") {
            Agent agent = WebAgentList.Find(a => a.Site == site).AgentList.Filter(b => b.Available == 1).First();
            agent.Available = 0;
            GeneratePlug(agent.Ip, agent.Port, agent.UserName, agent.PassWord);
            ConsoleLog(string.Format("已切换代理=>{0}:{1}", agent.Ip, agent.Port));
            this.Invoke(new Action(() => {
                this.Text = FormTitle + string.Format("         当前使用代理=>{0}:{1}", agent.Ip, agent.Port);
            }));
        }

        /// <summary>
        /// 生成插件
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="userName"></param>
        /// <param name="passWord"></param>
        public void GeneratePlug(string ip="",string port="",string userName="",string passWord="") {
            try{
                string FileName = Path.GetDirectoryName(Application.ExecutablePath) + "\\proxy.zip";
                string BackGroundJs = @"var config = {
                                        mode: 'fixed_servers',
                                        rules: {
                                          singleProxy: {
                                            scheme: 'http',
                                            host: 'mimvp_proxy_host',
                                            port: parseInt(mimvp_proxy_port)
                                          },
                                          bypassList: ['{0}']
                                        }
                                      };
                                    chrome.proxy.settings.set({value: config, scope: 'regular'}, function() {});
                                    function callbackFn(details) {
                                        return {
                                            authCredentials: {
                                                username: 'mimvp_username',
                                                password: 'mimvp_password'
                                            }
                                        };
                                    }
                                    chrome.webRequest.onAuthRequired.addListener(
                                            callbackFn,
                                            {urls: ['<all_urls>']},
                                            ['blocking']
                                    );".Replace("{0}", string.Join(",", Sites).Replace(",", "','"));
                string ManiFest = "{\"version\": \"1.0.0\",\"manifest_version\": 2,\"name\": \"Chrome Proxy\",\"permissions\": [\"proxy\",\"tabs\",\"unlimitedStorage\",\"storage\",\"<all_urls>\",\"webRequest\",\"webRequestBlocking\"],\"background\": {\"scripts\": [\"background.js\"]},\"minimum_chrome_version\":\"22.0.0\"}";
                BackGroundJs =BackGroundJs.Replace("mimvp_proxy_host", ip).Replace("mimvp_proxy_port", port).Replace("mimvp_username", userName).Replace("mimvp_password", passWord);
                List<MemoryStream> ms = new List<MemoryStream> {
                    new MemoryStream(System.Text.Encoding.UTF8.GetBytes(BackGroundJs)),
                    new MemoryStream(System.Text.Encoding.UTF8.GetBytes(ManiFest))
                };
                List<string> lt = new List<string> { "background.js", "manifest.json" };
                Compress(ms, lt, FileName);
            }
            catch (Exception ex) { }
        }

        /// <summary>
        /// 压缩多个文件
        /// </summary>
        /// <param name="msList">文件流</param>
        /// <param name="fileNameList">文件名称</param>
        /// <param name="GzipFileStream">压缩后的文件流</param>
        /// <param name="CompressionLevel">压缩等级</param>
        /// <param name="SleepTimer">等待的时长(毫秒)</param>
        public void Compress(List<MemoryStream> msList, List<string> fileNameList,string fileName){
            using (FileStream GzipFileStream = new FileStream(fileName,FileMode.Create,FileAccess.Write)) {
                using (ZipOutputStream zipStream = new ZipOutputStream(GzipFileStream)) {
                    zipStream.SetLevel(6);
                    int index = 0;
                    foreach (MemoryStream ms in msList){
                        ms.Position = 0;
                        byte[] bytes = new byte[ms.Length];
                        ms.Read(bytes, 0, bytes.Length);
                        ZipEntry entry = new ZipEntry(Path.GetFileName(fileNameList[index]));
                        entry.DateTime = DateTime.Now;
                        zipStream.PutNextEntry(entry);
                        zipStream.Write(bytes, 0, bytes.Length);
                        System.Threading.Thread.Sleep(10);
                        index++;
                    }
                }
            }
        }

        /// <summary>
        /// 日志
        /// </summary>
        /// <param name="info"></param>
        public void log(string info){
            string FilePath = Path.GetDirectoryName(Application.ExecutablePath) + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            StreamWriter sw;
            if (!File.Exists(FilePath)){
                sw = new StreamWriter(FilePath, false);
            }
            else{
                sw = new StreamWriter(FilePath, true);
            }
            sw.Write(info + "\r\n"); 
            sw.Flush();
            sw.Close();
        }

        public void ConsoleInfo(TrackingRet tr){
            if (string.IsNullOrEmpty(tr.error)){
                ConsoleLog(string.Format("【{0}】追踪号{1}状态:{2}获取成功!", tr.ShippingServer, tr.TrackingNo, tr.TrackStatus));
            }
            else{
                ConsoleLog(string.Format("【{0}】追踪号{1} 信息:{2}", tr.ShippingServer, tr.TrackingNo, tr.error));
            }
        }

        public void ConsoleLog(string info){
            this.Invoke(new Action(() => {
                if (listBox1.Items.Count >= 1000){
                    listBox1.Items.Clear();
                }
                listBox1.Items.Insert(0, DateTime.Now.ToString() + " " + info);
            }));
        }

        public void SaveData(List<TrackingRet> lt){
            lt.FindAll(a => string.IsNullOrEmpty(a.error) && !string.IsNullOrEmpty(a.TrackStatus)).Each(a => {
                try{
                    a.TrackStatus = a.TrackStatus.Replace("'", "''").Length > 190 ? a.TrackStatus.Replace("'", "''").Substring(0, 190) : a.TrackStatus.Replace("'", "''");
                    if (Convert.ToInt32(DbHelperSQL_SR.GetSingle(string.Format("select (1) from tUploadCustom t where t.TrackingNumber='{0}'", a.TrackingNo))) > 0){
                        //update
                        DbHelperSQL_SR.ExecuteSql(string.Format("update t set t.Status='{0}',t.Lastupdate=getdate() from tUploadCustom t where t.TrackingNumber='{1}'", a.TrackStatus, a.TrackingNo));
                        DbHelperSQL_SR.ExecuteSql(string.Format("update t set t.TrackingStatus='{0}',t.TrackingDate='{1}' from tEBay_Trade t where t.TrackingNumber='{2}'", a.TrackStatus, a.TrackingDate, a.TrackingNo));
                    }
                    else{
                        string Sql = string.Format(@"INSERT INTO tUploadCustom (SerialNumber, TrackingNumber, TType, TDate, SHIP_USD, IsUpload, Remark, Uid, Status, ShopId, ShippingMethod)
                                                  SELECT
                                                    t.Oid,
                                                    t.TrackingNumber,
                                                    t.ShippingServer,
                                                    getdate(),
                                                    t.Fee / r2.rate fee,
                                                    0,
                                                    2,
                                                    0,
                                                    '{0}',
                                                    t.ShopID,
                                                    t.ShippingMethod
                                                  FROM tEBay_Trade t
                                                    OUTER APPLY dbo.fn_GettExchangeRateDateT(getdate(), t.ShippingCCY) R2
                                                  WHERE t.TrackingNumber = '{1}'", a.TrackStatus.Replace("'", "''"), a.TrackingNo);
                        DbHelperSQL_SR.ExecuteSql(Sql);
                    }
                }
                catch (Exception ex){
                    log(ex.Message + ex.StackTrace + ex.Source);
                }
            });
        }

        /// <summary>
        /// 正则匹配
        /// </summary>
        /// <param name="input"></param>
        /// <param name="reg"></param>
        /// <returns></returns>
        public string MatchStrSingle(string input, string reg){
            List<string> lt = new List<string>();
            foreach (Match item in Regex.Matches(input, reg)){
                lt.Add(item.Value);
            }
            if (lt.Count == 0){
                return "";
            }
            return lt[0];
        }

四、隐藏黑色的命令行窗口

		[DllImport("user32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        public const int SW_HIDE = 0;

        public const int SW_SHOW = 5;

        [DllImport("user32.dll", EntryPoint = "ShowWindow")]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);

        public void HideWnd(){
            IntPtr hwd = GetWindowHandle();
            ShowWindow(hwd, SW_HIDE);
        }
        /// <summary>
        /// 获取窗口句柄
        /// </summary>
        /// <returns></returns>
        public IntPtr GetWindowHandle()
        {
            string name = Path.GetDirectoryName(Application.ExecutablePath) + "\\chromedriver.exe";
            IntPtr hwd = FindWindow(null, name);
            //log(hwd.ToString());
            //log(name);
            return hwd;
        }

        /// <summary>
        /// 关闭chromedriver窗口
        /// </summary>
        public void CloseWindow()
        {
            try
            {
                IntPtr hwd = GetWindowHandle();
                SendMessage(hwd, 0x10, 0, 0);
            }
            catch { }
        }

没错,就是使用windows API隐藏,桌面和任务栏都不会出现黑窗口。使用的时候,注意在程序最后关闭的时候即使调用CloseWindow进行窗口关闭。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值