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 void WorkForStock(RootParsingObject rootParsingObject, bool isRewrite, int numberCatalog, string[] containsImage = null) { foreach (var listing in rootParsingObject.listings) { for (var i = 0; i < listing.images.Count; i++) { var filename = listing.sku + "-" + (i + 1) + ".jpg"; if (isRewrite) { DownloadImageFile(numberCatalog, filename, listing.images[i]); } else { if (containsImage == null) { throw new NullReferenceException("нет данных по containsImage или numberCatalog"); } if (!containsImage.Contains(filename)) { DownloadImageFile(numberCatalog, filename, listing.images[i]); } else { Logger.Debug("Изображение " + filename + " актуально"); } } } } }
private void ValidateShop(RootParsingObject shopParser) { var shopCatalog = ShopCatalog; var folder = ValidateShopsLocalFolder; var validatedShop = new RootParsingObject(); validatedShop.market_info = shopParser.market_info; //string br = "\n"; log = DateTime.Now.ToString() + br; int i = 1; foreach (var listing in shopParser.listings) { string listingLog = String.Empty; var validListing = ValidateListing(listing); if (validListing != null) { validListing.position = i; i++; validatedShop.listings.Add(validListing); } } var localPath = folder + shopParser.market_info.name; validatedShop.SaveLocalFile(localPath); SaveLogShopValidate(this.log, validatedShop.market_info.name, localPath); //return validatedShop; }
protected new void SaveJson(RootParsingObject json, string filename, string folder, string name) { //подгружаем из конфига данные фтп var ftpHost = Config.GetConfig().FtpHostAllBrands; var ftpUser = Config.GetConfig().FtpUserAllBrands; var ftpPass = Config.GetConfig().FtpPassAllBrands; if (!Directory.Exists(folder)) { System.IO.Directory.CreateDirectory(folder); Helper.CreateDirectoryFtp(name, ftpHost, ftpUser, ftpPass); } var localFileName = folder + filename; //сохраняем на яндекс.диск файл var textJson = JsonConvert.SerializeObject(json); System.IO.File.WriteAllText(localFileName, textJson); //загружаем на ftp файл var ftpFileName = name + "/" + filename; Helper.LoadFileToFtp(localFileName, ftpFileName, ftpHost, ftpUser, ftpPass); }
public List <Listing> CreateExportLisings(RootParsingObject Json) { var listings = new List <Listing>(); int sizesCount = 0; foreach (var jsonListing in Json.listings) { //var price = ((jsonListing.price + DELIVERY_TO_USA + MARZHA) * 1.18); //if (price < jsonListing.old_price) //{ var brand = jsonListing.brand.ToUpper(); if (!brand.Contains("NIKE") && !brand.Contains("JORDAN")) { listings.Add(jsonListing); sizesCount += jsonListing.sizes.Count; } //} } Program.Logger.Info("Листингов для выгрузки: " + listings.Count); Program.Logger.Info("Размеров для выгрузки:" + sizesCount); //посчитаем кол-во размеров выгружаемых return(listings); }
private void AddDbSneaker(DbRoot db, Listing listing, RootParsingObject shop, Shop shopCatalogItem) { log += "Add Sneaker. sku:" + listing.sku + " Title:" + listing.title + br; var sneaker = new DbSneaker(); sneaker.Id = db.Sneakers.Count + 1; sneaker.Brand = listing.brand; sneaker.Sku = listing.sku; sneaker.Titles.Add(listing.title); sneaker.Color = listing.colorbrand; sneaker.Category = listing.category; sneaker.Links.Add(listing.url); if (listing.images.Count > 0) { var imageCollection = new DbImageCollection(); imageCollection.ShopName = shop.market_info.name; foreach (var image in listing.images) { var dbimg = new DbImage(); dbimg.SiteUrl = image; imageCollection.Images.Add(dbimg); } //imageCollection.Images = listing.images; //todo менять ссылки из магазины на ссылки с нашего сервака //todo качать фотки в момент парсинга sneaker.ImageCollectionList.Add(imageCollection); } foreach (var size in listing.sizes) { var dbSize = GetDbSize(sneaker, size, listing, shop, shopCatalogItem); sneaker.Sizes.Add(dbSize); } db.Sneakers.Add(sneaker); }
public void ValidateShop(string name) { var shop = ShopCatalog.markets.Find(x => x.name == name); RootParsingObject market = RootParsingObject.ReadAllBrandsShopFromFtp(shop); ValidateShop(market); }
protected void SaveNikeJson(RootParsingObject json, string filename, string folder, string name) { var nikeJson = new RootParsingObject(); nikeJson.market_info = json.market_info; nikeJson.listings = json.listings.FindAll(x => x.brand.ToLower() == "nike" || x.brand.ToLower() == "jordan"); base.SaveJson(nikeJson, filename, folder, name); }
public void Initialize() { var appSettings = ConfigurationManager.AppSettings; string ftpHost = appSettings["ftpHostParsing"]; string ftpUser = appSettings["ftpUserParsing"]; string ftpPass = appSettings["ftpPassParsing"]; Helper.GetFileFromFtp(FOLDER + JSON_FILENAME, FTP_FILENAME, ftpHost, ftpUser, ftpPass); Json = DeserializeJson(FOLDER + JSON_FILENAME); }
private void WriteCountListingAndSizesInFile(RootParsingObject Json) { int i = 0; foreach (var item in Json.listings) { i += item.sizes.Count; } Program.Logger.Info("В исходном файле листингов:" + Json.listings.Count); Program.Logger.Info("В исходном файле размеров:" + i); }
public void DeserializeJson(string filename) { if (File.Exists(filename)) { var textJson = System.IO.File.ReadAllText(filename); _json = JsonConvert.DeserializeObject <RootParsingObject>(textJson); } else { throw new Exception("file not exist"); } }
private List <ShopifyRecord> CreateShopifyRecords(RootParsingObject discontSamara) { var shopifyRecords = new List <ShopifyRecord>(); foreach (var listing in discontSamara.listings) { var shopifyRecordsListing = CreateShopifyListingRecords(listing); if (shopifyRecordsListing != null) { shopifyRecords.AddRange(shopifyRecordsListing); } } return(shopifyRecords); }
private static AllStockRoot CreateAllStock(FullCatalog fullCatalog, ShopCatalogRoot jsonCatalog) { AllStockRoot allstock = new AllStockRoot(); foreach (var jsonMarket in jsonCatalog.markets) { RootParsingObject market = Parsing.Model.RootParsingObject.ReadJsonMarketFromFtp(jsonMarket); if (market != null) { AddMarketToAllStock(market, fullCatalog, allstock, jsonMarket); } } allstock.update_time = DateTime.Now; return(allstock); }
private static AllStockOffer CreateOffer(Listing listing, RootParsingObject market, Shop jsonMarket) { if (listing.sku == "852628-001") { bool test = true; } var offer = new AllStockOffer(); offer.url = listing.url; offer.price = listing.price; offer.old_price = listing.old_price; offer.currency = jsonMarket.currency; //offer.currency = market.market_info.currency; offer.stock_name = market.market_info.name; offer.price_usd_with_delivery_to_usa_and_minus_vat = AllStockExporter.GetAllStockPrice(offer.price, offer.currency, jsonMarket.delivery_to_usa, jsonMarket.vat_value); return(offer); }
protected void SaveJson(RootParsingObject json, string filename, string folder, string name) { var localFileName = folder + filename; //сохраняем на яндекс.диск файл var textJson = JsonConvert.SerializeObject(json); System.IO.File.WriteAllText(localFileName, textJson); //подгружаем из конфига данные фтп var appSettings = ConfigurationManager.AppSettings; var ftpHost = appSettings["ftpHostParsing"]; var ftpUser = appSettings["ftpUserParsing"]; var ftpPass = appSettings["ftpPassParsing"]; //загружаем на ftp файл var ftpFileName = name + "/" + filename; Helper.LoadFileToFtp(localFileName, ftpFileName, ftpHost, ftpUser, ftpPass); }
public new void ValidateAllShops() { //загружаем каталог магазинов var shopCatalog = ShopCatalog; foreach (var shop in shopCatalog.markets) { RootParsingObject market = RootParsingObject.ReadAllBrandsShopFromFtp(shop); if (market != null) { var shopValidator = new ShopValidator(); ValidateShop(market); } else { bool test = true; } } }
private void AddShopInfo(DbRoot db, RootParsingObject shop, Shop shopCatalogItem) { foreach (var listing in shop.listings) { var sneaker = db.Sneakers.Find(x => x.Sku == listing.sku); if (sneaker == null) { AddDbSneaker(db, listing, shop, shopCatalogItem); } else { //db.Sneakers.RemoveAll(x => x.Sku == listing.sku); //AddDbSneaker(db, listing, shop, shopCatalogItem); UpdateDbSneaker(db, sneaker, listing, shop, shopCatalogItem); //todo запилить этот метод } } }
public static void ValidateAllShops() { //загружаем каталог магазинов var shopCatalog = ShopCatalogRoot.ReadFromFtp(); foreach (var shop in shopCatalog.markets) { RootParsingObject market = SneakerIcon.Classes.Parsing.Model.RootParsingObject.ReadJsonMarketFromFtp(shop); if (market != null) { var shopValidator = new ShopValidator(); shopValidator.ValidateShop(market, shopCatalog); } else { bool test = true; } } }
private void ValidateShop(RootParsingObject shopParser, ShopCatalogRoot shopCatalog, string folder = _folder) { var validatedShop = new RootParsingObject(); validatedShop.market_info = shopParser.market_info; //string br = "\n"; log = DateTime.Now.ToString() + br; foreach (var listing in shopParser.listings) { string listingLog = String.Empty; var ValidListing = ValidateListing(listing); if (ValidListing != null) { validatedShop.listings.Add(ValidListing); } } validatedShop.SaveLocalFile(folder); SaveLogShopValidate(this.log, validatedShop.market_info.name); //return validatedShop; }
//public RootObjectSaleSivas Json { get; set; } //public List<ListingSaleSivas> ExportListings { get; set; } public void Run() { var appSettings = ConfigurationManager.AppSettings; string ftpHost = appSettings["ftpHostParsing"]; string ftpUser = appSettings["ftpUserParsing"]; string ftpPass = appSettings["ftpPassParsing"]; Helper.GetFileFromFtp(FOLDER + JSON_FILENAME, FTP_FILENAME, ftpHost, ftpUser, ftpPass); RootParsingObject Json = DeserializeJson(JSON_FILENAME); WriteCountListingAndSizesInFile(Json); //пишем на экран сколько в исходном файле листингов и размеров List <Listing> ExportListings = CreateExportLisings(Json); //DownloadImages(ExportListings, IMAGE_PATH); ExportListings = ReplaceImageNames(ExportListings, HTTP_IMAGE_PATH); List <SivasSaleBonanzaRecord> BonanzaRecords = CreateBonanzaRecords(ExportListings); ExportToCSV(FOLDER + CSV_FILENAME, BonanzaRecords); Helper.LoadFileToFtp(FOLDER + CSV_FILENAME, FTP_FOLDER + "/" + CSV_FILENAME, ftpHost, ftpUser, ftpPass); Helper.LoadFileToFtp(FOLDER + CSV_FILENAME2, FTP_FOLDER + "/" + CSV_FILENAME, ftpHost, ftpUser, ftpPass); }
private static List <string> ChangeImageLinksFromShopToImagesFromOurServer(List <string> images, RootParsingObject shop, ShopCatalogRoot shopCatalog, Listing shopRecord) { var imagesFromOurServer = new List <string>(); string host = "http://img.sneaker-icon.ru"; int shopNumber = shopCatalog.markets.Find(x => x.name == shop.market_info.name).number; for (int i = 1; i < images.Count + 1; i++) { string url = host + "/shops/" + shopNumber + "/images/" + shopRecord.sku + "-" + i + ".jpg"; if (NetworkUtils.UrlExists(url)) { imagesFromOurServer.Add(url); } } //ver2.0 var imagesFromOurServer2 = new List <string>(); var ftphost = "ftp://" + Config.GetConfig().FtpHostContabo; var user = Config.GetConfig().FtpUserContabo; var pass = Config.GetConfig().FtpPassContabo; var folder = "shops/" + shopNumber + "/images"; var folderImages = Helper.GetFileListFromDirectory(folder, ftphost, user, pass).ToList(); var skuImages = folderImages.FindAll(x => x.Contains(shopRecord.sku)); foreach (var image in skuImages) { var imageUrl = host + "/" + folder + "/" + image; imagesFromOurServer2.Add(imageUrl); } if (imagesFromOurServer.Count != imagesFromOurServer2.Count) { bool test = true; } return(imagesFromOurServer); }
private static DbSize GetDbSize(DbSneaker sneaker, ListingSize size, Listing listing, RootParsingObject shop, Shop shopCatalogItem) { var dbSize = new DbSize(); dbSize.Us = size.us; dbSize.Eu = size.eu; dbSize.Uk = size.uk; dbSize.Cm = size.cm; dbSize.Ru = size.ru; dbSize.Upc = size.upc; var offer = CreateDbOffer(sneaker, size, listing, shop, shopCatalogItem); dbSize.Offers.Add(offer); return(dbSize); }
private static DbOffer CreateDbOffer(DbSneaker sneaker, ListingSize size, Listing listing, RootParsingObject shop, Shop shopCatalogItem) { var deliveryUs = shopCatalogItem.delivery.Find(x => x.location == "US"); var offer = new DbOffer(); offer.url = listing.url; offer.price = listing.price; offer.old_price = listing.old_price; offer.currency = shopCatalogItem.currency; offer.stock_name = shop.market_info.name; offer.price_usd_with_delivery_to_usa_and_minus_vat = AllStockExporter.GetAllStockPrice(offer.price, offer.currency, deliveryUs.value, deliveryUs.vat); return(offer); }
private static void AddMarketToAllStock(RootParsingObject market, FullCatalog fullCatalog, AllStockRoot allstock, Shop jsonMarket) { foreach (var listing in market.listings) { var sneaker = allstock.sneakers.Find(x => x.sku == listing.sku); //если такого кроссовка еще не существует if (sneaker == null) { //добавляем новый кроссовок в оллсток var fullCatalogSneaker = fullCatalog.sneakers.Find(x => x.sku == listing.sku); if (fullCatalogSneaker == null) { Program.Logger.Warn("sku: " + listing.sku + " does not exist in fullcatalog"); } else { sneaker = new AllStockSneaker(); sneaker.sku = listing.sku; sneaker.brand = fullCatalogSneaker.brand; sneaker.category = Helper.ConvertCategoryRusToEng(fullCatalogSneaker.category); sneaker.title = fullCatalogSneaker.title; if (sneaker.sku == "854261-106") { bool test = true; } foreach (var size in listing.sizes) { var sizeAllStock = CreateSize(size, sneaker, listing, market, jsonMarket); if (sizeAllStock != null) { sneaker.sizes.Add(sizeAllStock); } } if (sneaker.sizes.Count > 0) { allstock.sneakers.Add(sneaker); } } } else { /* Если кроссовок не нул, значит он уже есть в оллстоке * Это значит, что нужно брать каждый размер из листинга, проверять, есть ли этот размер уже в этом кроссовке * Если нет, то создавать размер и оффер * Если размер есть, то к этому размеру создавать еще один оффер. Возможно тут же надо отсортировать офферы, чтобы с меньшей ценой был первым * Если размер уже есть, то смотреть есть ли юпс * Если юпс нет, то добавлять его, если есть проверять, одинаковый ли он, если нет, кидать варнинг */ if (sneaker.sku == "854261-106") { bool test = true; } foreach (var size in listing.sizes) { if (size.us == null) { size.us = SizeConverters.SizeConverter.GetSizeUs(sneaker.brand, sneaker.category, size.eu, size.uk, size.cm); } if (size.us == null) { //значит размер левый или его нет в таблице размеров } else { var sizeAllStock = sneaker.sizes.Find(x => x.us == size.us); if (sizeAllStock == null) { //если размера нет, создаем новый размер sizeAllStock = CreateSize(size, sneaker, listing, market, jsonMarket); if (sizeAllStock != null) { sneaker.sizes.Add(sizeAllStock); } } else { //если такой размер есть, то добавляем оффер и проверяем юпс if (sizeAllStock.upc == null && size.upc != null) { sizeAllStock.upc = size.upc; } var offer = CreateOffer(listing, market, jsonMarket); sizeAllStock.offers.Add(offer); } } } } } //throw new NotImplementedException(); }
private static AllStockSize CreateSize(ListingSize size, AllStockSneaker sneaker, Listing listing, RootParsingObject market, Shop jsonMarket) { var sizeAllStock = new AllStockSize(); if (size.us == null) { size.us = SizeConverters.SizeConverter.GetSizeUs(sneaker.brand, sneaker.category, size.eu, size.uk, size.cm); } if (size.us == null) { //значит размер левый или его нет в таблице размеров return(null); } else { if (listing.category != sneaker.category) { Program.Logger.Warn("wrong category. SKU:" + listing.sku + "\n" + "Listing Category: " + listing.category + ".\n" + "FullCatalog Category:" + sneaker.category + "\n" + "ListingTite: " + listing.title + "\n" + "Listing Link:" + listing.url); return(null); } var schSize = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, size.eu, size.uk, size.cm, size.ru)); if (schSize == null) { Program.Logger.Warn("wrong size. SKU:" + listing.sku + "\n" + "Listing Category: " + listing.category + ".\n" + "FullCatalog Category:" + sneaker.category + "\n" + "ListingTite: " + listing.title + "\n" + "Listing Link:" + listing.url); return(null); } sizeAllStock.us = size.us; sizeAllStock.sku2 = sneaker.sku + "-" + size.us; sizeAllStock.upc = size.upc; var offer = CreateOffer(listing, market, jsonMarket); sizeAllStock.offers.Add(offer); return(sizeAllStock); } }
private void UpdateDbSneaker(DbRoot db, DbSneaker sneaker, Listing listing, RootParsingObject shop, Shop shopCatalogItem) { log += "Update Sneaker. sku:" + sneaker.Sku + " title: " + sneaker.Titles[0] + br; /* логика: * проверяем заголовок, если длиннее, берем его * проверяем остальные элементы, если они не нул, а были нул то берем их * сравниваем категорию листинга и кроссовка, если не совпадают то отклоняем этот листинг (но по идее такого быть не должно */ //title var title = sneaker.Titles.Find(x => x.ToLower() == listing.title.ToLower()); if (title == null) { sneaker.Titles.Add(listing.title); sneaker.Titles = sneaker.Titles.OrderByDescending(x => x.Length).ToList(); } //color if (!string.IsNullOrWhiteSpace(listing.colorbrand)) { if (listing.colorbrand.Length > sneaker.Color.Length) { sneaker.Color = listing.colorbrand; } } //category //если пустая то добавляем if (string.IsNullOrWhiteSpace(sneaker.Category) && !string.IsNullOrWhiteSpace(listing.category)) { sneaker.Category = listing.category; } //если обе непустые сраванием else if (!string.IsNullOrWhiteSpace(sneaker.Category) && !string.IsNullOrWhiteSpace(listing.category)) { if (sneaker.Category != listing.category) { log += "Warn! Other categories. sku: " + sneaker.Sku + " sneaker.Category:" + sneaker.Category + " listing.category:" + listing.category + " listing.url: " + listing.url + br; } } //если обе пустые то else if (string.IsNullOrWhiteSpace(sneaker.Category) && string.IsNullOrWhiteSpace(listing.category)) { log += "Warn: category is empty" + br; } //links sneaker.Links.Add(listing.url); //images var imgCol = new DbImageCollection(); imgCol.ShopName = shopCatalogItem.name; foreach (var lImage in listing.images) { var dbImg = new DbImage(); dbImg.SiteUrl = lImage; imgCol.Images.Add(dbImg); } sneaker.ImageCollectionList.Add(imgCol); //sizes foreach (var lSize in listing.sizes) { //find size var snSize = new DbSize(); if (!string.IsNullOrWhiteSpace(lSize.us)) { snSize = sneaker.Sizes.Find(x => x.Us == lSize.us); //если размера нет, создаем if (snSize == null) { var dbSize = GetDbSize(sneaker, lSize, listing, shop, shopCatalogItem); sneaker.Sizes.Add(dbSize); } //если есть создаем только оффер else { var offer = CreateDbOffer(sneaker, lSize, listing, shop, shopCatalogItem); snSize.Offers.Add(offer); snSize.Offers = snSize.Offers.OrderBy(x => x.price_usd_with_delivery_to_usa_and_minus_vat) .ToList(); } } else { //если юс размера нет, то надо добисать будет код (например для асфальтгольда) throw new Exception("size us is null. Cannot update db sneaker."); } } }
public Catalog ParseCatalogFromJson(RootParsingObject json) { Catalog catalog = new Catalog(); var items = json.listings; foreach (var item in items) { var sneaker = new Sneaker(); sneaker.brand = item.brand; sneaker.link = item.url; sneaker.price = item.price; sneaker.oldPrice = item.old_price; sneaker.sku = item.sku; sneaker.images = item.images; sneaker.color = item.colorbrand; if (item.sizes != null) { if (item.sizes.Count > 0) { //title sneaker.title = item.title; if (!sneaker.title.ToUpper().Contains(item.brand.ToUpper())) { sneaker.title = item.brand.ToUpper() + " " + sneaker.title; } sneaker.ParseTitle(); //categorySneakerFullCatalog if (item.category == "men") { sneaker.category = Settings.CATEGORY_MEN; } else if (item.category == "women") { sneaker.category = Settings.CATEGORY_WOMEN; } else if (item.category == "kids") { sneaker.category = Settings.CATEGORY_KIDS; } //если категория нул, смотрим есть ли артикул в фулкаталоге и заполнена ли у него категория if (String.IsNullOrWhiteSpace(item.category)) { var fullCatalogSneaker = fullCatalog.GetSneakerFromSKU(item.sku); if (fullCatalogSneaker != null) { if (!String.IsNullOrWhiteSpace(fullCatalogSneaker.category)) { sneaker.category = fullCatalogSneaker.category; } } else { bool test = true; } } //если категория нул, то пробуем ее определить по другим размерам if (String.IsNullOrWhiteSpace(sneaker.category)) { if (item.sizes != null) { if (item.sizes.Count > 0) { var sizeitem = item.sizes[0]; sneaker.category = SizeConverters.SizeConverter.GetCategory(sizeitem.us, sizeitem.eu, sizeitem.uk, sizeitem.cm); } } } //Если категория пустая, то дальше нет смысла продолжать if (!String.IsNullOrWhiteSpace(sneaker.category)) { //sizes foreach (var sizeitem in item.sizes) { string sizeUS = String.Empty; if (!String.IsNullOrWhiteSpace(sizeitem.us)) { sizeUS = sizeitem.us; } else if (!String.IsNullOrWhiteSpace(sizeitem.eu)) { var sizes = sizeConverter.sizeChart.sizes.FindAll(x => x.eu == sizeitem.eu); var engCategory = Helper.ConvertCategoryRusToEng(sneaker.category); var size = sizes.Find(x => x.category == engCategory); if (size != null) { sizeUS = size.us; } } else if (!String.IsNullOrWhiteSpace(sizeitem.uk)) { var sizes = sizeConverter.sizeChart.sizes.FindAll(x => x.uk == sizeitem.uk); var engCategory = Helper.ConvertCategoryRusToEng(sneaker.category); var size = sizes.Find(x => x.category == engCategory); if (size != null) { sizeUS = size.us; } } else if (!String.IsNullOrWhiteSpace(sizeitem.cm)) { var sizes = sizeConverter.sizeChart.sizes.FindAll(x => x.cm == sizeitem.cm); var engCategory = Helper.ConvertCategoryRusToEng(sneaker.category); var size = sizes.Find(x => x.category == engCategory); if (size != null) { sizeUS = size.us; } } else { throw new Exception("wrong size"); } if (!String.IsNullOrWhiteSpace(sizeUS)) { SneakerSize size = new SneakerSize(sizeUS); sneaker.sizes.Add(size); } else { Program.Logger.Warn("Wrong size or category. SKU:" + item.sku + " category:" + sneaker.category + " Size: us:" + sizeitem.us + " eu:" + sizeitem.eu + " uk:" + sizeitem.uk + " cm:" + sizeitem.cm); //throw new Exception("Wrong sizeUS"); } } //sizes //sex if (item.sex == "men") { sneaker.sex = Settings.GENDER_MAN; } else if (item.sex == "women") { sneaker.sex = Settings.GENDER_WOMAN; } else if (item.sex == null) { sneaker.sex = null; } else { Program.Logger.Warn("wrong sex: " + item.sku); bool test = true; } //add to catalog if (!catalog.isExistSneakerInCatalog(sneaker)) { catalog.sneakers.Add(sneaker); } } else //если категория нулл { Program.Logger.Warn("wrong category: " + item.sku); } } else { bool test = true; } } else { bool test = true; } } return(catalog); //throw new NotImplementedException(); }
/// <summary> /// метод обновляет принудительно все фотки в фулкаталоге на фотки из магазинов. Эти фотки берутся с нашего сервака для фоток /// метод проходит по всем магазинам и ищет там фотки для артикула, если они есть то загружает их. /// магазины отсортированы в порядке приоритета фотографи. /// если в магазинах нет фоток, то фотки берутся из папки для фоток, загруженных вручную /// </summary> public static void UpdateFullCatalogImages() { /* * Алгоритм обновления изображений: * берем фулкаталог * берем список магазинов * берем только магазины без водяных знаков * желательно чтобы кроссовки были на белом фоне (или на сером, но не стайловые), * стайловые можно в конце добавить. потом опять пройтись по всем магазам и в конец добавить стайловых фоток. * чтобы у кросса например было 4 обычных фотки и потом стайловые дальше шли * также можно сделать приоритет по направлению первого кроссовка * например чтобы в первую очередь брать фотки кросс у которых влево смотрит) * Если нигде кросс не найден, то искать фотки в папке images * туда типа вручную фотки загружаем, например для кроссовок из дисконта */ var fullCatalog = LoadFullCatalogFromFtp(); var shopCatalog = ShopCatalogRoot.ReadFromFtp(); var shops = new List <RootParsingObject>(); var startTime = DateTime.Now; //очищаем левые фотки foreach (var record in fullCatalog.records) { if (record.images.Count == 1 && string.IsNullOrWhiteSpace(record.images[0])) { record.images = new List <string>(); } } Program.Logger.Info("Старт. Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count); //подгружаем json всех магазинов foreach (var market in shopCatalog.markets) { var shop = RootParsingObject.ReadJsonMarketFromFtp(market); if (shop != null) { shops.Add(shop); } } //отсортировали список магазинов по убыванию количества листингов shops.Sort(delegate(RootParsingObject shop1, RootParsingObject shop2) { return(shop2.listings.Count.CompareTo(shop1.listings.Count)); }); //делаем первый эшелон магазинов с самыми классными фотками var titolo = shops.Find(x => x.market_info.name == "titolo.ch"); var chmielna = shops.Find(x => x.market_info.name == "chmielna20.pl"); var asfaltgold = shops.Find(x => x.market_info.name == "asphaltgold.de"); var hhv = shops.Find(x => x.market_info.name == "hhv.de"); var streetBeat = shops.Find(x => x.market_info.name == "street-beat.ru"); var firstEshelon = new List <RootParsingObject>() { titolo, chmielna, asfaltgold, hhv, streetBeat }; //очищаем все артикулы от фоток //foreach (var fcRecord in fullCatalog.records) //{ // fcRecord.images = new List<string>(); //} //Program.logger.Info("Очистили от фоток. Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count); /*Теперь делаем самое главное: * проходимся по всему списку артикулов * каждый артикул проверяем на наличие в магазине * если он в магазине есть, смотрим, есть ли для него фотки * если есть то заполняем */ //первый проход делаем по первому эшелону магазинов int i = 0; int addedPhotos = 0; int updatedPhotos = 0; int status1 = 1; int status2 = 1; Program.Logger.Info("Start FirstEshelon. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count); foreach (var fcRecord in fullCatalog.records) { if (fcRecord.sku == "724821-100") { bool test = true; } //пропускаем артикул, если для него уже были взяты фотки с одного из сайтов эшелонов List <string> images = new List <string>(); if (fcRecord.images == null) { images = GetImages(fcRecord, firstEshelon, shopCatalog); } else if (fcRecord.images.Count == 0) { images = GetImages(fcRecord, firstEshelon, shopCatalog); } else if (!fcRecord.images[0].Contains("img.sneaker-icon.ru")) { images = GetImages(fcRecord, firstEshelon, shopCatalog); } else { //если уже с нашего сервака фотка, то проверяем, с сайта эшелона или нет var image = fcRecord.images[0]; bool isEshelonPhotos = false; foreach (var shop in firstEshelon) { int shopNumber = shopCatalog.markets.Find(x => x.name == shop.market_info.name).number; if (image.Contains("/shops/" + shopNumber + "/images/")) { isEshelonPhotos = true; break; } } if (!isEshelonPhotos) { images = GetImages(fcRecord, firstEshelon, shopCatalog); } } if (images.Count > 0) { fcRecord.images = images; if (fcRecord.images == null) { addedPhotos++; } else if (fcRecord.images.Count == 0) { addedPhotos++; } else { updatedPhotos++; } } i++; if (i > 100 * status1) { status1++; } if (status1 > status2) { var time = DateTime.Now - startTime; Program.Logger.Debug("Пройдено:" + i + " Добавлено:" + addedPhotos + " Обновлено:" + updatedPhotos + " time:" + time.Minutes); status2 = status1; } } Program.Logger.Info("Finish FirstEshelon. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count); Program.Logger.Info("Добавлено артикулов:" + addedPhotos + " Обновлено артикулов:" + updatedPhotos); //теперь проходимся по всем магазинам (можно конечно первый эшелон удалить, но чет лень, всё равно фотки с изображениями пропускаем) Program.Logger.Info("Start AllShops. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count); i = 0; status1 = 1; status2 = 1; foreach (var fcRecord in fullCatalog.records) { //пропускаем фотки у которых в имени файла уже содержится img.sneaker-icon.ru, т.е. значит что они уже были добавлены из первого эшелона или про прошлом проходе UpdateFullCatalogImages. по сути нам нужно взять только те артикулы, у которых нет фоток или у которых фотки с сайта а не с нашего сервака List <string> images = new List <string>(); if (fcRecord.images == null) { images = GetImages(fcRecord, shops, shopCatalog); } else if (fcRecord.images.Count == 0) { images = GetImages(fcRecord, shops, shopCatalog); } else if (!fcRecord.images[0].Contains("img.sneaker-icon.ru/shops/")) { images = GetImages(fcRecord, shops, shopCatalog); } if (images.Count > 0) { fcRecord.images = images; if (fcRecord.images == null) { addedPhotos++; } else if (fcRecord.images.Count == 0) { addedPhotos++; } else { updatedPhotos++; } } i++; if (i > 100 * status1) { status1++; } if (status1 > status2) { var time = DateTime.Now - startTime; Program.Logger.Debug("Пройдено:" + i + " Добавлено:" + addedPhotos + " Обновлено:" + updatedPhotos + " time:" + time.Minutes); status2 = status1; } } Program.Logger.Info("Finish AllShops. Всего артикулов:" + fullCatalog.records.Count + " Артикулов без фотографий: " + fullCatalog.records.FindAll(x => x.images.Count == 0).Count); Program.Logger.Info("Добавлено артикулов:" + addedPhotos + " Обновлено артикулов:" + updatedPhotos); SaveFullCatalogToFtp(fullCatalog); }
private static FullCatalogRecord CreateFullCatalogRecordFromListing(Listing listing, RootParsingObject jsonMarket, ShopCatalogRoot shopCatalog) { //если нет категории то посмотреть есть ли размеры разных сеток, если есть, то определить категорию по разным размерам. FullCatalogRecord fcRecord = new FullCatalogRecord(); //brand if (Validator.ValidateBrand(listing.brand)) { fcRecord.brand = listing.brand; } else { Program.Logger.Warn("wrong brand. sku: " + listing.sku + " market: " + jsonMarket.market_info.name); return(null); } //sku var sku = listing.sku.ToUpper(); //Aa1234-001 to AA1234-001 nike sku if (Validator.ValidateSku(sku, listing.brand)) { fcRecord.sku = sku; } else { Program.Logger.Warn("wrong sku: " + listing.sku + " market: " + jsonMarket.market_info.name); return(null); } //category if (String.IsNullOrWhiteSpace(listing.category)) { //пытаемся определить категорию по размерным сеткам listing.GetCategory(); } if (!String.IsNullOrWhiteSpace(listing.category)) { if (Validator.ValidateCategory(listing.category)) { fcRecord.category = listing.category; fcRecord.sex = Helper.GetEngSexFromEngCategory(fcRecord.category); } else { Program.Logger.Warn("FullCatalog2.CreateFullCatalogRecordFromListing. Invalid listing.category:" + listing.category + " shop:" + jsonMarket.market_info.name + " sku:" + listing.sku); } } //добавить валидации на эти позиции fcRecord.title = listing.title; fcRecord.color = listing.colorbrand; fcRecord.collection = listing.collection; fcRecord.link = listing.url; //дописать смену изображений на изображения с сервера //fcRecord.images = listing.images; fcRecord.images = ChangeImageLinksFromShopToImagesFromOurServer(listing.images, jsonMarket, shopCatalog, listing); if (fcRecord.images.Count < listing.images.Count) { fcRecord.images = listing.images; Program.Logger.Warn("Wrong our Server Images. shop:" + jsonMarket.market_info.name + " sku:" + listing.sku); } else { bool test = true; } fcRecord.add_time = DateTime.Now; return(fcRecord); }
protected RootParsingObject CreateJson(MarketInfo market_info) { //var market_info = new MarketInfo(); var root = new RootParsingObject(); var listings = new List <Listing>(); //market_info.ftpFolder = AfewStoreParser.NAME; //market_info.website = AfewStoreParser.SITEURL; //market_info.currency = AfewStoreParser.CURRENCY; //market_info.start_parse_date = DateTime.Now; //market_info.end_parse_date = DateTime.Now; //market_info.delivery_to_usa = AfewStoreParser.DELIVERY_TO_USA; //market_info.photo_parameters.is_watermark_image = false; //market_info.photo_parameters.background_color = "white"; //market_info.currently_language = "en"; int i = 0; foreach (var sneaker in catalog.sneakers) { var listing = new Listing(); //id murmurhash Encoding encoding = new UTF8Encoding(); if (sneaker.link != null) { byte[] input = encoding.GetBytes(sneaker.link); using (MemoryStream stream = new MemoryStream(input)) { listing.id = MurMurHash3.Hash(stream); if (listing.id < 0) { listing.id = listing.id * -1; } } } else { byte[] input = encoding.GetBytes(sneaker.title); using (MemoryStream stream = new MemoryStream(input)) { listing.id = MurMurHash3.Hash(stream); if (listing.id < 0) { listing.id = listing.id * -1; } } } listing.url = sneaker.link; listing.sku = sneaker.sku; listing.title = sneaker.title; listing.brand = sneaker.brand; listing.colorbrand = sneaker.color; listing.category = Helper.ConvertCategoryRusToEng(sneaker.category); //if (String.IsNullOrWhiteSpace(listing.category)) Program.Logger.Warn("Wrong category: " + sneaker.category + " sku: " +sneaker.sku); listing.sex = Helper.ConvertSexRusToEng(sneaker.sex); listing.price = sneaker.price; listing.old_price = sneaker.oldPrice; listing.images = sneaker.images; listing.sizes = Helper.GetSizeListUs(sneaker.sizes); i++; listing.position = i; listings.Add(listing); } root.market_info = market_info; root.listings = listings; return(root); //throw new NotImplementedException(); }