예제 #1
0
        private static AvitoAds createAds(RootParsingObject discont, FullCatalogRoot fullCatalog,
                                          DateTime startTime)
        {
            var Ads = new AvitoAds();

            Ads.StartTime = startTime;

            var menWomenOnlyListings = discont.listings.FindAll(x => x.category != "kids");
            //var listingsMoreThan2SizesAvailable = menWomenOnlyListings.FindAll(x => x.sizes.Count > 2);
            var listings = menWomenOnlyListings;

            listings = listings.OrderBy(x => x.sku).ToList();
            var listingCount = listings.Count;

            for (int i = 0; i < listingCount; i++)
            {
                var     sneaker   = listings[i];
                var     fcSneaker = fullCatalog.records.Find(x => x.sku == sneaker.sku);
                AvitoAd Ad        = GetAdFromSneaker(sneaker, fcSneaker, Ads.StartTime, Ads.AdList.Count + 1, listingCount);
                if (Ad != null)
                {
                    Ads.AdList.Add(Ad);
                }
            }
            _logger.Info("Кол-во листингов: " + listingCount);
            _logger.Info("Кол-во объявлений: " + Ads.AdList.Count);
            return(Ads);
        }
        private static AvitoAds createAds(Model.AllStock.AllStockRoot allstock, FullCatalogRoot fullCatalog, DateTime startTime)
        {
            var Ads = new AvitoAds();

            Ads.StartTime = startTime;
            for (int i = 0; i < allstock.sneakers.Count; i++)
            {
                var     sneaker   = allstock.sneakers[i];
                var     fcSneaker = fullCatalog.records.Find(x => x.sku == sneaker.sku);
                AvitoAd Ad        = GetAdFromSneaker(sneaker, fcSneaker, Ads.StartTime, i + 1, allstock.sneakers.Count); //тут есть ошибка. У аллстока может быть больше позиций чем для авито, так как некоторые ад могут нул вернуть и не добавиться. По правильному нужно сначала сделать первый прогон, заполнить все объявления и только потом добавлять дату постинга (зная точно кол-во объявлений)
                if (Ad != null)
                {
                    Ads.AdList.Add(Ad);
                }
            }
            return(Ads);
        }
