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); }
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); }