public override async Task <Product> RequestProduct(String Url) { Product product = new Product(); product.Url = Url; if (Url.ToLower().Contains("bhphotovideo.com")) { try { char[] charsToTrim = { ' ', '\n', '\t' }; IDocument productDoc = await this.GetWeb(Url); if (productDoc == null) { product.Valid = false; return(product); } String name = productDoc.QuerySelector(".js-main-product-name") != null?productDoc.QuerySelector(".js-main-product-name").TextContent. Trim(charsToTrim).Replace("\n", " ").Replace("\t", "") : String.Empty; product.Name = name; String price = productDoc.QuerySelector("span.ypYouPay") != null?productDoc.QuerySelector("span.ypYouPay").TextContent. Trim(charsToTrim) : String.Empty; product.Price = price; var availabilityNode = productDoc.QuerySelectorAll("span").Where(t => t.HasAttribute("data-selenium") && (t.GetAttribute("data-selenium"). Equals("inStock") || t.GetAttribute("data-selenium").Equals("notStock"))).FirstOrDefault(); String availability = availabilityNode != null?availabilityNode.GetAttribute("data-selenium") : String.Empty; product.Availability = availability.Equals("inStock")?"In-Stock":"Out-of-Stock"; product.Valid = true; } catch (Exception ex) { LoggerCin logger = new LoggerCin("C:\\Development\\ProductStatusNotifier\\Test\\bin\\Debug"); logger.Error(ex.ToString()); product.Valid = false; } } return(product); }
public override async Task <Product> RequestProduct(String Url) { Product product = new Product(); product.Url = Url; if (Url.ToLower().Contains("sabrepc.com")) { try { char[] charsToTrim = { ' ', '\n', '\t' }; IDocument productDoc = await this.GetWeb(Url); if (productDoc == null) { product.Valid = false; return(product); } String name = productDoc.QuerySelector("div.product-name") != null?productDoc.QuerySelector("div.product-name").FirstElementChild.TextContent. Trim(charsToTrim).Replace("\n", " ").Replace("\t", "").Trim() : String.Empty; product.Name = name; var priceNode = productDoc.QuerySelector("div.product-d").Children.Where(x => x.ClassName.Contains("integral")).FirstOrDefault(); String price = priceNode != null ? priceNode.TextContent : String.Empty; product.Price = price; var availabilityNode = productDoc.QuerySelectorAll("span").Where(n => n.ParentElement.ClassName.ToLower().Equals("availability in-stock")).FirstOrDefault(); string availability = availabilityNode != null ? availabilityNode.TextContent : String.Empty; product.Availability = availability.Equals("Out Of Stock") ? "Out-of-Stock" : "In-Stock"; product.Valid = true; } catch (Exception ex) { LoggerCin logger = new LoggerCin("C:\\Development\\ProductStatusNotifier\\Test\\bin\\Debug"); logger.Error(ex.ToString()); product.Valid = false; } } return(product); }
public override async Task <Product> RequestProduct(String Url) { Product product = new Product(); product.Url = Url; if (Url.ToLower().Contains("tigerdirect.com")) { try { char[] charsToTrim = { ' ', '\n', '\t' }; IDocument productDoc = await this.GetWeb(Url); String name = productDoc.QuerySelector("div.prodName") != null?productDoc.QuerySelector("div.prodName h1").TextContent. Trim(charsToTrim).Replace("\n", " ").Replace("\t", "") : String.Empty; product.Name = name; String price = productDoc.QuerySelector(".salePrice") != null?productDoc.QuerySelector("span.salePrice").TextContent. Trim(charsToTrim) : String.Empty; product.Price = price; String availability = productDoc.QuerySelectorAll(".prodMesg") != null?productDoc.QuerySelector(".prodMesg").TextContent.Trim(charsToTrim) : String.Empty; product.Availability = availability.ToLower().Contains("in stock") ? "In-Stock" : "Out-of-Stock"; product.Valid = true; } catch (Exception ex) { LoggerCin logger = new LoggerCin("C:\\Development\\ProductStatusNotifier\\Test\\bin\\Debug"); logger.Error(ex.ToString()); product.Valid = false; } } return(product); }
static void Main(string[] args) { logger = new LoggerCin(AppDomain.CurrentDomain.BaseDirectory + "logs.log"); try { scrapperData = new ConsoleScrapperData(); ParserResult <Options> result = CommandLine.Parser.Default.ParseArguments <Options>(args); if (!result.Errors.Any()) { var options = result.Value; if (!String.IsNullOrEmpty(options.JsonPath)) { jsonFile = options.JsonPath; } else { jsonFile = AppDomain.CurrentDomain.BaseDirectory + "\\config.json"; } if (!String.IsNullOrEmpty(options.IFTTTKey)) { scrapperData.IFTTTWebhookKey = options.IFTTTKey; } if (!String.IsNullOrEmpty(options.IFTTTEvent)) { scrapperData.IFTTTEventName = options.IFTTTEvent; } if (options.Interval >= 1) { scrapperData.MonitoringInterval = options.Interval * 60000; } } if (File.Exists(jsonFile)) { scrapperData = JSONToConfiguration(jsonFile); } if (scrapperData.ProductsToCheck.Any()) { scrapperData.ProductsToCheck = scrapperData.ProductsToCheck.OrderByDescending(p => p.StoreName).ToList(); } System.Console.WriteLine("Running scheduled product check every {0} minutes...", (int)scrapperData.MonitoringInterval / 60000); if (!String.IsNullOrEmpty(scrapperData.IFTTTEventName) && !String.IsNullOrEmpty(scrapperData.IFTTTWebhookKey)) { System.Console.WriteLine("IFTTT Webhook key and event name added. Notifications enabled!"); } else { System.Console.WriteLine("No IFTTT webhook key and event name. Notifications disabled!"); } if (scrapperData.ProductsToCheck.Any()) { System.Console.WriteLine("Monitoring " + scrapperData.ProductsToCheck.Count() + " products from configuration."); } aTimer = new Timer { Interval = scrapperData.MonitoringInterval }; aTimer.Elapsed += OnTimedEvent; aTimer.AutoReset = true; aTimer.Enabled = true; ConsoleLoop().Wait(); } catch (Exception ex) { if (logger != null) { logger.Fatal(ex.ToString()); } else { LoggerCin logger = new LoggerCin(AppDomain.CurrentDomain.BaseDirectory + "Fatal.log"); } } }