/// <summary>
            /// 刷新 淘宝h5 SDK 的cookie
            /// </summary>
            public void RefreshH5Api_Cookies()
            {
                try
                {
                    // 生成时间戳
                    string timestamp = JavascriptContext.getUnixTimestamp();

                    //加载Cookie
                    var ckVisitor = new LazyCookieVistor();
                    ///淘宝域下 的cookie
                    string etao_appkey = "12574478";

                    var data          = "{\"isSec\":0}";//固定数据  只为刷token
                    var sign_getToken = JavascriptContext.getEtaoJSSDKSign("", timestamp, etao_appkey, data);

                    string h5TokenUrl = string.Format("https://api.m.taobao.com/h5/mtop.user.getusersimple/1.0/?appKey={0}&t={1}&sign={2}&api=mtop.user.getUserSimple&v=1.0&H5Request=true&type=jsonp&dataType=jsonp&callback=mtopjsonp1&data={3}", etao_appkey, timestamp, sign_getToken, data);
                    this.AutoRefeshCookie(h5TokenUrl);//从新刷新页面 获取 服务器颁发的私钥
                    var cks_taobao      = ckVisitor.LoadCookies(TaobaoSiteUrl);
                    var _m_h5_tk_cookie = cks_taobao.FirstOrDefault(x => x.Name == "_m_h5_tk");
                    if (null == _m_h5_tk_cookie)
                    {
                        throw new Exception("未能成功刷新 淘宝h5 SDK! _m_h5_tk");
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ex);
                }
            }
Esempio n. 2
0
        /// <summary>
        /// 发送客户端搜集的平台的cookies 集合到远程
        /// </summary>
        public static void SendCookiesToRemote()
        {
            string msg = "SendCookiesToRemote 被执行!时间:" + DateTime.Now.ToString();

            Logger.Info(msg);

            lock (_locker)
            {
                SendMessageToListerner(msg);

                //todo:实现拉取cookies 然后发送到远程server
                var allPlatforms = Enum.GetValues(typeof(SupportPlatformEnum)); // SupportPlatformEnum.Alimama.get
                                                                                //var cookieLoader = new LazyCookieVistor();
                foreach (SupportPlatformEnum platform in allPlatforms)
                {
                    var siteObj = GlobalContext.SupportPlatforms.Find(x => x.Platform == platform);
                    if (null == siteObj)
                    {
                        string platformDescription = platform.GetEnumDescription();
                        string errMsg = string.Format($"CrawlerCookiesPopJob,未能正确从配置文件加载平台地址:{platformDescription ?? platform.ToString()}");
                        SendMessageToListerner(errMsg);
                        continue;
                    }
                    var domian = siteObj.SiteUrl;
                    var cks    = new LazyCookieVistor().LoadNativCookies(domian, true);


                    if (null != cks && cks.IsNotEmpty())
                    {
                        //淘宝的cookie 附加
                        if (platform == SupportPlatformEnum.Taobao)
                        {
                            //推送爱淘宝-券官网的cookie到淘宝
                            var cks_aiTaoBao = new LazyCookieVistor().LoadNativCookies(GlobalContext.AiTaobaoSiteURL, true);
                            if (null != cks_aiTaoBao && cks_aiTaoBao.IsNotEmpty())
                            {
                                for (int i = 0; i < cks_aiTaoBao.Count; i++)
                                {
                                    var item = cks_aiTaoBao.ElementAt(i);
                                    if (cks.FirstOrDefault(x => x.Name == item.Name) != null)
                                    {
                                        continue;//跳过重名的cookie
                                    }
                                    cks.Add(item);
                                }
                            }
                        }
                        GlobalContext.PushToRedisCookies(domian, cks);
                    }
                }

                //推送轻淘客cookies
                var cks_qingTaoke = new LazyCookieVistor().LoadNativCookies(GlobalContext.QingTaokeSiteURL, true);
                if (null != cks_qingTaoke && cks_qingTaoke.IsNotEmpty())
                {
                    GlobalContext.PushToRedisCookies(GlobalContext.QingTaokeSiteURL, cks_qingTaoke);
                }
            }
        }
