예제 #1
0
        /// <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));
            }
        }
예제 #2
0
 /// <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));
     }
 }
예제 #3
0
        /// <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>
";
            }
        }
예제 #4
0
        /// <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"));
            }
        }
예제 #5
0
        /// <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"">(размещать в &lt;head&gt; или в начале документа)</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"">(размещать в конце файла перед &lt;/body&gt;)</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)));
            }
        }
예제 #6
0
        /// <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);
        }