331 lines
12 KiB
C#
331 lines
12 KiB
C#
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<string, DiTraderStockRow> StockMarketList { get; set; }
|
|
|
|
public List<DiTraderStockRow> DumpObjects { get; set; } = new List<DiTraderStockRow>();
|
|
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<IWebElement> 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<DiTraderStockRow> 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<string, DiTraderStockRow>();
|
|
DumpObjects = new List<DiTraderStockRow>();
|
|
//GlobalStopwatch.PrintSecs("After dictionaries setup ");
|
|
var groupedStocks = _stockRepository.GetStocksGroupedPerPerson(persId);
|
|
//GlobalStopwatch.PrintSecs("After groupedStocks fetched ");
|
|
var restStocks = new List<string>();
|
|
var lastGroup = string.Empty;
|
|
var stockList = new List<string>();
|
|
foreach(var groupedStock in groupedStocks)
|
|
{
|
|
if (groupedStock.StockGroup != lastGroup)
|
|
{
|
|
if(lastGroup != string.Empty)
|
|
{
|
|
_testSettings.StockWishes = stockList.ToArray();
|
|
stockList.Clear();
|
|
//GlobalStopwatch.PrintSecs("Before GetStockStatus");
|
|
if (lastGroup == "ZNotFound")
|
|
saveStockData(new List<DiTraderStockRow>( _scrapePage.SearchStockAndCollect("Pfizer")));
|
|
else
|
|
saveStockData( _scrapePage.GetMyStockStatus(lastGroup));
|
|
//GlobalStopwatch.PrintSecs("After GetStockStatus");
|
|
if (_testSettings.StockWishes.Length > 0)
|
|
{
|
|
restStocks.AddRange(_testSettings.StockWishes);
|
|
}
|
|
lastGroup = groupedStock.StockGroup;
|
|
}
|
|
else
|
|
{
|
|
lastGroup = groupedStock.StockGroup;
|
|
}
|
|
|
|
stockList.Add(groupedStock.StockId);
|
|
}
|
|
else
|
|
{
|
|
stockList.Add(groupedStock.StockId);
|
|
}
|
|
}
|
|
|
|
if(stockList.Count > 0)
|
|
{
|
|
_testSettings.StockWishes = stockList.ToArray();
|
|
stockList.Clear();
|
|
if (lastGroup == "ZNotFound")
|
|
saveStockData(new List<DiTraderStockRow>(_scrapePage.SearchStockAndCollect("Pfizer")));
|
|
else
|
|
saveStockData(_scrapePage.GetMyStockStatus(lastGroup));
|
|
if (_testSettings.StockWishes.Length > 0)
|
|
{
|
|
restStocks.AddRange(_testSettings.StockWishes);
|
|
}
|
|
}
|
|
|
|
if (DumpObjects.Any())
|
|
{
|
|
SaveLogging();
|
|
}
|
|
}
|
|
|
|
|
|
public void LoadStockMarketList(int persId, bool viewBrowser)
|
|
{
|
|
StockMarketList = new Dictionary<string, DiTraderStockRow>();
|
|
ViewBrowser = viewBrowser;
|
|
OpenBrowser();
|
|
Find_Data();
|
|
}
|
|
|
|
public void RefreshMarketList(int persId)
|
|
{
|
|
StockMarketList = new Dictionary<string, DiTraderStockRow>();
|
|
driver.Navigate().Refresh();
|
|
Find_Data();
|
|
}
|
|
|
|
public void Clean()
|
|
{
|
|
driver?.Quit();
|
|
}
|
|
|
|
}
|
|
}
|