Esempio n. 3
0
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }


                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(GuomeiSiteUrl);



                //优先使用格式化好的查询地址
                string searchUrl = "";

                if (null != queryParas.ResolvedUrl)
                {
                    searchUrl = queryParas.ResolvedUrl.Url;
                }
                else
                {
                    searchUrl = string.Format(templateOfSearchUrl, keyWord);
                }


                var client = GuomeiHttpClient;

                //设置Host
                client.Client.DefaultRequestHeaders.Host = new Uri(searchUrl).Host;

                //设置跳转头 Referrer
                string enCodeKeyword = HttpUtility.UrlEncode(keyWord);

                client.Client.DefaultRequestHeaders.Referrer = new Uri(string.Format(templateOfSearchUrl, keyWord));
                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, GuomeiSiteUrl);

                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };

                //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                //使用json格式打开即可看到里面所有的字符串

                string content = clientProxy.GetRequestTransfer(searchUrl, null);



                return(content);
            }
Esempio n. 4
0
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }


                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(tmallSiteUrl);



                //天猫应该是有解析的搜索url的,如果没有,那么使用基于拼接的默认关键词的检索地址
                string searchUrl = "";

                if (null != queryParas.ResolvedUrl)
                {
                    searchUrl = queryParas.ResolvedUrl.Url;
                }
                else
                {
                    string sortValue = "s";//综合排序
                    if (null != queryParas.OrderFiled)
                    {
                        sortValue = queryParas.OrderFiled.FieldValue;
                    }

                    searchUrl = string.Format(templateOfSearchUrl, keyWord, sortValue);
                }


                var client = TmallHttpClient;

                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, tmallSiteUrl);

                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };

                //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                //使用json格式打开即可看到里面所有的字符串

                string content = clientProxy.GetRequestTransfer(searchUrl, null);



                return(content);
            }
Esempio n. 5
0
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }



                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(PddSiteUrl);



                //优先使用格式化好的查询地址
                string searchUrl = "";

                if (null != queryParas.ResolvedUrl)
                {
                    searchUrl = queryParas.ResolvedUrl.Url;
                }
                else
                {
                    searchUrl = string.Format(templateOfSearchUrl
                                              , keyWord, queryParas.PageIndex + 1
                                              , queryParas.OrderFiled.FieldValue);
                }



                var client = PddHttpClient;

                //设置跳转头 Referrer
                client.Client.DefaultRequestHeaders.Referrer = new Uri(string.Format("http://mobile.yangkeduo.com/search_result.html?search_key={0}&search_src=new&search_met_track=manual&refer_page_name=search&refer_page_id=search_1515546776782_Zeq7a7qvHN&refer_page_sn=10031&page_id=search_result_1515546785426_9C9j8sIOep&sort_type=2", keyWord));
                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, PddSiteUrl);

                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };

                //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                //使用json格式打开即可看到里面所有的字符串

                string content = clientProxy.GetRequestTransfer(searchUrl, null);



                return(content);
            }
Esempio n. 6
0
        /// <summary>
        /// 加载Cookies
        /// </summary>
        protected void LoadCookies()
        {
            if (null == this.DomainIdentity || this.DomainIdentity.Length <= 0)
            {
                return;
            }

            var ckVistor = new LazyCookieVistor();

            _PageCooies = ckVistor.LoadCookies(this.DomainIdentity);
        }
        /// <summary>
        /// 获取阿里妈妈的Cookie
        /// </summary>
        /// <returns></returns>
        public static DataContainer GetLoginTokenCookies()
        {
            var container    = new DataContainer();
            var ckVistor     = new LazyCookieVistor();
            var _PageCooies  = ckVistor.LoadCookiesAsyc(GlobalContext.AlimamaSiteURL).Result;
            var json_cookies = JsonConvert.SerializeObject(_PageCooies);

            container.Result = json_cookies;


            return(container);
        }
Esempio n. 8
0
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }

                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(MogujieSiteUrl);

                string timeToken = JavascriptContext.getUnixTimestamp();

                //优先使用格式化好的查询地址
                string searchUrl = "";

                if (null != queryParas.ResolvedUrl)
                {
                    searchUrl = queryParas.ResolvedUrl.Url;
                }
                else
                {
                    searchUrl = string.Format(templateOfSearchUrl, timeToken, keyWord);
                }



                var client = MogujieHttpClient;

                client.Client.DefaultRequestHeaders.Referrer = new Uri(string.Format("http://list.mogujie.com/s?q={0}&ptp=1.eW5XD.0.0.qJUTT", keyWord));
                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, MogujieSiteUrl);

                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };

                //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                //使用json格式打开即可看到里面所有的字符串

                string content = clientProxy.GetRequestTransfer(searchUrl, null);



                return(content);
            }
