using Newtonsoft.Json; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using StockDal.Interface; using DataDomain; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Diagnostics; using StockDAL.Interface; using BrowserHelper.Driver; using BrowserHelper.Settings; using Helpers; namespace StockDal { public class StockMarketRepository : IStockMarketRepository { public Dictionary StockMarketList { get; set; } public List DumpObjects { get; set; } = new List(); public DiTraderStockRow SaveRow { get; set; } public StringBuilder TextResults { get; set; } public bool ViewBrowser { get; set; } public IWebDriver driver; private readonly IStockPersonConnect _stockPersonConnect; private readonly IStockRepository _stockRepository; private readonly TestSettings _testSettings; private readonly IStockScrapePage _scrapePage; public StockMarketRepository( IStockPersonConnect stockPersonConnect, IStockRepository stockRepository, TestSettings testSettings, IStockScrapePage scrapePage) { ViewBrowser = false; _stockPersonConnect = stockPersonConnect; _stockRepository = stockRepository; _testSettings = testSettings; _scrapePage = scrapePage; } private void Find_Data() { TextResults = new StringBuilder(); IList searchElements = driver.FindElements(By.TagName("tbody")); foreach (IWebElement i in searchElements) { HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument(); var text = i.GetAttribute("innerHTML"); htmlDocument.LoadHtml(text); var inputs = htmlDocument.DocumentNode.Descendants("tr").ToList(); foreach (var items in inputs) { HtmlAgilityPack.HtmlDocument htmlDocument1 = new HtmlAgilityPack.HtmlDocument(); htmlDocument1.LoadHtml(items.InnerHtml); var tds = htmlDocument1.DocumentNode.Descendants("td").ToList(); var appendText = ""; var fNr = 0; foreach (var item in tds) { var intext = item.InnerText.Replace("\r\n", ""); appendText += appendText.Length == 0 ? intext : " " + intext; if (tds.Count == 10) { AddValueToListRow(fNr++, intext); } } if (!string.IsNullOrEmpty(appendText)) { TextResults.Append(appendText + "\r\n"); } htmlDocument1 = null; } htmlDocument = null; TextResults.Append("\r\n"); } // var oxe = StockMarketList; } private void SaveLogging() { var output = JsonConvert.SerializeObject(DumpObjects, Formatting.Indented); Assembly assem = typeof(StockMarketRepository).Assembly; var programPath = assem.Location.Substring(0, assem.Location.LastIndexOf("\\")); var logPath = new DirectoryInfo(programPath + "\\Loggings"); if (!logPath.Exists) { logPath.Create(); } File.WriteAllText($"{programPath}\\Loggings\\Log{DateTime.Now.ToShortDateString()}.txt", output); } private void AddValueToListRow(int pos, string value) { switch (pos) { case 0: { SaveRow = new DiTraderStockRow(); SaveRow.StockName = value; break; } case 1: { SaveRow.ProcChange = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 2: { SaveRow.RealChange = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 3: { SaveRow.BuyPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 4: { SaveRow.SellPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 5: { SaveRow.LatestPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 6: { SaveRow.HighestPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 7: { SaveRow.LowestPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 8: { SaveRow.Volume = string.IsNullOrWhiteSpace(value) ? 0 : long.Parse(value.Replace(" ", "")); break; } case 9: { SaveRow.TimeOfDay = value == "" ? TimeSpan.Parse("00:01") : TimeSpan.Parse(value); //StockMarketList.Add(SaveRow.StockName, SaveRow); try { StockMarketList.Add(SaveRow.StockName, SaveRow); } catch (ArgumentException) { try { StockMarketList.Add(SaveRow.StockName + "-2", SaveRow); } catch (Exception) { DumpObjects.Add(SaveRow); } } break; } default: break; } } private void OpenBrowser(bool? burl2 = false) { var driverService = ChromeDriverService.CreateDefaultService(); driverService.HideCommandPromptWindow = true; if (ViewBrowser) { if (driver == null) { driver = new ChromeDriver(driverService); } } else { if (driver == null) { var options = new ChromeOptions(); options.AddArgument("headless"); driver = new ChromeDriver(driverService, options); } } try { //var url0 = "https://money.cnn.com/data/hotstocks/index.html"; var url = "https://trader.di.se/index.php/stocklist/index/2055?list=7126"; var url2 = "https://trader.di.se/index.php/stocklist/index/2055?list=7116"; var url3 = "https://trader.di.se/index.php/stocklist/index/2055?list=7127"; //var url1 = "https://www.finansportalen.se/aktiekurser/"; driver.Navigate().GoToUrl(burl2.HasValue ? (burl2.Value ? url2 : url) : url3); } catch { throw; } } private void saveStockData(List saveRow) { foreach (var row in saveRow) { try { StockMarketList.Add(row.StockName, row); } catch (ArgumentException) { try { StockMarketList.Add(row.StockName + "-2", row); } catch (Exception) { DumpObjects.Add(row); } } //break; } } public void LoadStockMarketList(int persId) { StockMarketList = new Dictionary(); DumpObjects = new List(); var groupedStocks = _stockRepository.GetStocksGroupedPerPerson(persId); var lastGroup = string.Empty; var stockList = new List(); foreach (var groupedStock in groupedStocks) { if (groupedStock.StockGroup != lastGroup) { if (lastGroup != string.Empty) { _testSettings.StockWishes = stockList.ToArray(); if (lastGroup == "ZNotFound") foreach (var stk in stockList) { saveStockData(new List(_scrapePage.SearchStockAndCollect(stk.Substring(0, 4)))); } else saveStockData(_scrapePage.GetMyStockStatus(lastGroup)); stockList.Clear(); lastGroup = groupedStock.StockGroup; } else { lastGroup = groupedStock.StockGroup; } stockList.Add(groupedStock.StockId); } else { stockList.Add(groupedStock.StockId); } } if (stockList.Count > 0) { _testSettings.StockWishes = stockList.ToArray(); if (lastGroup == "ZNotFound") foreach (var stk in stockList) { saveStockData(new List(_scrapePage.SearchStockAndCollect(stk.Substring(0, 4)))); } else saveStockData(_scrapePage.GetMyStockStatus(lastGroup)); stockList.Clear(); } if (DumpObjects.Any()) { SaveLogging(); } } public DiTraderStockRow LoadStockMarketStockData(string searchedStock) { //StockMarketList = new Dictionary(); //DumpObjects = new List(); var groupedStocks = _stockRepository.GetGroupedStock(searchedStock); var lastGroup = string.Empty; var stockList = new List(); var output = new List(); foreach (var groupedStock in groupedStocks) { if (groupedStock.StockGroup != lastGroup) { if (lastGroup != string.Empty) { _testSettings.StockWishes = stockList.ToArray(); if (lastGroup == "ZNotFound") foreach (var stk in stockList) { output = _scrapePage.SearchStockAndCollect(stk.Substring(0, 4)); } else output = _scrapePage.GetMyStockStatus(lastGroup); stockList.Clear(); lastGroup = groupedStock.StockGroup; } else { lastGroup = groupedStock.StockGroup; } stockList.Add(groupedStock.StockId); } else { stockList.Add(groupedStock.StockId); } } if (stockList.Count > 0) { _testSettings.StockWishes = stockList.ToArray(); if (lastGroup == "ZNotFound") foreach (var stk in stockList) { output = _scrapePage.SearchStockAndCollect(stk.Substring(0, 4)); } else output = _scrapePage.GetMyStockStatus(lastGroup); stockList.Clear(); } return output[0]; //if (DumpObjects.Any()) //{ // SaveLogging(); //} } public void LoadStockMarketList(int persId, bool viewBrowser) { StockMarketList = new Dictionary(); ViewBrowser = viewBrowser; OpenBrowser(); Find_Data(); } public void RefreshMarketList(int persId) { StockMarketList = new Dictionary(); driver.Navigate().Refresh(); Find_Data(); } public void Clean() { driver?.Quit(); } } }