internal void UpdateBet(object data) { var link = data as LinkData; if (link == null) { return; } Stopwatch sw = new Stopwatch(); HttpRequest req = new HttpRequest(); req.CharacterSet = Encoding.UTF8; if (UsingProxy) { req.Proxy = ProxyClient.Parse(ProxySingleManager.GetProxy()); } while (true) { try { var response = req.Get($"{_url}/su/live/{link.Id}").ToString(); sw.Reset(); sw.Start(); var bet = new Bet(); bet.Bookmaker = BookmakerType.Marafon; bet.Site = "M"; bet.Name = link.Teams; bet.URL = $"su/live/{link.Id}"; bet.Team1Id = link.Team1Id; bet.Team2Id = link.Team2Id; var teams = link.Teams.Replace(" - ", "|").Split('|'); if (teams.Length < 2) { throw new ArgumentException($"{nameof(teams)}.Lenght!=2"); } bet.Team1 = teams[0]; bet.Team2 = teams[1]; var doc = CreteDocument(response); bet = ParseBet(doc, bet); var time = (int)sw.ElapsedMilliseconds; sw.Stop(); _bets[link.Id] = bet; if (time > MainConfigurate.Configurate.MarafonMaxTime) { throw new ArgumentException("Долго парсили"); } } catch (ThreadAbortException ex) { break; } catch (Exception ex) { Logger.AddLog($"{link.Id};URl: {_url}/su/live/{link.Id} Время {sw.ElapsedMilliseconds};Ошибка парсинга: {ex.Message}", Logger.LogTarget.MarafonThread, Logger.LogLevel.Warn); } if (UsingProxy) { req.Proxy = ProxyClient.Parse(ProxySingleManager.GetProxy()); req.ReadWriteTimeout = 3000; req.ConnectTimeout = 3000; req.KeepAliveTimeout = 3000; } } }
internal void UpdateBetNew(object data) { var link = data as LinkData; if (link == null) { return; } Stopwatch sw = new Stopwatch(); HttpRequest req = new HttpRequest(); req.CharacterSet = Encoding.UTF8; if (UsingProxy) { req.Proxy = ProxyClient.Parse(ProxySingleManager.GetProxy()); } int offset = 0; try { offset = GetServerOffset(req); } catch (Exception ex) { Logger.AddLog($"Не смогли получить смещение времи. {ex.Message}", Logger.LogTarget.MarafonThread, Logger.LogLevel.Error); } string prefix = GeneratorPrefix(); string updated = null; IHtmlDocument doc = null; bool reload = true; while (true) { sw.Reset(); sw.Start(); try { if (reload) { string response = req.Get($"{_url}/su/live/{link.Id}").ToString(); reload = false; var bet = new Bet(); bet.Bookmaker = BookmakerType.Marafon; bet.Site = "M"; bet.Name = link.Teams; bet.URL = $"su/live/{link.Id}"; bet.Team1Id = link.Team1Id; bet.Team2Id = link.Team2Id; var teams = link.Teams.Replace(" - ", "|").Split('|'); if (teams.Length < 2) { throw new ArgumentException($"{nameof(teams)}.Lenght!=2"); } bet.Team1 = teams[0]; bet.Team2 = teams[1]; doc = CreteDocument(response); bet = ParseBet(doc, bet); var time = (int)sw.ElapsedMilliseconds; sw.Stop(); _bets[link.Id] = bet; if (time > MainConfigurate.Configurate.MarafonMaxTime) { throw new ArgumentException($"Долго парсили {sw.ElapsedMilliseconds} мс "); } Console.WriteLine("Событие загруженно!"); } else { if (!_bets.ContainsKey(link.Id)) { Console.WriteLine("Почему то нет такого ключа в базе."); reload = true; continue; } if (doc == null) { Console.WriteLine($"Почему то {nameof(doc)}==null"); reload = true; continue; } if (String.IsNullOrWhiteSpace(updated)) { updated = (ConvertToUnixTimestamp() - offset).ToString(); } string url = $"https://liveupdate.marathonbookmakers.com/su/livestreamupdate/{link.Id}?callback={prefix}&markets={link.Id}&available=&updated={updated}&oddsType=Decimal&siteStyle=MULTIMARKETS&_={ConvertToUnixTimestamp()}"; var response = req.Get(url).ToString().Trim(); var responseData = response.Remove(response.Length - 1).Replace($"{prefix}(", ""); if (responseData.Contains("refreshPage")) { Console.WriteLine("Необходимо перезагрузить странницу"); reload = true; updated = null; continue; } var json = JsonConvert.DeserializeObject <MarafonPingResponse>(responseData); updated = json.Updated.ToString(); if (json.Modified == null) { Console.WriteLine("Обновление ставки не требуется!"); _bets[link.Id].Update(); } else { foreach (Modified modified in json.Modified) { if (modified.Type == "mutableUpdates") { try { UpdateDocument(doc, modified.Updates); } catch (Exception e) { reload = true; updated = null; throw new ArgumentException($"Не удалось сделать частичное обновлеение. и вот почему: {e.Message}"); } } } var bet = _bets[link.Id].ShortCopy(); bet = ParseBet(doc, bet); _bets[link.Id] = bet; Console.WriteLine("Сделали частичное обновление!"); } Thread.Sleep(1500); } } catch (Exception e) { Logger.AddLog($"Не удалось спарсить {link.Id}. И вот почему: {e.Message}", Logger.LogTarget.MarafonThread, Logger.LogLevel.Warn); Debug.WriteLine($"Не удалось спарсить {link.Id}. И вот почему: {e.Message}"); Thread.Sleep(5000); if (UsingProxy) { req.Proxy = ProxyClient.Parse(ProxySingleManager.GetProxy()); } } } }
private void Update() { while (true) { try { var rezult = GetLives(); lock (_livesLock) { _livesList = rezult; } Logger.AddLog($"Полученно lives: {rezult.Count}", Logger.LogTarget.Marafon); foreach (LinkData data in rezult) { if (!_thsLoad.ContainsKey(data.Id)) { var th = new Thread(UpdateBetNew); th.IsBackground = true; th.Start(data); _thsLoad.Add(data.Id, th); } else { if (_thsLoad[data.Id].ThreadState == ThreadState.Stopped || _thsLoad[data.Id].ThreadState == ThreadState.Aborted) { var th = new Thread(UpdateBetNew); th.IsBackground = true; th.Start(data); _thsLoad[data.Id] = th; } } } var ids = rezult.Select(x => x.Id).ToList(); List <string> removeList = new List <string>(); foreach (KeyValuePair <string, Thread> key in _thsLoad) { if (!ids.Contains(key.Key)) { try { key.Value.Abort(); } catch (Exception e) { Console.WriteLine(e); } removeList.Add(key.Key); } } foreach (string s in removeList) { _thsLoad.Remove(s); } } catch (Exception ex) { if (UsingProxy) { _req.Proxy = ProxyClient.Parse(ProxySingleManager.GetProxy()); } Logger.AddLog($"Не удалось получить lives: {ex.Message}", Logger.LogTarget.Marafon, Logger.LogLevel.Critical); continue; } finally { Thread.Sleep(10000); } } }