/// <summary> /// Proceeds the page. /// </summary> /// <param name="siteId">The site id.</param> /// <param name="url">The URL.</param> /// <param name="htmlPage">The HTML page.</param> /// <param name="counter">The counter.</param> /// <param name="formsExceptCallOnClosing">The forms except call on closing.</param> /// <param name="formsCallOnClosing">The forms call on closing.</param> protected void ProceedPage(Guid siteId, string url, string htmlPage, ref CheckSiteStatus counter, ref CheckSiteStatus formsExceptCallOnClosing, ref CheckSiteStatus formsCallOnClosing, ref List <string> formCodes) { var counterCode1 = string.Format("_lfq.push(['WebCounter.LG_Counter', '{0}']);", siteId); var counterCode2 = string.Format("_lfq.push(['WebCounter.LG_Counter','{0}']);", siteId); var formsCallOnClosingSuccessLinks = new List <string>(); var formsExceptCallOnClosingSuccessLinks = new List <string>(); if (!htmlPage.Contains(counterCode1) && !htmlPage.Contains(counterCode2)) { counter.ErrorLinks.Add(HttpUtility.UrlDecode(url)); } else { counter.SuccessLinks.Add(HttpUtility.UrlDecode(url)); } var forms = GetAllForms(htmlPage); formCodes.AddRange(GetFormCodes(forms)); var lfqPushForms = forms.Where(o => o.Contains("_lfq")).ToList(); var simpleForms = forms.Where(o => !o.Contains("_lfq")).ToList(); if (simpleForms.Any()) { formsExceptCallOnClosingSuccessLinks.Add(url); } foreach (string lfqPushForm in lfqPushForms) { var formParts = lfqPushForm.Replace(" ", string.Empty).Replace("'", string.Empty).Split(','); if (int.Parse(formParts[2]) == (int)FormMode.CallOnClosing) { formsCallOnClosingSuccessLinks.Add(url); } else { formsExceptCallOnClosingSuccessLinks.Add(url); } } if (!formsCallOnClosingSuccessLinks.Any()) { formsCallOnClosing.ErrorLinks.Add(HttpUtility.UrlDecode(url)); } else { formsCallOnClosing.SuccessLinks.Add(HttpUtility.UrlDecode(url)); } if (!formsExceptCallOnClosingSuccessLinks.Any()) { formsExceptCallOnClosing.ErrorLinks.Add(HttpUtility.UrlDecode(url)); } else { formsExceptCallOnClosing.SuccessLinks.Add(HttpUtility.UrlDecode(url)); } }
/// <summary> /// Generates the aliases result. /// </summary> /// <param name="aliases">The aliases.</param> private void GenerateAliasesResult(ref CheckSiteStatus aliases) { if (!aliases.ErrorLinks.Any()) { aliases.ErrorTypeClass = "success"; aliases.Message = "Псевдонимы корректны"; } else { aliases.ErrorTypeClass = "warning"; aliases.Message = string.Format("Псевдонимы ({0}) не корректны и отключены.", string.Join(",", aliases.ErrorLinks)); } }
/// <summary> /// Generates the forms call on closing result. /// </summary> /// <param name="formsCallOnClosing">The forms call on closing.</param> private void GenerateFormsCallOnClosingResult(ref CheckSiteStatus formsCallOnClosing) { if (formsCallOnClosing.SuccessLinks.Any()) { formsCallOnClosing.ErrorTypeClass = "success"; formsCallOnClosing.Message = "Перехват уходящих клиентов подключен"; formsCallOnClosing.Score = 20; } else { formsCallOnClosing.ErrorTypeClass = "warning"; formsCallOnClosing.Message = @"<p>Вы не используете форму для возврата уходящих клиентов. Используйте все шансы!</p> <p>Если клиент зашел к Вам на сайт, значит у него был интерес к Вашей тематике. Предложите спец предложение, подарок или просто подписку уходящему клиенту.</p> "; } }
/// <summary> /// Generates the forms except call on closing result. /// </summary> /// <param name="formsExceptCallOnClosing">The forms except call on closing.</param> private void GenerateFormsExceptCallOnClosingResult(ref CheckSiteStatus formsExceptCallOnClosing) { if (!formsExceptCallOnClosing.SuccessLinks.Any()) { formsExceptCallOnClosing.ErrorTypeClass = "error"; formsExceptCallOnClosing.Message = @"<p>Формы заказа не найдены! Вам необходимо на каждой странице предусмотреть возможность для клиента обратиться к Вам для увеличения отклика.</p> <p>Вы можете добавить форму заказа звонка, презентации или просто оформления подписки. Если Вы можете предложить что-либо ценное, предложите заполнить соответствующую форму для доступа.</p> <p>Для добавления форм Вам необходимо в модуле Опросные формы добавить соответствующую форму, сформировать код действием [Получить скрипт] и включить его на Ваш сайт.</p>"; } else if (!formsExceptCallOnClosing.ErrorLinks.Any() && formsExceptCallOnClosing.SuccessLinks.Any()) { formsExceptCallOnClosing.ErrorTypeClass = "success"; formsExceptCallOnClosing.Message = "Формы заказа подключены"; formsExceptCallOnClosing.Score = 30; } else { var percents = (decimal)(formsExceptCallOnClosing.SuccessLinks.Count + formsExceptCallOnClosing.ErrorLinks.Count) / 100; var successPercents = formsExceptCallOnClosing.SuccessLinks.Count / percents; var errorPercents = formsExceptCallOnClosing.ErrorLinks.Count / percents; if (errorPercents >= 25) { formsExceptCallOnClosing.ErrorTypeClass = "error"; } else { formsExceptCallOnClosing.ErrorTypeClass = "warning"; formsExceptCallOnClosing.Score = 15; } formsExceptCallOnClosing.Message = string.Format(@"<p>Формы заказа найдены только на {0}% страниц! Мы рекомендуем предусмотреть на каждой странице возможность для клиента обратиться к Вам для увеличения отклика.</p> <p>Вы можете добавить форму заказа звонка, презентации или просто оформления подписки. Если Вы можете предложить что-либо ценное, предложите заполнить соответствующую форму для доступа.</p> <p>Для добавления форм Вам необходимо в модуле Опросные формы добавить соответствующую форму, сформировать код действием [Получить скрипт] и включить его на Ваш сайт.</p> ", successPercents.ToString("F")); } }
/// <summary> /// Generates the counter result. /// </summary> /// <param name="counter">The counter.</param> /// <param name="siteDomain">The site domain.</param> private void GenerateCounterResult(ref CheckSiteStatus counter, tbl_SiteDomain siteDomain, bool isNotFound = false) { if (!counter.ErrorLinks.Any()) { counter.Score = 50; counter.ErrorTypeClass = "success"; try { Uri siteUrl = GetDomainUrl(siteDomain.Domain); if (IsLeadForceDomain(siteUrl)) { siteDomain.StatusID = (int)SiteDomainStatus.LeadForceDomain; if (isNotFound) { counter.Message = "Домен найден, но не привязан к мини сайту"; } else { counter.Message = string.Format("Счетчик найден. Проверено {0} страниц сайта.", counter.SuccessLinks.Count); } } else { siteDomain.StatusID = (int)SiteDomainStatus.Checking; counter.Message = string.Format("Счетчик найден. Проверено {0} страниц сайта.", counter.SuccessLinks.Count); } } catch (Exception ex) { Log.Error("Ошибка проверки домена LeadForce", ex); siteDomain.StatusID = (int)SiteDomainStatus.Checking; } Update(siteDomain); } else { siteDomain.StatusID = (int)SiteDomainStatus.CheckingFailed; Update(siteDomain); counter.ErrorTypeClass = "error"; counter.Message = string.Format( @"Счетчик не найден на {0} страницах из {1} проверенных. <a href=""javascript:;"" onclick=""$('.checkedLinks').show();"">Подробнее...</a><div style=""display:none"" class=""checkedLinks""><br/>{2}<br/></div><br/>Для установки счетчика Вам необходимо подключить к Вашему сайту код: <div class=""row""> <label>Код счетчика (часть 1):</label><br /> <span class=""note"">(размещать в <head> или в начале документа)</span> <table class=""tbl-counter-code""> <tr> <td><pre><code>{3}</code></pre></td> </tr> </table> </div> <div class=""row""> <label>Код счетчика (часть 2):</label><br /> <span class=""note"">(размещать в конце файла перед </body>)</span> <table class=""tbl-counter-code""> <tr> <td><pre><code>{4}</code></pre></td> </tr> </table> </div>", counter.ErrorLinks.Count, counter.ErrorLinks.Count + counter.SuccessLinks.Count, string.Join("<br/> ", counter.ErrorLinks.Select(o => string.Format("<a href=\"{0}\" target=\"_blank\">{0}</a>", o))), HttpUtility.HtmlEncode(ScriptTemplates.Counter(siteDomain.SiteID)), HttpUtility.HtmlEncode(ScriptTemplates.Script(true))); } }
/// <summary> /// Checks all. /// </summary> /// <param name="siteDomain">The site domain.</param> /// <returns></returns> public List <CheckSiteStatus> CheckAll(tbl_SiteDomain siteDomain) { Uri siteUrl = GetDomainUrl(siteDomain.Domain); try { if (IsLeadForceDomain(siteUrl)) { using (var mgr = new ServerManager()) { var isChanged = false; var site = mgr.Sites.FirstOrDefault(o => o.Name == Settings.CMSSiteHost); if (site != null && !site.Bindings.Any(o => o.Host == siteUrl.Host)) { var host = siteUrl.Host.Replace("www.", string.Empty); if (!host.ToLower().StartsWith("xn--")) { Binding binding = site.Bindings.CreateElement(); binding.Protocol = "http"; binding.BindingInformation = "*:80:" + host; site.Bindings.Add(binding); binding = site.Bindings.CreateElement(); binding.Protocol = "http"; binding.BindingInformation = "*:80:www." + host; site.Bindings.Add(binding); isChanged = true; } } if (site != null && !string.IsNullOrEmpty(siteDomain.Aliases)) { foreach (string alias in siteDomain.Aliases.Split(';')) { var aliasUrl = GetDomainUrl(alias.Trim()); if (!site.Bindings.Any(o => o.Host == aliasUrl.Host)) { var host = aliasUrl.Host.Replace("www.", string.Empty); if (!host.ToLower().StartsWith("xn--")) { Binding binding = site.Bindings.CreateElement(); binding.Protocol = "http"; binding.BindingInformation = "*:80:" + host; site.Bindings.Add(binding); binding = site.Bindings.CreateElement(); binding.Protocol = "http"; binding.BindingInformation = "*:80:www." + host; site.Bindings.Add(binding); isChanged = true; } } } } if (isChanged) { mgr.CommitChanges(); Thread.Sleep(2000); } } } } catch (Exception ex) { Log.Error("Ошибка операции bindings", ex); } var result = new List <CheckSiteStatus>(); var counter = new CheckSiteStatus() { SuccessLinks = new List <string>(), ErrorLinks = new List <string>() }; var aliases = new CheckSiteStatus() { SuccessLinks = new List <string>(), ErrorLinks = new List <string>() }; var formsExceptCallOnClosing = new CheckSiteStatus() { SuccessLinks = new List <string>(), ErrorLinks = new List <string>() }; var formsCallOnClosing = new CheckSiteStatus() { SuccessLinks = new List <string>(), ErrorLinks = new List <string>() }; var formCodes = new List <string>(); var htmlPage = GetPageFromUrl(siteUrl.ToString()); if (htmlPage.Contains("#LFSiteNotFound#")) { GenerateCounterResult(ref counter, siteDomain, true); result.Add(counter); return(result); } ProceedPage(siteDomain.SiteID, siteUrl.ToString(), htmlPage, ref counter, ref formsExceptCallOnClosing, ref formsCallOnClosing, ref formCodes); if (!string.IsNullOrEmpty(siteDomain.Aliases)) { foreach (string alias in siteDomain.Aliases.Split(';')) { try { var aliasPage = GetPageFromUrl(alias.StartsWith("http") ? alias : "http://" + alias); if (aliasPage.Replace(alias, string.Empty) != htmlPage.Replace(siteDomain.Domain, string.Empty)) { aliases.ErrorLinks.Add(alias); } else { aliases.SuccessLinks.Add(alias); } } catch { aliases.ErrorLinks.Add(alias); } } } var links = DocumentLinks(htmlPage); foreach (string link in links) { var tmpLink = link; if (!tmpLink.StartsWith("http")) { tmpLink = siteUrl.AbsoluteUri + link; } tmpLink = HttpUtility.HtmlDecode(tmpLink); while (tmpLink.IndexOf("//") != -1) { tmpLink = tmpLink.Replace("//", "/"); } tmpLink = tmpLink.Replace(":/", "://"); if (tmpLink.StartsWith("http") && tmpLink.ToLower().Contains(siteUrl.Host) && !tmpLink.ToLower().Contains("javascript") && !tmpLink.ToLower().Contains("mailto:")) { try { htmlPage = GetPageFromUrl(tmpLink); } catch (Exception ex) { Log.Error(string.Format("Ошибка обработки ссылки {0}", tmpLink), ex); htmlPage = string.Empty; } ProceedPage(siteDomain.SiteID, tmpLink, htmlPage, ref counter, ref formsExceptCallOnClosing, ref formsCallOnClosing, ref formCodes); } } GenerateCounterResult(ref counter, siteDomain); result.Add(counter); if (!string.IsNullOrEmpty(siteDomain.Aliases)) { GenerateAliasesResult(ref aliases); result.Add(aliases); siteDomain.Aliases = string.Join(";", aliases.SuccessLinks); } GenerateFormsExceptCallOnClosingResult(ref formsExceptCallOnClosing); result.Add(formsExceptCallOnClosing); GenerateFormsCallOnClosingResult(ref formsCallOnClosing); result.Add(formsCallOnClosing); siteDomain.TotalPageCount = counter.SuccessLinks.Count + counter.ErrorLinks.Count; siteDomain.PageCountWithCounter = counter.SuccessLinks.Count; siteDomain.PageCountWithForms = formsExceptCallOnClosing.SuccessLinks.Count; siteDomain.PageCountWithOnClosingForms = formsCallOnClosing.SuccessLinks.Count; ProceedFormCodes(formCodes, siteDomain); if (result.Sum(o => o.Score) == 100) { siteDomain.Note = "Подключение домена выполнено полностью"; } else { siteDomain.Note = string.Format("Статус подключения домена: {0} из 100%", result.Sum(o => o.Score)); } Update(siteDomain); return(result); }