예제 #3
0
        private static AvitoAd GetAdFromSneaker(Listing sneaker, FullCatalogRecord fcSneaker, DateTime startTime,
                                                int position, int count)
        {
            AvitoAd Ad = new AvitoAd();

            if (fcSneaker == null)
            {
                _logger.Warn("is not exist in fullcatalog sku:" + sneaker.sku);
                return(null);
            }

            _logger.Info("sku: " + sneaker.sku + "  title: " + fcSneaker.title);

            if (String.IsNullOrWhiteSpace(sneaker.category))
            {
                _logger.Warn("Skip sneaker. Reason: category is empty");
                return(null);
            }
            else if (sneaker.category == "kids")
            {
                _logger.Info("skip sneaker. Reason: kids category");
                return(null);
            }

            if (sneaker.sizes == null)
            {
                _logger.Warn("Skip sneaker. Reason: sizes is empty");
                return(null);
            }

            if (sneaker.sizes.Count == 0)
            {
                _logger.Warn("Skip sneaker. Reason: sizes is empty. Sku:" + sneaker.sku);
                return(null);
            }

            if (fcSneaker.images == null)
            {
                _logger.Warn("Skip sneaker. Reason: images is empty. Sku: " + sneaker.sku);
                return(null);
            }
            else if (fcSneaker.images.Count == 0)
            {
                _logger.Warn("Skip sneaker. Reason: images is empty. Sku: " + sneaker.sku);
                return(null);
            }

            Ad.Id = sneaker.sku;

            //DateBegin

            /* нужно все объявления размазать на месяц (ну пусть будет на 30 дней).
             * допустим если у меня есть 3000 объявлений то это значит что нужно постить по 100 в день
             * Постить будем допустим с 7.00 утра 23.59. Получается 17 часов. это 61200 секунд.
             * Получается объявление нужно постить каждые 612 секунд, начиная с 7 утра
             *
             * В сутках 24 часа, это 86400 секунд.
             * В 30 днях 2 592 000 секунд
             * То есть если у нас есть 3000 объявлений, значит начиная с текущего момента нужно постить объявление каждые 864 секунды
             */
            double delay    = 2592000 / count * position; //todo сделать распределение на 10 часов а не 24
            var    intDelay = (int)delay;

            //Ad.DateBegin = startTime.AddSeconds(intDelay); //todo datebegin можно определить только после того, как известно точное кол-во выгружаемых позиций (с учетом отфильтрованных невалидных)
            //Ad.DateBegin = startTime;
            Ad.DateBegin    = GetDateBegin(startTime, count, position, DaysPeriod, EndHour, StartHour);
            Ad.ManagerName  = "Роман";
            Ad.ContactPhone = "88002001121";
            Ad.AllowEmail   = "Да";
            //Ad.Region = "Самарская область";
            Ad.City = "Москва";

            //goods type
            var category = fcSneaker.category;

            if (category == "men")
            {
                Ad.Category  = "Одежда, обувь, аксессуары";
                Ad.GoodsType = "Мужская одежда";
            }
            else if (category == "women")
            {
                Ad.Category  = "Одежда, обувь, аксессуары";
                Ad.GoodsType = "Женская одежда";
            }
            else if (category == "kids")
            {
                _logger.Info("skip sneaker. Reason: kids category");
                return(null);
            }
            else
            {
                _logger.Warn("null or wrong category");
                return(null);
            }

            Ad.Apparel = "Обувь";

            //size
            //буду брать случайный русский размер из списка размеров, нужно будет округлить до целого
            var rnd2              = new Random().Next(sneaker.sizes.Count - 1); //todo брать только артикулы у которых 3 или больше размеров в наличии
            var sizeUsAllStock    = sneaker.sizes[rnd2];
            var sizeAllStock      = new Size(sneaker.brand, sneaker.category, sizeUsAllStock.us, null, null, null, null);
            var sizeFromSizeChart = SizeChart.GetSizeStatic(sizeAllStock);

            if (sizeFromSizeChart == null)
            {
                Ad.Size = "Без размера";
            }
            else
            {
                var    ruSize       = sizeFromSizeChart.ru.Replace(".", ",");
                double doubleRuSize = 0;
                if (Double.TryParse(ruSize, out doubleRuSize))
                {
                    Ad.Size = Math.Round(doubleRuSize, 0).ToString();
                }
                else
                {
                    Ad.Size = "Без размера";
                }
            }
            if (Ad.Size == "Без размера")
            {
                _logger.Error("Wrong size: " + sizeUsAllStock.us);
                return(null);
                //if (sneaker.category == "men")
                //    Ad.Size = "42";
                //else if (sneaker.category == "women")
                //    Ad.Size = "37";
                //else if (sneaker.category == "kids")
                //    Ad.Size = "35";
            }

            //title
            var type = string.Empty;

            if (!string.IsNullOrWhiteSpace(fcSneaker.type))
            {
                type = fcSneaker.type + " ";
            }
            Ad.Title = "Новые " + type + sneaker.title.ToLower();
            if (Ad.Title.Length > 50)
            {
                Ad.Title = Ad.Title.Substring(0, 50);
            }
            Ad.Title = Helper.UpperFirstCharInWord(Ad.Title);

            //description
            var br   = "\n";
            var desc = "<![CDATA[" + br;

            if (fcSneaker.type == null)
            {
                fcSneaker.type = String.Empty;
            }
            desc += "<p>Новые оригинальные " + fcSneaker.type.ToLower() + " " + sneaker.title.ToUpper() + "</p>" + br;
            desc += "<p>Артикул: " + sneaker.sku + "</p>" + br;
            desc += "<p>В оригинальной упаковке Nike.</p>" + br;
            desc += "<p>БЕСПЛАТНАЯ доставка по Москве в день заказа или на следующий день</p>" + br;
            desc += "<p>Работаем 7 дней в неделю, без праздников и выходных</p>" + br;
            desc += "<p>Доставка по России 3-5 дней компанией СДЭК.</p>" + br;
            desc += "<p>Стоимость доставки по РФ - 300 рублей.</p>" + br;
            desc += "<p>Доставка по РФ только по 100% предоплате, наложенным платежом не отправляем</p>" + br;
            desc += "<p>Работаем с 2014 года, более 4000 моделей в ассортименте. Можете перейти в магазин авито (страница Контакты), потом на сайт и в группу Вконтакте, чтобы убедиться в том, что мы ПРОДАЕМ ТОЛЬКО ОРИГИНАЛЬНУЮ ОБУВЬ. НИКАКИХ ПОДДЕЛОК И РЕПЛИК!</p>" + br;
            desc += "<p>В нашей группе Вконтакте более 70 реальных отзывов от клиентов!</p>" + br;
            desc += "<p>Размеры в наличии:</p>" + br;
            desc += "<ul>" + br;
            foreach (var size in sneaker.sizes)
            {
                var scSize = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, null, null, null, null));
                if (scSize != null)
                {
                    desc += "<li>" + scSize.GetAllSizeString() + "</li>" + br;
                }
            }
            desc          += "</ul>" + br;
            desc          += "<p>Уточняйте наличие размеров.</p>" + br;
            desc          += "<p>Если размера нет в наличии, возможно его можно привезти под заказ. Срок поставки товара под заказ: 7-10 дней. </p>" + br;
            desc          += "<p>Sneaker Icon - это большой выбор оригинальной брендовой обуви Nike и Jordan. Кроссовки, кеды, бутсы, футзалки, шиповки, сланцы, ботинки и другие типы обуви</p>" + br;
            desc          += "<p>БОЛЬШИЕ РАЗМЕРЫ: доставляем под заказ обувь до 55 размера, а также обувь двойной полноты стопы и другие редкие модели и размеры</p>" + br;
            desc          += "<p>ДЛЯ СПОРТИВНЫХ КОМАНД: подбираем полные комплекты обуви, одежды и сопутствующих товаров для спортивных команд</p>" + br;
            desc          += "<p>ДЛЯ ОПТОВИКОВ: отправляем в регионы оптом брендовую обувь, одежду и аксессуары по оптовым ценам.</p>" + br;
            desc          += "<p>Звоните или пишите в сообщения Авито по всем вопросам</p>" + br;
            desc          += "]]>";
            Ad.Description = desc;

            //price
            Ad.Price = (int)sneaker.price + MARGIN;

            Ad.Images = fcSneaker.images;

            return(Ad);
        }
        private static void CreateAd(AvitoAd ad, XmlDocument document)
        {
            var adXml = document.CreateElement("Ad");


            XmlNode ParamAdXml = document.CreateElement("Id"); // даём имя

            ParamAdXml.InnerText = ad.Id;                      // и значение
            adXml.AppendChild(ParamAdXml);

            ParamAdXml           = document.CreateElement("DateBegin");                // даём имя
            ParamAdXml.InnerText = ad.DateBegin.ToString("yyyy-MM-ddTHH:mm:ss+04:00"); // и значение
            adXml.AppendChild(ParamAdXml);

            ParamAdXml           = document.CreateElement("AllowEmail"); // даём имя
            ParamAdXml.InnerText = ad.AllowEmail;
            adXml.AppendChild(ParamAdXml);

            //ManagerName
            ParamAdXml           = document.CreateElement("ManagerName"); // даём имя
            ParamAdXml.InnerText = ad.ManagerName;
            adXml.AppendChild(ParamAdXml);

            //ContactPhone
            ParamAdXml           = document.CreateElement("ContactPhone"); // даём имя
            ParamAdXml.InnerText = ad.ContactPhone;
            adXml.AppendChild(ParamAdXml);

            //Region
            ParamAdXml           = document.CreateElement("Region"); // даём имя
            ParamAdXml.InnerText = ad.Region;
            adXml.AppendChild(ParamAdXml);

            //Region
            if (!String.IsNullOrWhiteSpace(ad.City))
            {
                ParamAdXml           = document.CreateElement("City"); // даём имя
                ParamAdXml.InnerText = ad.City;
                adXml.AppendChild(ParamAdXml);
            }

            //Category
            ParamAdXml           = document.CreateElement("Category"); // даём имя
            ParamAdXml.InnerText = ad.Category;
            adXml.AppendChild(ParamAdXml);

            //GoodsType
            ParamAdXml           = document.CreateElement("GoodsType"); // даём имя
            ParamAdXml.InnerText = ad.GoodsType;
            adXml.AppendChild(ParamAdXml);

            //Apparel
            ParamAdXml           = document.CreateElement("Apparel"); // даём имя
            ParamAdXml.InnerText = ad.Apparel;
            adXml.AppendChild(ParamAdXml);

            //Size
            ParamAdXml           = document.CreateElement("Size"); // даём имя
            ParamAdXml.InnerText = ad.Size;
            adXml.AppendChild(ParamAdXml);

            //Title
            ParamAdXml           = document.CreateElement("Title"); // даём имя
            ParamAdXml.InnerText = ad.Title;
            adXml.AppendChild(ParamAdXml);

            //Description
            ParamAdXml           = document.CreateElement("Description"); // даём имя
            ParamAdXml.InnerText = ad.Description;
            adXml.AppendChild(ParamAdXml);

            //Price
            ParamAdXml           = document.CreateElement("Price"); // даём имя
            ParamAdXml.InnerText = ad.Price.ToString();
            adXml.AppendChild(ParamAdXml);

            //Images
            ParamAdXml = document.CreateElement("Images");
            foreach (var image in ad.Images)
            {
                var          imageXml = document.CreateElement("Image"); // даём имя
                XmlAttribute url      = document.CreateAttribute("url");
                url.Value = image;
                imageXml.Attributes.Append(url);
                ParamAdXml.AppendChild(imageXml);
            }
            adXml.AppendChild(ParamAdXml);

            document.DocumentElement.AppendChild(adXml);
        }
        private static AvitoAd GetAdFromSneaker(Model.AllStock.AllStockSneaker sneaker, FullCatalogRecord fcSneaker, DateTime startTime, int position, int count)
        {
            AvitoAd Ad = new AvitoAd();

            if (fcSneaker.images == null)
            {
                return(null);
            }
            if (fcSneaker.images.Count == 0)
            {
                return(null);
            }
            if (String.IsNullOrWhiteSpace(sneaker.category))
            {
                return(null);
            }
            if (sneaker.sizes == null)
            {
                return(null);
            }
            if (sneaker.sizes.Count == 0)
            {
                return(null);
            }

            Ad.Id = sneaker.sku;

            //DateBegin

            /* нужно все объявления размазать на месяц (ну пусть будет на 30 дней).
             * допустим если у меня есть 3000 объявлений то это значит что нужно постить по 100 в день
             * Постить будем допустим с 7.00 утра 23.59. Получается 17 часов. это 61200 секунд.
             * Получается объявление нужно постить каждые 612 секунд, начиная с 7 утра
             *
             * В сутках 24 часа, это 86400 секунд.
             * В 30 днях 2 592 000 секунд
             * То есть если у нас есть 3000 объявлений, значит начиная с текущего момента нужно постить объявление каждые 864 секунды
             */
            double delay    = 2592000 / count * position;
            var    intDelay = (int)delay;

            //Ad.DateBegin = startTime.AddSeconds(intDelay);
            Ad.DateBegin    = startTime;
            Ad.ManagerName  = "Евгений";
            Ad.ContactPhone = "88002001121";
            Ad.AllowEmail   = "Да";
            Ad.Region       = "Москва";


            //goods type
            if (sneaker.category == "men")
            {
                Ad.Category  = "Одежда, обувь, аксессуары";
                Ad.GoodsType = "Мужская одежда";
            }
            else if (sneaker.category == "women")
            {
                Ad.Category  = "Одежда, обувь, аксессуары";
                Ad.GoodsType = "Женская одежда";
            }
            else if (sneaker.category == "kids")
            {
                Ad.Category = "Детская одежда и обувь";
                var rnd = new Random().NextDouble();
                if (rnd > 0.5)
                {
                    Ad.GoodsType = "Для девочек";
                }
                else
                {
                    Ad.GoodsType = "Для мальчиков";
                }
            }

            Ad.Apparel = "Обувь";

            //size
            //буду брать случайный русский размер из списка размеров, нужно будет округлить до целого
            var rnd2              = new Random().Next(sneaker.sizes.Count - 1);
            var sizeUsAllStock    = sneaker.sizes[rnd2];
            var sizeAllStock      = new Size(sneaker.brand, sneaker.category, sizeUsAllStock.us, null, null, null, null);
            var sizeFromSizeChart = SizeChart.GetSizeStatic(sizeAllStock);

            if (sizeFromSizeChart == null)
            {
                Ad.Size = "Без размера";
            }
            else
            {
                var    ruSize       = sizeFromSizeChart.ru.Replace(".", ",");
                double doubleRuSize = 0;
                if (Double.TryParse(ruSize, out doubleRuSize))
                {
                    Ad.Size = Math.Round(doubleRuSize, 0).ToString();
                }
                else
                {
                    Ad.Size = "Без размера";
                }
            }
            if (Ad.Size == "Без размера")
            {
                if (sneaker.category == "men")
                {
                    Ad.Size = "42";
                }
                else if (sneaker.category == "women")
                {
                    Ad.Size = "37";
                }
                else if (sneaker.category == "kids")
                {
                    Ad.Size = "35";
                }
            }

            //title
            Ad.Title = "Новые оригинальные " + sneaker.title.ToUpper() + " " + sneaker.sku;
            if (Ad.Title.Length > 50)
            {
                Ad.Title = Ad.Title.Substring(0, 50);
            }
            //Ad.Title = Ad.Title.ToLower();

            //description
            var br   = "\n";
            var desc = "<![CDATA[" + br;

            if (fcSneaker.type == null)
            {
                fcSneaker.type = String.Empty;
            }
            desc += "<p>Новые оригинальные " + fcSneaker.type.ToLower() + " " + sneaker.title.ToUpper() + "</p>" + br;
            desc += "<p>Артикул: " + sneaker.sku + "</p>" + br;
            desc += "<p>В оригинальной упаковке Nike.</p>" + br;
            desc += "<p>БЕСПЛАТНАЯ доставка по Москве</p>" + br;
            desc += "<p>Доставка по России 3-5 дней компанией СДЭК.</p>" + br;
            desc += "<p>Стоимость доставки по РФ - 300 рублей.</p>" + br;
            desc += "<p>Доставка в регионы только по 100% предоплате, наложенным платежом не отправляем</p>" + br;
            desc += "<p>Работаем с 2012 года, более 4000 моделей в ассортименте. Можете перейти в магазин авито (страница Контакты), потом на сайт и в группу Вконтакте, чтобы убедиться в том, что мы продаем только оригинальную обувь. Никаких подделок и реплик!</p>" + br;
            desc += "<p>В нашей группе Вконтакте более 70 реальных отзывов от клиентов!</p>" + br;
            desc += "<p>Размеры в наличии:</p>" + br;
            desc += "<ul>" + br;
            foreach (var size in sneaker.sizes)
            {
                var scSize       = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, null, null, null, null));
                var priceSize    = size.offers[0].price_usd_with_delivery_to_usa_and_minus_vat;
                var priceSizeRub = (int)CurrencyRate.ConvertCurrency("USD", "RUB", priceSize) + MARGIN;
                if (scSize != null)
                {
                    desc += "<li>" + scSize.GetAllSizeString() + ". Цена:" + priceSizeRub + "</li>" + br;
                }
            }
            desc          += "</ul>" + br;
            desc          += "<p>Уточняйте наличие размеров.</p>" + br;
            desc          += "<p>Если размера нет в наличии, можем его привезти под заказ. Срок поставки товара под заказ: 7-10 дней. </p>" + br;
            desc          += "<p>Sneaker Icon - это большой выбор оригинальной брендовой обуви Nike и Jordan. Кроссовки, кеды, бутсы, футзалки, шиповки, сланцы, ботинки и другие типы обуви</p>" + br;
            desc          += "<p>Звоните или пишите в сообщения Авито по всем вопросам</p>" + br;
            desc          += "]]>";
            Ad.Description = desc;

            //price
            var priceUsd  = sneaker.GetMinPrice();
            var priceRub  = CurrencyRate.ConvertCurrency("USD", "RUB", priceUsd);
            var pricetest = (int)priceRub + MARGIN;

            Ad.Price = (int)Math.Round(priceRub, 0) + MARGIN;

            Ad.Images = fcSneaker.images;

            return(Ad);
        }