Esempio n. 9
0
        /// <summary>
        /// 从其对应的render 进程中接收过来的消息过滤处理
        /// </summary>
        /// <param name="browser"></param>
        /// <param name="sourceProcess"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        protected override bool OnProcessMessageReceived(CefBrowser browser, CefProcessId sourceProcess, CefProcessMessage message)
        {
            Console.WriteLine("Render::OnProcessMessageReceived: SourceProcess={0}", sourceProcess);
            Console.WriteLine("Message Name={0} IsValid={1} IsReadOnly={2}", message.Name, message.IsValid, message.IsReadOnly);
            var arguments = message.Arguments;

            for (var i = 0; i < arguments.Count; i++)
            {
                var    type = arguments.GetValueType(i);
                object value;
                switch (type)
                {
                case CefValueType.Null: value = null; break;

                case CefValueType.String: value = arguments.GetString(i); break;

                case CefValueType.Int: value = arguments.GetInt(i); break;

                case CefValueType.Double: value = arguments.GetDouble(i); break;

                case CefValueType.Bool: value = arguments.GetBool(i); break;

                default: value = null; break;
                }

                Console.WriteLine("  [{0}] ({1}) = {2}", i, type, value);
            }
            //filters
            if (message.Name.Equals(IPCCommand.CommandType.GET_COOKIE_FROM_BROWSER_PROCESS.ToString()))
            {
                var    argumentsInMsg = message.Arguments;
                string domainName     = argumentsInMsg.GetString(0);
                if (!string.IsNullOrEmpty(domainName))
                {
                    //获取指定域名的cookie
                    var cks = new LazyCookieVistor().LoadNativCookies(domainName);
                    if (cks.IsNotEmpty())
                    {
                        var cookieString    = cks.ToJson();
                        var message_cookies = CefProcessMessage.Create(IPCCommand.CommandType.GET_COOKIE_FROM_BROWSER_PROCESS.ToString());
                        message_cookies.Arguments.SetString(0, domainName);
                        message_cookies.Arguments.SetString(1, cookieString);
                        var success = browser.SendProcessMessage(CefProcessId.Renderer, message_cookies);
                        Console.WriteLine("Sending myMessage3 to browser process = {0}", success);
                    }
                }
            }
            return(true);
            //return base.OnProcessMessageReceived(browser, sourceProcess, message);
        }
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }



                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(QingTaokeSiteUrl);



                string searchUrl = string.Format(templateOfSearchUrl, keyWord);

                var client = QingTaokeHttpClient;

                //设置跳转头 Referrer
                //client.Client.DefaultRequestHeaders.Referrer = new Uri(string.Format("http://mobile.yangkeduo.com/search_result.html?search_key={0}&search_src=new&refer_page_name=search&refer_page_id=search_1500439537429_yr7sonlWB0", keyWord));
                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, QingTaokeSiteUrl);

                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };

                //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                //使用json格式打开即可看到里面所有的字符串

                string content = clientProxy.GetRequestTransfer(searchUrl, null);



                return(content);
            }
        /// <summary>
        /// 静态登录Cookie注册
        /// </summary>
        /// <param name="loginCookieCollection">需要提供的已经登录的Cookie集合</param>
        private static void SetLogin(List <CefCookie> loginCookieCollection)
        {
            try
            {
                var ckVisitor = new LazyCookieVistor();

                if (null != loginCookieCollection)
                {
                    //注册cookie集合到全局Cookie容器内
                    new LazyCookieVistor().SetCookieToCookieManager(GlobalContext.TaobaoSiteURL, loginCookieCollection);


                    IsHasLoginTaobao = true;
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
        }
Esempio n. 12
0
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }
                //生成时间戳
                string timestamp = JavascriptContext.getUnixTimestamp();

                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(eTaoSiteUrl);

                var _m_h5_tk_cookie = cks.FirstOrDefault(x => x.Name == "_m_h5_tk");

                if (null == _m_h5_tk_cookie)
                {
                    this.AutoRefeshCookie(this.RefreshCookieUrl);//从新刷新页面 获取 服务器颁发的私钥
                    cks             = ckVisitor.LoadCookies(eTaoSiteUrl);
                    _m_h5_tk_cookie = cks.FirstOrDefault(x => x.Name == "_m_h5_tk");
                }
                if (null == _m_h5_tk_cookie || string.IsNullOrEmpty(_m_h5_tk_cookie.Value))
                {
                    throw new Exception("加载授权私钥失败!无法获取对应的cookie:_m_h5_tk ");
                }
                string _m_h5_tk_valueString = _m_h5_tk_cookie.Value.Split('_')[0];

                string etao_appkey = "12574478";

                if (null == queryParas.OrderFiled)
                {
                    queryParas.OrderFiled = queryParas.GetCurrentPlatformSupportOrderFields().First();
                }
                int pageNum = queryParas.PageIndex * 40;

                string paras = string.Concat("{\"s\":", pageNum, ",\"n\":40,\"q\":\"", keyWord, "\",\"needEncode\":false,\"sort\":\"", queryParas.OrderFiled.FieldValue, "\",\"maxPrice\":10000000,\"minPrice\":0,\"serviceList\":\"\",\"navigator\":\"all\",\"urlType\":2}");

                //生成参数戳
                string sign = JavascriptContext.getEtaoJSSDKSign(_m_h5_tk_valueString, timestamp, etao_appkey, paras);

                string url = string.Format("https://apie.m.etao.com/h5/mtop.etao.fe.search/1.0/?type=jsonp&api=mtop.etao.fe.search&v=1.0&appKey=12574478&data={0}&t={1}&sign={2}&callback=jsonp28861232595120323", paras, timestamp, sign);


                string searchUrl = string.Format(templateOfSearchUrl, keyWord);
                var    client    = etaoHttpClient;

                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, eTaoSiteUrl);
                //修改client 的refer 头
                client.Client.DefaultRequestHeaders.Referrer = new Uri(searchUrl);
                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };
                string content = clientProxy.GetRequestTransfer(url, null);

                return(content);
            }
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                VipSearchResultBag resultBag = new VipSearchResultBag();

                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }

                try
                {
                    //加载Cookie
                    var ckVisitor = new LazyCookieVistor();
                    var cks       = ckVisitor.LoadCookies(VipSiteUrl);



                    string searchUrl = string.Format(templateOfSearchUrl, keyWord);

                    var client = VipHttpClient;
                    client.Client.DefaultRequestHeaders.Referrer = new Uri(string.Format("https://m.vip.com/searchlist.html?q={0}&channel_id=", keyWord));
                    ////加载cookies
                    ////获取当前站点的Cookie
                    client.ChangeGlobleCookies(cks, VipSiteUrl);

                    // 4 发送请求
                    var clientProxy = new HttpServerProxy()
                    {
                        Client = client.Client, KeepAlive = true
                    };

                    //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                    //使用json格式打开即可看到里面所有的字符串
                    Task <HttpResponseMessage> brandTask;
                    Task <HttpResponseMessage> categoryTreeTask;
                    Task <HttpResponseMessage> searchListTask;
                    string para_brandJson        = "";
                    string para_categoryTreeJson = "";
                    string para_searchListJson   = "";
                    if (null != queryParas.ResolvedUrl && null != queryParas.ResolvedUrl.ParasPost)
                    {
                        para_brandJson        = queryParas.ResolvedUrl.ParasPost["para_brand"].ToString();
                        para_categoryTreeJson = queryParas.ResolvedUrl.ParasPost["para_categoryTree"].ToString();
                        para_searchListJson   = queryParas.ResolvedUrl.ParasPost["para_searchList"].ToString();
                    }
                    else
                    {
                        para_brandJson        = new VipSearchParaBrand(keyWord).ToJson();
                        para_categoryTreeJson = new VipSearchParaCategoryTree(keyWord).ToJson();

                        //插件不解析的话,那么使用最简单的基本关键词过滤分页,不进行复杂过滤,复杂过滤筛选应该在插件实现
                        var paraDetais = new VipSearchParaSearchList(keyWord);
                        //分页
                        paraDetais.paramsDetails.np = queryParas.PageIndex + 1;

                        para_searchListJson = paraDetais.ToJson();
                    }
                    if (queryParas.IsNeedResolveHeaderTags == true)
                    {
                        //1 查询品牌
                        var brandPara = new Dictionary <string, string>();
                        brandPara.Add("para_brand", para_brandJson);
                        brandTask = clientProxy.PostRequestTransferAsync(queryBrandUrl, PostDataContentType.Json, brandPara, null);
                        // 2 查询分类
                        var categoryTreePara = new Dictionary <string, string>();
                        categoryTreePara.Add("para_categoryTree", para_categoryTreeJson);
                        categoryTreeTask = clientProxy.PostRequestTransferAsync(queryCategoryUrl, PostDataContentType.Json, categoryTreePara, null);
                    }
                    else
                    {
                        brandTask        = Task.FromResult <HttpResponseMessage>(null);
                        categoryTreeTask = Task.FromResult <HttpResponseMessage>(null);
                    }

                    //3检索内容
                    var searchListPara = new Dictionary <string, string>();
                    searchListPara.Add("para_searchList", para_searchListJson);
                    searchListTask = clientProxy.PostRequestTransferAsync(templateOfSearchUrl, PostDataContentType.Json, searchListPara, null);

                    //等待任务完毕
                    Task.WaitAll(new Task[] { brandTask, categoryTreeTask, searchListTask });
                    if (brandTask.Result != null)
                    {
                        resultBag.BrandStoreList = brandTask.Result.Content.ReadAsStringAsync().Result;
                    }
                    if (categoryTreeTask.Result != null)
                    {
                        resultBag.CategoryTree = categoryTreeTask.Result.Content.ReadAsStringAsync().Result;
                    }
                    if (searchListTask.Result != null)
                    {
                        resultBag.SearchList = searchListTask.Result.Content.ReadAsStringAsync().Result;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return(resultBag.ToJson());
            }
        private void btn_Grapdata_Click(object sender, EventArgs e)
        {
            string domainUrl = this.txt_URL.Text.Trim().GetUrlStringDomainWithScheme();

            this.DomainIdentity = domainUrl;
            var cks = new LazyCookieVistor().LoadCookies(domainUrl);

            //new LazyCookieVistor().LoadCookiesAsyc(this.DomainIdentity)
            //.ConfigureAwait(true)
            //.GetAwaiter().GetResult();
            if (null == cks || cks.IsEmpty())
            {
                MessageBox.Show("none init cookies......");
                return;
            }
            if (string.IsNullOrEmpty(this.txt_URL.Text))
            {
                MessageBox.Show("none URL......");
                return;
            }



            var url = this.txt_URL.Text.Trim();

            CookieContainer cookies = new CookieContainer();



            foreach (var item in cks)
            {
                //var name = item.Name;

                //var value = item.Value;

                //Cookie ck = new Cookie(name, value);

                //ck.Domain = item.Domain;

                //ck.Path = item.Path;

                //ck.HttpOnly = item.HttpOnly;

                //ck.Secure = item.Secure;

                //if (null != item.Expires)
                //{
                //    ck.Expires = (DateTime)item.Expires;
                //}

                cookies.Add(item);
            }

            var httpHelper = new HttpRequestHelper();
            var rep        = httpHelper.CreateGetHttpResponse(url, null, 5000, cookies);



            //////-------------------------------开始发送第二步骤请求-----------------------
            //if (null != rep)
            {
                using (StreamReader sr = new StreamReader(rep.GetResponseStream(), Encoding.UTF8))//Encoding.GetEncoding("GB2312")
                {
                    string content = sr.ReadToEnd();

                    this.richTextBox_Result.Text = content;
                }

                rep.Close();
            }
        }
Esempio n. 15
0
            public override string LoadUrlGetSearchApiContent(IFetchWebPageArgument queryParas)
            {
                string keyWord = queryParas.KeyWord;

                if (string.IsNullOrEmpty(keyWord))
                {
                    return(string.Empty);
                }



                //加载Cookie
                var ckVisitor = new LazyCookieVistor();
                var cks       = ckVisitor.LoadCookies(SuningSiteUrl);


                //优先使用格式化好的查询地址
                string searchUrl = "";

                if (null != queryParas.ResolvedUrl)
                {
                    searchUrl = queryParas.ResolvedUrl.Url;
                }
                else
                {
                    searchUrl = string.Format(templateOfSearchUrl, keyWord);
                }



                var client = SuningHttpClient;

                //设置Host
                client.Client.DefaultRequestHeaders.Host = new Uri(searchUrl).Host;

                //设置跳转头 Referrer
                string enCodeKeyword = HttpUtility.UrlEncode(keyWord);

                client.Client.DefaultRequestHeaders.Referrer = new Uri(string.Format(templateOfSearchUrl, keyWord));

                //如果是ajax 请求 那么附带这两个头信息
                if (searchUrl.Contains("searchProductList.do"))
                {
                    client.Client.DefaultRequestHeaders.Add("X-Requested-With", "XMLHttpRequest");
                    client.Client.DefaultRequestHeaders.Add("X-Tingyun-Id", "p35OnrDoP8k;r=57681924");
                }
                ////加载cookies
                ////获取当前站点的Cookie
                client.ChangeGlobleCookies(cks, SuningSiteUrl);

                // 4 发送请求
                var clientProxy = new HttpServerProxy()
                {
                    Client = client.Client, KeepAlive = true
                };

                //注意:对于响应的内容 不要使用内置的文本 工具打开,这个工具有bug.看到的文本不全面
                //使用json格式打开即可看到里面所有的字符串

                string content = clientProxy.GetRequestTransfer(searchUrl, null);



                return(content);
            }
            /// <summary>
            /// 加载淘宝 h5 webapi 优惠券查询地址-详细
            /// 注意: 访问过于频繁并发的时候会被 ban 掉;以后设计为N个淘宝账户使用不同 的cookie进行抓取
            /// </summary>
            /// <param name="sellerId"></param>
            /// <param name="activityId"></param>
            /// <returns></returns>
            public async Task <string> LoadH5Api_YouhuiquanDetailAsync(long sellerId, string activityId)
            {
                try
                {
                    if (string.IsNullOrEmpty(activityId))
                    {
                        return(null);
                    }
                    //生成时间戳
                    string timestamp = JavascriptContext.getUnixTimestamp();

                    //加载Cookie
                    var ckVisitor = new LazyCookieVistor();
                    ///淘宝域下 的cookie
                    var    cks_taobao  = ckVisitor.LoadCookies(TaobaoSiteUrl);
                    string etao_appkey = "12574478";
                    //淘宝sdk 下的token
                    //List<Cookie> cks_h5 = ckVisitor.LoadCookies(TaobaoH5WebApiUrl);

                    var    _m_h5_tk_cookie      = cks_taobao.FirstOrDefault(x => x.Name == "_m_h5_tk");
                    string _m_h5_tk_valueString = string.Empty;


                    if (null == _m_h5_tk_cookie)
                    {
                        this.RefreshH5Api_Cookies();

                        cks_taobao      = ckVisitor.LoadCookies(TaobaoSiteUrl);
                        _m_h5_tk_cookie = cks_taobao.FirstOrDefault(x => x.Name == "_m_h5_tk");
                    }
                    if (null == _m_h5_tk_cookie || string.IsNullOrEmpty(_m_h5_tk_cookie.Value))
                    {
                        throw new Exception("加载授权私钥失败!无法获取对应的cookie:_m_h5_tk ");
                    }
                    _m_h5_tk_valueString = _m_h5_tk_cookie.Value.Split('_')[0];



                    string paras = string.Concat("{\"uuid\":\"", activityId, "\",\"sellerId\":\"", sellerId, "\",\"queryShop\":true}");

                    string sign = JavascriptContext.getEtaoJSSDKSign(_m_h5_tk_valueString, timestamp, etao_appkey, paras);

                    string apiUrl = string.Format("https://api.m.taobao.com/h5/mtop.taobao.couponmtopreadservice.findshopbonusactivitys/2.0/?appKey={0}&t={1}&sign={2}&api=mtop.taobao.couponMtopReadService.findShopBonusActivitys&v=2.0&AntiFlood=false&ecode=0&type=jsonp&dataType=jsonp&callback=mtopjsonp2&data={3}", etao_appkey, timestamp, sign, paras);


                    var client = TaobaoH5ApiHttpClient;

                    ////加载cookies
                    ////获取当前站点的Cookie
                    client.ChangeGlobleCookies(cks_taobao, TaobaoH5WebApiUrl);
                    //修改client 的refer 头
                    client.Client.DefaultRequestHeaders.Referrer = new Uri(apiUrl);
                    // 4 发送请求
                    var clientProxy = new HttpServerProxy()
                    {
                        Client = client.Client, KeepAlive = true
                    };
                    var taskMsg = await clientProxy.GetResponseTransferAsync(apiUrl, null);

                    string content = await taskMsg.Content.ReadAsStringAsync();


                    if (!string.IsNullOrEmpty(content) && content.Contains("FAIL_SYS_USER_VALIDATE"))
                    {
                        //需要身份验证的时候 ;FAIL_SYS_USER_VALIDATE::哎哟喂,被挤爆啦,请稍后重试; 被踢的时候 如何处理??
                        //清除taobao 的cookie 从客户端的rediscookie 从新加载
                        //ckVisitor.DeleteCookies(TaobaoSiteUrl);

                        int x = 0;
                    }

                    return(content);
                }
                catch (Exception ex)
                {
                    Logger.Error(ex);
                }

                return(string.Empty);
            }
        /// <summary>
        /// 内部类方法加载指定的搜索url
        /// 比如:在初始化的时候 刷新Cookie用 或者刷新 Cookie 获取其他
        /// </summary>
        /// <param name="searchUrl">请求指定的地址</param>
        /// <param name="timeOut">超时时间,不小于10秒,超时将返回加载超时</param>
        /// <returns></returns>
        protected Task <string> LoadUrlGetContentByCefBrowser(string searchUrl, int timeOut = 10000)
        {
            if (timeOut <= 10000)
            {
                timeOut = 10000;
            }

            try
            {
                //将事件消息模式转换为 task同步消息
                var  tcs = new TaskCompletionSource <string>();
                bool isProcessRequestEnd = false;


                //注册请求处理委托
                EventHandler <LoadEndEventArgs> handlerRequest = null;
                Action <string> disposeHandler = null;
                //资源释放委托
                disposeHandler = (state) =>
                {
                    try
                    {
                        if (tcs.Task.IsCompleted != true)
                        {
                            //设置返回结果为固定的内容
                            tcs.SetResult(state);
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Error(ex);
                    }
                    finally
                    {
                        //线程锁打开自动进行下一个
                        waitHandler.Set();
                    }
                };

                //2 开始发送请求LoadString
                handlerRequest = (s, e) =>
                {
                    isProcessRequestEnd = true;//标识正在接受请求

                    try
                    {
                        string url = HttpUtility.UrlDecode(searchUrl);//e.Frame.Url
                        System.Diagnostics.Debug.WriteLine(string.Format("cef core loaded by :{0} ", url));
                        //刷新 cookie
                        if (!string.IsNullOrEmpty(url) && !url.Equals("about:blank"))
                        {
                            var ckVisitor = new LazyCookieVistor();
                            ckVisitor.LoadCookiesAsyc(url, true);
                        }
                    }
                    catch
                    { }


                    //mixdBrowser.CefLoader.LoadEnd -= handlerRequest;
                    disposeHandler("loaded");
                };
                //etaoBrowser.ERequestHandler.OnRequestTheMoniterdUrl += handlerRequest;
                if (null == mixdBrowser || null == mixdBrowser.CefBrowser)
                {
                    mixdBrowser = CookiedCefBrowser.CreateNewWebBrowser(searchUrl, handlerRequest)
                                  .ConfigureAwait(false)
                                  .GetAwaiter()
                                  .GetResult();
                }
                else
                {
                    //必须等待页面加载完毕,否则过期的Cookie无法刷新到最新
                    mixdBrowser.CefLoader.LoadEnd += handlerRequest;
                    mixdBrowser.CefBrowser.GetMainFrame().LoadUrl(searchUrl);
                }


                //回调终结请求阻塞
                TimerCallback resetHandler = (state) =>
                {
                    //对于超时的 直接杀死render 进程
                    if (isProcessRequestEnd == true)
                    {
                        return;
                    }
                    disposeHandler("timeout");
                };

                //超时监听
                var timeBong = new System.Threading.Timer(resetHandler, null, timeOut, Timeout.Infinite);

                //进入当前线程锁定模式
                waitHandler.WaitOne();

                mixdBrowser.Dispose();
                //线程后续执行后,表示任务完毕或者超时,释放定时器资源
                timeBong.Dispose();
                return(tcs.Task);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
            return(Task.FromResult <string>(string.Empty));
        }