private void ExtractPlayers(HtmlNodeCollection playerElements, int teamId)
        {
            for (var playerIdx = 0; playerIdx < playerElements.Count; playerIdx++)
            {
                var       item           = playerElements[playerIdx];
                const int sourceIdInHref = 7;
                var       sourceId       = item.Attributes["href"].Value.Split('/')[sourceIdInHref];
                var       playerName     = item.InnerText;
                playerName = ScrapeHelper.FormatPlayerName(playerName);
                Logger.Information($"SourceId {sourceId}, PlayerName {playerName}, TeamId {teamId}");
                if (string.IsNullOrEmpty(sourceId) || string.IsNullOrEmpty(playerName))
                {
                    Logger.Warning($"SourceId {sourceId} or PlayerName {playerName} " +
                                   $"is null or empty at index {playerIdx}");
                    continue;
                }

                Players.Add(new Player
                {
                    SourceId = sourceId,
                    Name     = playerName,
                    TeamId   = teamId
                });
            }
        }
 public EspnCompetitionJob(WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper) : base(webPortalHelper, scrapeHelper)
 {
     Logger = Helper
              .GetLoggerConfig($@"{NBAScrapingService.BaseLoggerPath}\Scrape\Competition\espn-.txt")
              .CreateLogger();
     ProviderType = typeof(EspnCompetition);
 }
 public PalmerbetPlayerOverUnderJob(WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper) : base(webPortalHelper, scrapeHelper)
 {
     Logger = Helper
              .GetLoggerConfig($@"{NBAScrapingService.BaseLoggerPath}\Scrape\PlayerOverUnder\palmerbet-.txt")
              .CreateLogger();
     ProviderType = typeof(PalmerbetPlayerOverUnder);
 }
        // ------------------------------------------------------------ //

        public void Update()
        {
            var api = HotItemController.CurrentApi;

            Cookie cookie = null;

            if (!String.IsNullOrEmpty(api.ExchangeHost))
            {
                cookie = new Cookie("s", HotItemController.Config.SessionKey, "/", api.ExchangeHost);
            }
            ScrapeHelper.Get(api.UriBuyGems(10000), api.ExchangeHost, cookie, api.ExchangeReferer, CompletedGemPrice, api.UserAgent);
            ScrapeHelper.Get(api.UriBuyGold(10000), api.ExchangeHost, cookie, api.ExchangeReferer, CompletedGoldPrice, api.UserAgent);

            BuyGemsRules.Money = new Money(BuyGemPrice * 100)
            {
                Name = "Gems for Gold"
            };;
            BuyGoldRules.Money = new Money(BuyGoldPrice * 100)
            {
                Name = "Gold for Gems"
            };

            if (_isBuyGemActive)
            {
                foreach (NotifierRule r in BuyGemsRules.Rules)
                {
                    if (r.Compare(BuyGemsRules.Money.TotalCopper))
                    {
                        HotItemController.Self.AddNotification(this,
                                                               new Event.NotificationEventArgs(0, null, r,
                                                                                               Event.NotificationType
                                                                                               .BuyGems)
                        {
                            GemRuleViewModel
                                =
                                    BuyGemsRules
                        });
                    }
                }
            }

            if (_isBuyGoldActive)
            {
                foreach (NotifierRule r in BuyGoldRules.Rules)
                {
                    if (r.Compare(BuyGoldRules.Money.TotalCopper))
                    {
                        HotItemController.Self.AddNotification(this,
                                                               new Event.NotificationEventArgs(0, null, r,
                                                                                               Event.NotificationType
                                                                                               .BuyGold)
                        {
                            GemRuleViewModel
                                =
                                    BuyGoldRules
                        });
                    }
                }
            }
        }
Example #5
0
 public TabPlayerHeadToHeadJob(WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
     : base(webPortalHelper, scrapeHelper)
 {
     Logger = Helper
              .GetLoggerConfig($@"{NBAScrapingService.BaseLoggerPath}\Scrape\PlayerHeadToHead\tab-.txt")
              .CreateLogger();
     ProviderType = typeof(TabPlayerHeadToHead);
 }
 public BorgataonlinePlayerOverUnderJob(WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
     : base(webPortalHelper, scrapeHelper)
 {
     Logger = Helper
              .GetLoggerConfig($@"{NBAScrapingService.BaseLoggerPath}\Scrape\PlayerOverUnder\borgataonline-.txt")
              .CreateLogger();
     ProviderType = typeof(BorgataonlinePlayerOverUnder);
 }
Example #7
0
        // ===========================================================================
        // = Private Methods
        // ===========================================================================

        private static IEnumerable <Beer> LoadFromWeb()
        {
            var    data        = ScrapeHelper.FetchParseAsync("http://www.fynefest.com/?page_id=5", transform: TransformHtml).Result;
            var    next        = data.QuerySelector("h1");
            string breweryName = "";

            while (next != null)
            {
                if (!next.Name.Equals("p"))
                {
                    next = next.NextSibling;
                    continue;
                }

                if (next.Elements().Any(X => X.Name.Equals("strong", StringComparison.OrdinalIgnoreCase)))
                {
                    breweryName = WebUtility.HtmlDecode(next.Element("strong").InnerText).Trim();

                    if (breweryName.Contains("–"))
                    {
                        breweryName = breweryName.Split('–').First().Trim();
                    }

                    next = next.NextSibling;
                    continue;
                }

                var record = WebUtility.HtmlDecode(next.InnerText);
                var lines  = record.Split(new[] { '\n' });

                var regex = new Regex(@"^(?<beerName>[^–]+?)\s*–?\s*(?<abv>[0-9]+\.?[0-9]*)%?\s*\((?<caskOrKeg>[KC])\)\s*$");
                var match = regex.Match(lines.First());

                if (!match.Success)
                {
                    throw new ApplicationException("Invalid beer: " + lines.First());
                }

                var beerName    = match.Groups["beerName"].Value.Trim();
                var abv         = Decimal.Parse(match.Groups["abv"].Value.Trim());
                var isCask      = match.Groups["caskOrKeg"].Value.Trim() == "C";
                var description = lines.Last().Trim();

                var beer = new Beer
                {
                    BreweryName = breweryName,
                    BeerName    = beerName,
                    ABV         = abv,
                    Id          = $"{breweryName}$$${beerName}$$${abv}$$${isCask}",
                    StyleName   = description
                };

                next = next.NextSibling;

                yield return(beer);
            }
        }
Example #8
0
        protected ScrapeHandler(ILogger logger, WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
        {
            Logger          = logger;
            Environment     = AppEnvironment.Production;
            WebPortalHelper = webPortalHelper;
            ScrapeHelper    = scrapeHelper;

            // Inject
            WebPortalHelper.Logger = ScrapeHelper.Logger = Logger;
        }
        public void GetEstimatedBirthDate()
        {
            var birthDate = ScrapeHelper.GetEstimatedBirthDate("Bill Allen");

            Assert.AreEqual(1945, birthDate.Year);
            Assert.AreEqual(1, birthDate.Month);
            Assert.AreEqual(1, birthDate.Day);
            Assert.AreEqual(TimeSpan.Zero, birthDate.TimeOfDay);
            Assert.AreEqual(DateTimeKind.Utc, birthDate.Kind);
        }
Example #10
0
        /// <summary>
        /// For debugging purpose only
        /// </summary>
        protected ScrapeHandler()
        {
            Logger = Helper
                     .GetLoggerConfig($@"{Constants.BaseLoggerPath}\Debug\debug-.txt")
                     .CreateLogger();
            Environment     = AppEnvironment.Debug;
            WebPortalHelper = new WebPortalHelper(new HttpClient());
            ScrapeHelper    = new ScrapeHelper(new HttpClient(), new WebClient());
            //ShouldGetTodayMatches = false;

            // Inject
            WebPortalHelper.Logger = ScrapeHelper.Logger = Logger;
        }
Example #11
0
        public void SearchTransactions(TransactionType transactionType)
        {
            if (HotItemController.CurrentApi.IsTransactionApiSupported)
            {
                var f = new TaskFactory();
                var t = f.StartNew(() =>
                {
                    //int count = 10;
                    //int offset = page * 10;
                    ScrapeHelper transactionScraper = new ScrapeHelper(HotItemController.Config.SessionKey)
                    {
                        TransactionType = transactionType
                    };
                    transactionScraper.Finished += new EventHandler <ScrapeFinishedEventArgs>(transactionScraper_Finished);

                    String uri = HotItemController.CurrentApi.UriTransaction(transactionType, 0, HotItemController.Config.TransactionLimit);

                    transactionScraper.CrawlString(uri, 0, 0, HotItemController.CurrentApi);
                });
            }
        }
Example #12
0
        protected override async Task ScrapeData()
        {
            const string url = "https://services.bovada.lv/services/sports/event/coupon/events/A/description/basketball/nba?marketFilterId=def&preMatchOnly=true&lang=en";
            var          doc = await ScrapeHelper.GetDocument(url);

            var jDoc       = JsonConvert.DeserializeObject <JToken>(doc);
            var rawMatches = jDoc.SelectTokens("$.[*].events[*]");

            await UpdateScrapeStatus(10, "Scraping match data");

            var foundMatches = new List <Match>();

            foreach (var rawMatch in rawMatches)
            {
                var sourceId = rawMatch.SelectToken("$.link").ToString();
                if (string.IsNullOrEmpty(sourceId))
                {
                    Logger.Warning("Source match id is null");
                    continue;
                }
                var description = rawMatch.SelectToken("$.description").ToString();
                var desSplits   = description.Split('@');
                var homeTeam    = desSplits[1];
                var awayTeam    = desSplits[0];

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceId;
                foundMatches.Add(match);
            }
            await UpdateScrapeStatus(20, "Scrape match data complete");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            await UpdateScrapeStatus(20, "Scraping metric data");

            foreach (var match in foundMatches)
            {
                var metricUrl = $"https://services.bovada.lv/services/sports/event/coupon/events/A/description{match.SourceId}?lang=en";
                doc = await ScrapeHelper.GetDocument(metricUrl);

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                var rawMetrics = jDoc
                                 .SelectTokens("$.[*].events[*].displayGroups[?(@.description == 'Player Props')].markets[*]")
                                 .ToList();
                foreach (var rawMetric in rawMetrics)
                {
                    var description = rawMetric.SelectToken("$.description").ToString();
                    var scoreType   =
                        description.Contains("Total Points, Rebounds and Assists") ? ScoreType.PointReboundAssist :
                        description.Contains("Total Points and Rebounds") ? ScoreType.PointRebound :
                        description.Contains("Total Points and Assists") ? ScoreType.PointAssist :
                        description.Contains("Total Rebounds and Assists") ? ScoreType.ReboundAssist :
                        description.Contains("Total Points") ? ScoreType.Point :
                        description.Contains("Total Rebounds") ? ScoreType.Rebound :
                        description.Contains("Total Assists") ? ScoreType.Assist :
                        string.Empty;

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var playerName = ScrapeHelper.RegexMappingExpression(description, @"- (.*) \(");
                    var player     = ScrapeHelper.FindPlayerInMatch(playerName, match);
                    if (player == null)
                    {
                        Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                        continue;
                    }

                    var    outcomes = rawMetric.SelectTokens("$.outcomes[*]");
                    double?over = 0, overLine = 0, under = 0, underLine = 0;
                    foreach (var outcome in outcomes)
                    {
                        var des = outcome.SelectToken("$.description").ToString();
                        if (des.Contains("Over"))
                        {
                            overLine = ScrapeHelper.ConvertMetric(outcome.SelectToken("$.price.handicap").ToString());
                            var overPrice = ScrapeHelper.ConvertMetric(outcome.SelectToken("$.price.decimal").ToString());
                            over = overPrice != null?Math.Round((double)overPrice, 2) : (double?)null;
                        }
                        else if (des.Contains("Under"))
                        {
                            underLine = ScrapeHelper.ConvertMetric(outcome.SelectToken("$.price.handicap").ToString());
                            var underPrice = ScrapeHelper.ConvertMetric(outcome.SelectToken("$.price.decimal").ToString());
                            under = underPrice != null?Math.Round((double)underPrice, 2) : (double?)null;
                        }
                    }

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        MatchId               = match.Id,
                        Over                  = over,
                        OverLine              = overLine,
                        Under                 = under,
                        UnderLine             = underLine,
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        CreatedAt             = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
Example #13
0
        public static async Task <IScrapeHandler> CreateAsync(Type providerType, ILogger logger,
                                                              WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
        {
            var instance = (IScrapeHandler)Activator.CreateInstance(providerType, logger, webPortalHelper, scrapeHelper);
            await instance.Initialize(providerType);

            return(instance);
        }
        protected override async Task ScrapeData()
        {
            const string url = "https://eu-offering.kambicdn.org/offering/v2018/888/listView/basketball.json?lang=en_GB&market=ZZ&client_id=2&channel_id=1&ncid=1572482733163&useCombined=true";
            var          doc = await ScrapeHelper.GetDocument(url);

            var jDoc       = JsonConvert.DeserializeObject <JToken>(doc);
            var rawMatches = jDoc.SelectTokens("$.events[?(@.event.group == 'NBA')]");

            await UpdateScrapeStatus(10, "Scraping match data");

            var foundMatches = new List <Match>();

            foreach (var rawMatch in rawMatches)
            {
                var sourceId = rawMatch.SelectToken("$.event.id").ToString();
                if (string.IsNullOrEmpty(sourceId))
                {
                    Logger.Warning("Source match id is null");
                    continue;
                }

                var homeTeam = rawMatch.SelectToken("$.event.homeName").ToString();
                var awayTeam = rawMatch.SelectToken("$.event.awayName").ToString();

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceId;
                foundMatches.Add(match);
            }
            await UpdateScrapeStatus(20, "Scrape match data complete");

            await UpdateScrapeStatus(20, "Scraping metric data");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            foreach (var match in foundMatches)
            {
                var metricUrl = $"https://eu-offering.kambicdn.org/offering/v2018/888/betoffer/event/{match.SourceId}.json?lang=en_GB&market=ZZ&client_id=2&channel_id=1&ncid=1005710980&includeParticipants=true";
                doc = await ScrapeHelper.GetDocument(metricUrl);

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                var rawMetrics = jDoc.SelectTokens("$.betOffers[*]").ToList();
                foreach (var rawMetric in rawMetrics)
                {
                    var labelData = rawMetric.SelectToken("$.criterion.label").ToString();
                    var scoreType = labelData.Contains("Points scored by the player") ? ScoreType.Point :
                                    labelData.Contains("Rebounds by the player") ? ScoreType.Rebound :
                                    labelData.Contains("Assists by the player") ? ScoreType.Assist :
                                    labelData.Contains("Points, rebounds & assists by the player") ? ScoreType.PointReboundAssist :
                                    labelData.Contains("3-point field goals made by the player") ? ScoreType.ThreePoint :
                                    string.Empty;

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var overData  = rawMetric.SelectToken("$.outcomes[?(@.label =~ /(Over.*)/)]");
                    var underData = rawMetric.SelectToken("$.outcomes[?(@.label =~ /(Under.*)/)]");

                    var playerData   = overData.SelectToken("$.participant").ToString();
                    var playerSplits = playerData.Split(',');
                    var rvPlayer     = playerSplits.Reverse().ToList();
                    var playerName   = string.Join(" ", rvPlayer);

                    var player = ScrapeHelper.FindPlayerInMatch(playerName, match);
                    if (player == null)
                    {
                        Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                        continue;
                    }

                    var overLineData = overData.SelectToken("$.label").ToString();
                    var overLine     = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(overLineData, @"Over.* (\d*.\d*)"));
                    var overOdd      = ScrapeHelper.ConvertMetric(overData.SelectToken("$.odds").ToString());
                    var over         = overOdd / 1000;

                    var underLineData = underData.SelectToken("$.label").ToString();
                    var underLine     = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(underLineData, @"Under.* (\d*.\d*)"));
                    var underOdd      = ScrapeHelper.ConvertMetric(underData.SelectToken("$.odds").ToString());
                    var under         = underOdd / 1000;

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        MatchId               = match.Id,
                        Over                  = over,
                        OverLine              = overLine,
                        Under                 = under,
                        UnderLine             = underLine,
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        CreatedAt             = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
Example #15
0
 public UbetPlayerOverUnder(ILogger logger, WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
     : base(logger, webPortalHelper, scrapeHelper)
 {
 }
        protected override async Task ScrapeData()
        {
            const string url       = "https://fixture.palmerbet.online/fixtures/sports/1c2eeb3a-6bab-4ac2-b434-165cc350180f/matches?pageSize=25";
            var          rawResult = await ScrapeHelper.GetDocument(url);

            var matchObj = JsonConvert.DeserializeObject <JToken>(rawResult);

            var rawMatches   = matchObj.SelectTokens("$.matches[*]");
            var foundMatches = new List <Match>();

            await UpdateScrapeStatus(10, "Scraping match data");

            foreach (var rawMatch in rawMatches)
            {
                var sourceMatchId = rawMatch.SelectToken("$.eventId").ToString();
                if (string.IsNullOrEmpty(sourceMatchId))
                {
                    Logger.Warning("Source Id is null");
                    continue;
                }

                var homeTeam = rawMatch.SelectToken("$.homeTeam.title").ToString();
                var awayTeam = rawMatch.SelectToken("$.awayTeam.title").ToString();
                var match    = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceMatchId;
                foundMatches.Add(match);
            }

            await UpdateScrapeStatus(20, "Scrape match data complete");

            var rawMetricsTasks = foundMatches
                                  .Select(match => $"https://fixture.palmerbet.online/fixtures/sports/matches/{match.SourceId}/markets?pageSize=1000")
                                  .Select(metricUrl => ScrapeHelper.GetDocument(metricUrl))
                                  .ToList();

            var rawMetrics = await Task.WhenAll(rawMetricsTasks);

            await UpdateScrapeStatus(20, "Scraping metric data");

            var rangeProgress = rawMetrics.Length != 0 ? 90 / rawMetrics.Length : 0;
            var currentRange  = 20;

            Logger.Information($"Total raw metrics count {rawMetrics.Length}");
            var totalMetrics = 0;

            try
            {
                for (var i = 0; i < rawMetrics.Length; i++)
                {
                    var rawMetric     = rawMetrics[i];
                    var metricObj     = JsonConvert.DeserializeObject <JToken>(rawMetric);
                    var metricMarkets = metricObj.SelectTokens("$.markets[?(@.title=~ /(.* - .*)/)]").ToList();

                    currentRange = Math.Min(currentRange + rangeProgress, 90);

                    foreach (var metricMarket in metricMarkets)
                    {
                        var title = metricMarket.SelectToken("$.title").ToString();

                        var scoreType =
                            title.Contains("Points") ? ScoreType.Point :
                            title.Contains("Rebounds") ? ScoreType.Rebound :
                            title.Contains("Assists") ? ScoreType.Assist :
                            title.Contains("Made Threes") ? ScoreType.ThreePoint :
                            title.Contains("Pts + Ast") ? ScoreType.PointAssist :
                            title.Contains("Pts + Reb + Ast") ? ScoreType.PointReboundAssist :
                            title.Contains("Pts + Reb") ? ScoreType.PointRebound :
                            title.Contains("Reb + Ast") ? ScoreType.ReboundAssist :
                            string.Empty;

                        if (string.IsNullOrEmpty(scoreType))
                        {
                            continue;
                        }
                        var playerName = title.Split('-')[0].Trim();
                        var player     = ScrapeHelper.FindPlayerInMatch(playerName, foundMatches[i]);
                        if (player == null)
                        {
                            Logger.Warning($"Cannot find any player {playerName} in match {foundMatches[i].Id}");
                            continue;
                        }

                        totalMetrics++;

                        var playerId = metricMarket.SelectToken("$.id").ToString();
                        var priceUrl = $"https://fixture.palmerbet.online/fixtures/sports/markets/{playerId}";
                        var priceDoc = await ScrapeHelper.GetDocument(priceUrl, 3000);

                        var priceObj = JsonConvert.DeserializeObject <JToken>(priceDoc);

                        if (priceObj == null)
                        {
                            Logger.Warning($"priceObj is null for player: {playerId}");
                            continue;
                        }

                        var    outcomeItems = priceObj.SelectTokens("$.market.outcomes[*]");
                        double?over = 0, overLine = 0, under = 0, underLine = 0;
                        foreach (var outcomeItem in outcomeItems)
                        {
                            var titleItem = outcomeItem.SelectToken("$.title").ToString();

                            if (titleItem.Contains("Over"))
                            {
                                var rawOver  = ScrapeHelper.RegexMappingExpression(titleItem, "(?:Over) (.*)");
                                var rawPrice = outcomeItem.SelectTokens("$.prices[*]").FirstOrDefault()
                                               .SelectToken("$.priceSnapshot.current").ToString();

                                overLine = ScrapeHelper.ConvertMetric(rawOver);
                                over     = ScrapeHelper.ConvertMetric(rawPrice);
                            }
                            else if (titleItem.Contains("Under"))
                            {
                                var rawUnder = ScrapeHelper.RegexMappingExpression(titleItem, "(?:Under) (.*)");
                                var rawPrice = outcomeItem.SelectTokens("$.prices[*]").FirstOrDefault()
                                               .SelectToken("$.priceSnapshot.current").ToString();

                                underLine = ScrapeHelper.ConvertMetric(rawUnder);
                                under     = ScrapeHelper.ConvertMetric(rawPrice);
                            }
                        }

                        Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                        var metric = new PlayerOverUnder
                        {
                            PlayerId              = player.Id,
                            ScoreType             = scoreType,
                            ScrapingInformationId = GetScrapingInformation().Id,
                            MatchId   = foundMatches[i].Id,
                            Over      = over,
                            OverLine  = overLine,
                            Under     = under,
                            UnderLine = underLine,
                            CreatedAt = DateTime.Now
                        };

                        PlayerUnderOvers.Add(metric);

                        var newProgress = GetScrapingInformation().Progress;
                        newProgress = Math.Min(newProgress + currentRange / metricMarkets.Count, currentRange);
                        await UpdateScrapeStatus(newProgress, null);
                    }

                    await UpdateScrapeStatus(currentRange, null);
                }
                await UpdateScrapeStatus(90, "Scrape metric data complete");

                Logger.Information($"Total metric count: {totalMetrics}");
            }
            catch (Exception ex)
            {
                Logger.Error(ex.ToString());
                throw;
            }
        }
Example #17
0
 public BorgataonlinePlayerOverUnder(ILogger logger, WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
     : base(logger, webPortalHelper, scrapeHelper)
 {
 }
Example #18
0
        private void ProcessMetric(Match match, IReadOnlyCollection <JToken> entrants,
                                   IReadOnlyCollection <JToken> prices, string scoreType, string actualScoreType)
        {
            var overMetrics = entrants.Where(x =>
            {
                var name = x.Children().FirstOrDefault()?.SelectToken("$.name").ToString();

                if (scoreType == "PR" || scoreType == "RA")
                {
                    return(name != null && name.Contains(actualScoreType) && name.Contains("Over") && !name.Contains("PRA"));
                }
                return(name != null && name.Contains(actualScoreType) && name.Contains("Over"));
            }).ToList();

            var underMetrics = entrants.Where(x =>
            {
                var name = x.Children().FirstOrDefault()?.SelectToken("$.name").ToString();
                if (scoreType == "PR" || scoreType == "RA")
                {
                    return(name != null && name.Contains(actualScoreType) && name.Contains("Under") && !name.Contains("PRA"));
                }
                return(name != null && name.Contains(actualScoreType) && name.Contains("Under"));
            }).ToList();

            var playerNames = new HashSet <string>();

            foreach (var content in overMetrics
                     .Select(overMetric => overMetric
                             .Children()
                             .FirstOrDefault()?
                             .SelectToken("$.name").ToString() ?? string.Empty))
            {
                playerNames.Add(ScrapeHelper.RegexMappingExpression(content, "(.*) Over"));
            }

            foreach (var content in underMetrics
                     .Select(underMetric => underMetric.Children()
                             .FirstOrDefault()?
                             .SelectToken("$.name").ToString() ?? string.Empty))
            {
                playerNames.Add(ScrapeHelper.RegexMappingExpression(content, "(.*) Under"));
            }

            foreach (var playerName in playerNames)
            {
                var player = ScrapeHelper.FindPlayerInMatch(playerName, match);
                if (player == null)
                {
                    Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                    continue;
                }

                var overContent = overMetrics.FirstOrDefault(x =>
                                                             x.Children().FirstOrDefault()?.SelectToken("$.name").ToString().Contains(playerName) ?? false)
                                  ?.Children().FirstOrDefault();

                var underContent = underMetrics.FirstOrDefault(x =>
                                                               x.Children().FirstOrDefault()?.SelectToken("$.name").ToString().Contains(playerName) ?? false)
                                   ?.Children().FirstOrDefault();

                var overLine =
                    ScrapeHelper.ConvertMetric(ScrapeHelper
                                               .RegexMappingExpression(overContent?.SelectToken("$.name").ToString(), "Over (.*) .*"));

                var underLine =
                    ScrapeHelper.ConvertMetric(ScrapeHelper
                                               .RegexMappingExpression(underContent?.SelectToken("$.name").ToString(), "Under (.*) .*"));

                var priceOverId  = overContent?.SelectToken("$.id").ToString() ?? string.Empty;
                var priceUnderId = underContent?.SelectToken("$.id").ToString() ?? string.Empty;

                var priceOverData    = prices.FirstOrDefault(x => x.ToString().Contains(priceOverId));
                var priceOverContent = priceOverData?.Children().FirstOrDefault();
                var numeratorOver    = ScrapeHelper.ConvertMetric(priceOverContent?.SelectToken("$.odds.numerator").ToString());
                var denominatorOver  = ScrapeHelper.ConvertMetric(priceOverContent?.SelectToken("$.odds.denominator").ToString());
                var over             = numeratorOver != null && denominatorOver != null ? numeratorOver / denominatorOver + 1 : null;

                var priceUnderData    = prices.FirstOrDefault(x => x.ToString().Contains(priceUnderId));
                var priceUnderContent = priceUnderData?.Children().FirstOrDefault();
                var numeratorUnder    = ScrapeHelper.ConvertMetric(priceUnderContent.SelectToken("$.odds.numerator").ToString());
                var denominatorUnder  = ScrapeHelper.ConvertMetric(priceUnderContent.SelectToken("$.odds.denominator").ToString());
                var under             = numeratorUnder != null && denominatorUnder != null ? numeratorUnder / denominatorUnder + 1 : null;

                Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                var metric = new PlayerOverUnder
                {
                    MatchId               = match.Id,
                    Over                  = over,
                    OverLine              = overLine,
                    Under                 = under,
                    UnderLine             = underLine,
                    PlayerId              = player.Id,
                    ScoreType             = scoreType,
                    ScrapingInformationId = GetScrapingInformation().Id,
                    CreatedAt             = DateTime.Now
                };

                PlayerUnderOvers.Add(metric);
            }
        }
        protected override async Task ScrapeData()
        {
            var chromeDriver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

            try
            {
                const string url = "https://www.5dimes.eu/";
                chromeDriver.Navigate().GoToUrl(url);
                await Task.Delay(2000);

                var userElement = chromeDriver.FindElementById("customerID");
                userElement.SendKeys("5D2543319");
                var passwordElement = chromeDriver.FindElementByName("password");
                passwordElement.SendKeys("qwerty123!");
                var loginButton = chromeDriver.FindElementById("submit1");
                loginButton.Click();
                await Task.Delay(2000);

                var nbaCheckbox = chromeDriver.FindElementByName("Basketball_NBA Props");
                nbaCheckbox.Click();

                var nbaSubmitElement = chromeDriver.FindElementById("btnContinue");
                nbaSubmitElement.Click();

                var doc = new HtmlDocument();
                doc.LoadHtml(chromeDriver.PageSource);

                var rawMatches = doc.DocumentNode.SelectNodes("//html/body/form/div[@id='PageElt']/div/div[@id='Middle']/div[@id='contentRight']/div[@id='ManagedContentWrapper']/div[@id='MainContent']/div[@id='mainContentContainer']/div[@id='readingPaneSplitPane']/div[@id='readingPaneContainer']/div[@id='readingPaneContentContainer']/div[@id='contentContainer']/div[@class='linesContainer']/table/tbody/tr");
                for (var i = 0; i < rawMatches.Count; i++)
                {
                    var tdScoreName = rawMatches[i].SelectSingleNode("td[3]");
                    if (tdScoreName == null)
                    {
                        continue;
                    }
                    var scoreText = tdScoreName.InnerText;
                    var scoreType =
                        scoreText.Contains("points") && !scoreText.Contains("first") && !scoreText.Contains("total") && !scoreText.Contains("wins") ? ScoreType.Point :
                        scoreText.Contains("assists") ? ScoreType.Assist :
                        scoreText.Contains("rebounds") ? ScoreType.Rebound :
                        scoreText.Contains("3-Pt") ? ScoreType.ThreePoint :
                        scoreText.Contains("pts+reb+ast") ? ScoreType.PointReboundAssist :
                        scoreText.Contains("pts+reb") ? ScoreType.PointRebound :
                        scoreText.Contains("pts+ast") ? ScoreType.PointAssist :
                        scoreText.Contains("reb+ast") ? ScoreType.ReboundAssist
                        : string.Empty;
                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var scoreSplits = scoreText.Split();
                    var playerName  = scoreSplits[1].Replace(".", " ");

                    var match = ScrapeHelper.FindMatchByPlayerName(playerName, TodayMatches);
                    if (match == null)
                    {
                        continue;
                    }
                    var player = ScrapeHelper.FindPlayerInMatch(playerName, match);

                    var overText = rawMatches[i].SelectSingleNode("td[6]").InnerText;
                    var overLine = ScrapeHelper.ConvertMetric($"{ScrapeHelper.RegexMappingExpression(overText, "o(.*)½")}.05");
                    var over     = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(overText, @"½ [\-\+](.*)").Trim());

                    var underText = rawMatches[i + 1].SelectSingleNode("td[6]").InnerText;
                    var underLine = ScrapeHelper.ConvertMetric($"{ScrapeHelper.RegexMappingExpression(underText, "u(.*)½")}.05");
                    var under     = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(underText, @"½ [\-\+](.*)").Trim());

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        MatchId               = match.Id,
                        Over                  = over,
                        OverLine              = overLine,
                        Under                 = under,
                        UnderLine             = underLine,
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        CreatedAt             = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex.ToString());
                chromeDriver.Quit();
                throw;
            }
            chromeDriver.Quit();
        }
Example #20
0
        protected override async Task ScrapeData()
        {
            var chromeDriver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

            try
            {
                const string url = "https://beteasy.com.au/api/sports/sports?filters%5BEventTypes%5D=107&filters%5BMasterCategoryID%5D=37";
                chromeDriver.Navigate().GoToUrl(url);
                await Task.Delay(10000);

                var pageSource = ScrapeHelper.RegexMappingExpression(chromeDriver.PageSource, "({.*})");
                var jDocument  = JsonConvert.DeserializeObject <JToken>(pageSource);
                var rawMatches = jDocument.SelectTokens("$.result.sports.events[*]");

                await UpdateScrapeStatus(10, "Scraping match data");

                Logger.Information("Scraping match data");
                var foundMatches = new List <Match>();
                foreach (var rawMatch in rawMatches)
                {
                    var sourceMatchId = rawMatch.SelectToken("$.MasterEventID").ToString();
                    if (string.IsNullOrEmpty(sourceMatchId))
                    {
                        Logger.Warning("Source match id is null");
                        continue;
                    }

                    var eventName = rawMatch.SelectToken("$.MasterEventName").ToString();
                    if (string.IsNullOrEmpty(eventName))
                    {
                        Logger.Warning("Even name is null");
                        continue;
                    }

                    var homeTeam = eventName.Split('@')[1];
                    var awayTeam = eventName.Split('@')[0];

                    var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                    if (match == null)
                    {
                        Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                        continue;
                    }

                    match.SourceId = sourceMatchId;
                    foundMatches.Add(match);
                }
                await UpdateScrapeStatus(20, "Scrape match data complete");

                Logger.Information("Scrape matches done");

                await UpdateScrapeStatus(20, "Scrape single metrics data");

                var rangeProgress = foundMatches.Count != 0 ? 55 / foundMatches.Count : 0;
                var currentRange  = 20;
                Logger.Information("Scrape single metrics data");
                foreach (var match in foundMatches)
                {
                    var singleMetricUrl =
                        $"https://beteasy.com.au/api/sports/event-group/?id={match.SourceId}&ecGroupOrderByIds%5B%5D=18";

                    chromeDriver.Navigate().GoToUrl(singleMetricUrl);
                    await Task.Delay(5000);

                    currentRange = Math.Min(currentRange + rangeProgress, 55);

                    var metricPageSource = ScrapeHelper.RegexMappingExpression(chromeDriver.PageSource, "({.*})");
                    var jRawMetrics      = JsonConvert.DeserializeObject <JToken>(metricPageSource);
                    var rawMetrics       = jRawMetrics.SelectTokens("$.result.*.BettingType[*]").ToList();

                    foreach (var rawMetric in rawMetrics)
                    {
                        var eventName = rawMetric.SelectToken("$.EventName").ToString();
                        var scoreType =
                            eventName.Contains("Points") ? ScoreType.Point :
                            eventName.Contains("Rebounds") ? ScoreType.Rebound :
                            eventName.Contains("Assists") ? ScoreType.Assist :
                            string.Empty;

                        if (string.IsNullOrEmpty(scoreType))
                        {
                            continue;
                        }

                        var playerName = ScrapeHelper.RegexMappingExpression(eventName, "(.*) (Points|Rebounds|Assists)");
                        var player     = ScrapeHelper.FindPlayerInMatch(playerName, match);
                        if (player == null)
                        {
                            Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                            continue;
                        }

                        var    outcomes = rawMetric.SelectTokens("$.Outcomes[*]");
                        double?over = 0, overLine = 0, under = 0, underLine = 0;
                        foreach (var outcome in outcomes)
                        {
                            var outcomeName = outcome.SelectToken("$.OutcomeName").ToString();
                            if (outcomeName.Contains("Over"))
                            {
                                var rawOver  = ScrapeHelper.RegexMappingExpression(outcomeName, "Over (.*)");
                                var rawPrice = outcome.SelectToken("$.BetTypes[0]").SelectToken("$.Price").ToString();

                                overLine = ScrapeHelper.ConvertMetric(rawOver);
                                over     = ScrapeHelper.ConvertMetric(rawPrice);
                            }
                            else if (outcomeName.Contains("Under"))
                            {
                                var rawUnder = ScrapeHelper.RegexMappingExpression(outcomeName, "Under (.*)");
                                var rawPrice = outcome.SelectToken("$.BetTypes[0]").SelectToken("$.Price").ToString();

                                underLine = ScrapeHelper.ConvertMetric(rawUnder);
                                under     = ScrapeHelper.ConvertMetric(rawPrice);
                            }
                        }
                        Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                        var metric = new PlayerOverUnder
                        {
                            MatchId               = match.Id,
                            Over                  = over,
                            OverLine              = overLine,
                            Under                 = under,
                            UnderLine             = underLine,
                            PlayerId              = player.Id,
                            ScoreType             = scoreType,
                            ScrapingInformationId = GetScrapingInformation().Id,
                            CreatedAt             = DateTime.Now
                        };

                        PlayerUnderOvers.Add(metric);

                        var newProgress = GetScrapingInformation().Progress;
                        newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                        await UpdateScrapeStatus(newProgress, null);
                    }
                    await UpdateScrapeStatus(currentRange, null);
                }
                Logger.Information("Scrape single metrics data complete");
                await UpdateScrapeStatus(55, "Scrape single metrics data complete");

                Logger.Information("Scrape combination metrics data");

                rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
                currentRange  = 55;
                await UpdateScrapeStatus(55, "Scrape combination metrics data");

                foreach (var match in foundMatches)
                {
                    var combinationMetricUrl =
                        $"https://beteasy.com.au/api/sports/event-group/?id={match.SourceId}&ecGroupOrderByIds%5B%5D=24";

                    chromeDriver.Navigate().GoToUrl(combinationMetricUrl);
                    await Task.Delay(5000);

                    currentRange = Math.Min(currentRange + rangeProgress, 90);

                    var metricPageSource = ScrapeHelper.RegexMappingExpression(chromeDriver.PageSource, "({.*})");
                    var jRawMetrics      = JsonConvert.DeserializeObject <JToken>(metricPageSource);
                    var rawMetrics       = jRawMetrics.SelectTokens("$.result.*.BettingType[*]").ToList();

                    foreach (var rawMetric in rawMetrics)
                    {
                        var eventName = rawMetric.SelectToken("$.EventName").ToString();
                        var scoreType =
                            eventName.Contains("Points + Rebounds + Assists") ? ScoreType.PointReboundAssist :
                            eventName.Contains("Points + Rebounds") ? ScoreType.PointRebound :
                            eventName.Contains("Points + Assists") ? ScoreType.PointAssist :
                            eventName.Contains("Rebounds + Assists") ? ScoreType.ReboundAssist :
                            string.Empty;

                        if (string.IsNullOrEmpty(scoreType))
                        {
                            continue;
                        }
                        var outcomes = rawMetric.SelectTokens("$.Outcomes[*]").ToList();

                        Player player = null;
                        foreach (var outcomeName in outcomes.Select(outcome => outcome.SelectToken("$.OutcomeName").ToString()))
                        {
                            if (outcomeName.Contains("Over"))
                            {
                                var playerName = ScrapeHelper.RegexMappingExpression(outcomeName, "(.*) Over");
                                player = ScrapeHelper.FindPlayerInMatch(playerName, match);
                                if (player != null)
                                {
                                    continue;
                                }
                                Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                            }
                            else if (outcomeName.Contains("Under"))
                            {
                                var playerName = ScrapeHelper.RegexMappingExpression(outcomeName, "(.*) Under");
                                player = ScrapeHelper.FindPlayerInMatch(playerName, match);
                                if (player != null)
                                {
                                    continue;
                                }
                                Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                            }
                        }

                        if (player == null)
                        {
                            continue;
                        }

                        double?over = 0, overLine = 0, under = 0, underLine = 0;
                        foreach (var outcome in outcomes)
                        {
                            var outcomeName = outcome.SelectToken("$.OutcomeName").ToString();
                            if (outcomeName.Contains("Over"))
                            {
                                var rawOver  = ScrapeHelper.RegexMappingExpression(outcomeName, "Over (.*)");
                                var rawPrice = outcome.SelectToken("$.BetTypes[0]").SelectToken("$.Price").ToString();

                                overLine = string.IsNullOrEmpty(rawOver) ? (double?)null : Convert.ToDouble(rawOver);
                                over     = string.IsNullOrEmpty(rawPrice) ? (double?)null : Convert.ToDouble(rawPrice);
                            }
                            else if (outcomeName.Contains("Under"))
                            {
                                var rawUnder = ScrapeHelper.RegexMappingExpression(outcomeName, "Under (.*)");
                                var rawPrice = outcome.SelectToken("$.BetTypes[0]").SelectToken("$.Price").ToString();

                                underLine = string.IsNullOrEmpty(rawUnder) ? (double?)null : Convert.ToDouble(rawUnder);
                                under     = string.IsNullOrEmpty(rawPrice) ? (double?)null : Convert.ToDouble(rawPrice);
                            }
                        }
                        Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                        var metric = new PlayerOverUnder
                        {
                            MatchId               = match.Id,
                            Over                  = over,
                            OverLine              = overLine,
                            Under                 = under,
                            UnderLine             = underLine,
                            PlayerId              = player.Id,
                            ScoreType             = scoreType,
                            ScrapingInformationId = GetScrapingInformation().Id,
                            CreatedAt             = DateTime.Now
                        };

                        PlayerUnderOvers.Add(metric);

                        var newProgress = GetScrapingInformation().Progress;
                        newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                        await UpdateScrapeStatus(newProgress, null);
                    }
                    await UpdateScrapeStatus(currentRange, null);
                }
                Logger.Information("Scrape combination metrics data complete");
                await UpdateScrapeStatus(90, "Scrape combination metrics data complete");
            }
            catch (Exception ex)
            {
                Logger.Error(ex.ToString());
                chromeDriver.Quit();
                throw;
            }
            chromeDriver.Quit();
        }
Example #21
0
        protected override async Task ScrapeData()
        {
            var chromeDriver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

            try
            {
                const string url = "https://nodejs08.tglab.io/cache/20/en/us/11624/prematch-by-tournaments.json";
                chromeDriver.Navigate().GoToUrl(url);
                await Task.Delay(2000);

                var pageSource = ScrapeHelper.RegexMappingExpression(chromeDriver.PageSource, "({.*})");
                var jDocument  = JsonConvert.DeserializeObject <JToken>(pageSource);
                var rawMatches = jDocument.SelectTokens("$.events[*]");

                var foundMatches = new List <Match>();
                foreach (var rawMatch in rawMatches)
                {
                    var sourceId = rawMatch.SelectToken("$.id").ToString();
                    if (string.IsNullOrEmpty(sourceId))
                    {
                        Logger.Warning("Source match id is null");
                        continue;
                    }

                    var homeTeam = rawMatch.SelectToken("$.teams.home").ToString();
                    var awayTeam = rawMatch.SelectToken("$.teams.away").ToString();

                    var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                    if (match == null)
                    {
                        Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                        continue;
                    }

                    match.SourceId = sourceId;
                    foundMatches.Add(match);
                }

                var tempMetrics = new List <PlayerOverUnder>();
                foreach (var match in foundMatches)
                {
                    var metricUrl = $"https://nodejs08.tglab.io/cache/20/en/us/{match.SourceId}/single-pre-event.json?hidenseek=95183b1a46914705952f351b5bc156fd8e1e7b57be65d492e09186129ff70e8a1ba8";
                    chromeDriver.Navigate().GoToUrl(metricUrl);
                    await Task.Delay(2000);

                    var pageSourceMarket = ScrapeHelper.RegexMappingExpression(chromeDriver.PageSource, "({.*})");
                    var marketData       = JsonConvert.DeserializeObject <JToken>(pageSourceMarket);

                    var rawMetrics = marketData.SelectTokens("$.odds.*");
                    foreach (var rawMetric in rawMetrics)
                    {
                        var teamName = rawMetric.SelectToken("$.team_name.en").ToString();
                        if (!teamName.Contains("total points"))
                        {
                            continue;
                        }

                        var playerSplits = ScrapeHelper.RegexMappingExpression(teamName, "(.*) total").Split('.');
                        var playerName   = $"{playerSplits[0]} {playerSplits[1]}";
                        var player       = ScrapeHelper.FindPlayerInMatch(playerName, match);
                        if (player == null)
                        {
                            Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                            continue;
                        }

                        var metric = tempMetrics.FirstOrDefault(x => x.PlayerId == player.Id);
                        if (teamName.Contains("OVER"))
                        {
                            if (metric != null)
                            {
                                metric.OverLine = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.additional_value_raw").ToString());
                                metric.Over     = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.odd_value").ToString());
                            }
                            else
                            {
                                var newMetric = new PlayerOverUnder
                                {
                                    MatchId  = match.Id,
                                    PlayerId = player.Id,
                                    OverLine = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.additional_value_raw").ToString()),
                                    Over     = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.odd_value").ToString()),
                                    ScrapingInformationId = GetScrapingInformation().Id,
                                    CreatedAt             = DateTime.Now
                                };
                                tempMetrics.Add(newMetric);
                            }
                        }
                        else if (teamName.Contains("UNDER"))
                        {
                            if (metric != null)
                            {
                                metric.UnderLine = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.additional_value_raw").ToString());
                                metric.Under     = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.odd_value").ToString());
                            }
                            else
                            {
                                var newMetric = new PlayerOverUnder
                                {
                                    MatchId               = match.Id,
                                    PlayerId              = player.Id,
                                    UnderLine             = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.additional_value_raw").ToString()),
                                    Under                 = ScrapeHelper.ConvertMetric(rawMetric.SelectToken("$.odd_value").ToString()),
                                    ScrapingInformationId = GetScrapingInformation().Id,
                                    CreatedAt             = DateTime.Now
                                };
                                tempMetrics.Add(newMetric);
                            }
                        }
                    }
                }

                foreach (var metric in tempMetrics)
                {
                    Logger.Information($"{metric.Player.Name}: " +
                                       $"{metric.Over} {metric.OverLine} | " +
                                       $"{metric.Under} {metric.UnderLine}");
                }

                PlayerUnderOvers.AddRange(tempMetrics);
            }
            catch (Exception ex)
            {
                Logger.Error(ex.ToString());
                chromeDriver.Quit();
                throw;
            }
            chromeDriver.Quit();
        }
        public void SearchTransactions(TransactionType transactionType)
        {
            if (HotItemController.CurrentApi.IsTransactionApiSupported)
            {
                var f = new TaskFactory();
                var t = f.StartNew(() =>
                {
                    //int count = 10;
                    //int offset = page * 10;
                    ScrapeHelper transactionScraper = new ScrapeHelper(HotItemController.Config.SessionKey) { TransactionType = transactionType };
                    transactionScraper.Finished += new EventHandler<ScrapeFinishedEventArgs>(transactionScraper_Finished);

                    String uri = HotItemController.CurrentApi.UriTransaction(transactionType, 0, HotItemController.Config.TransactionLimit);

                    transactionScraper.CrawlString(uri, 0, 0, HotItemController.CurrentApi);
                });
            }
        }
        protected override async Task ScrapeData()
        {
            const string url    = "https://www.sportsbet.com.au/apigw/sportsbook-sports/Sportsbook/Sports/Competitions/6927/Events";
            var          rawDoc = await ScrapeHelper.GetDocument(url);

            var jDoc = JsonConvert.DeserializeObject <JToken>(rawDoc);

            var rawMatches   = jDoc.SelectTokens("$.[*]");
            var foundMatches = new List <Match>();

            await UpdateScrapeStatus(10, "Scraping match data");

            Logger.Information("Scraping match data");
            foreach (var rawMatch in rawMatches)
            {
                if (rawMatch.SelectToken("$.competitionName").ToString() != "NBA Matches")
                {
                    continue;
                }

                var sourceMatchId = rawMatch.SelectToken("$.id").ToString();
                if (string.IsNullOrEmpty(sourceMatchId))
                {
                    Logger.Warning("Source Id is null");
                    continue;
                }

                var matchName = rawMatch.SelectToken("$.name").ToString();
                var teams     = matchName.Split(new[] { " At " }, StringSplitOptions.None);
                var homeTeam  = teams[1];
                var awayTeam  = teams[0];

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceMatchId;
                foundMatches.Add(match);
            }
            Logger.Information("Scrape match data complete");
            await UpdateScrapeStatus(20, "Scrape match data complete");

            await UpdateScrapeStatus(20, "Scraping metric data");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            Logger.Information("Scrape metric data");
            foreach (var match in foundMatches)
            {
                var pointsUrl      = $"https://www.sportsbet.com.au/apigw/sportsbook-sports/Sportsbook/Sports/Events/{match.SourceId}/MarketGroupings/567/Markets";
                var reboundsUrl    = $"https://www.sportsbet.com.au/apigw/sportsbook-sports/Sportsbook/Sports/Events/{match.SourceId}/MarketGroupings/568/Markets";
                var assistsUrl     = $"https://www.sportsbet.com.au/apigw/sportsbook-sports/Sportsbook/Sports/Events/{match.SourceId}/MarketGroupings/569/Markets";
                var combinationUrl = $"https://www.sportsbet.com.au/apigw/sportsbook-sports/Sportsbook/Sports/Events/{match.SourceId}/MarketGroupings/570/Markets";

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                var docTasks = new List <Task <string> >
                {
                    ScrapeHelper.GetDocument(pointsUrl),
                    ScrapeHelper.GetDocument(reboundsUrl),
                    ScrapeHelper.GetDocument(assistsUrl),
                    ScrapeHelper.GetDocument(combinationUrl)
                };

                var results = await Task.WhenAll(docTasks);

                var rawMetrics = new List <JToken>();
                foreach (var result in results)
                {
                    rawMetrics.AddRange(JsonConvert.DeserializeObject <JToken>(result).SelectTokens("$.[*]"));
                }

                foreach (var rawMetric in rawMetrics)
                {
                    var metricName = rawMetric.SelectToken("$.name").ToString();
                    var scoreType  =
                        metricName.Contains("Pts + Reb + Ast") ? ScoreType.PointReboundAssist :
                        metricName.Contains("Points") ? ScoreType.Point :
                        metricName.Contains("Assists") ? ScoreType.Assist :
                        metricName.Contains("Made Threes") ? ScoreType.ThreePoint :
                        metricName.Contains("Rebounds") ? ScoreType.Rebound :
                        metricName.Contains("Pts + Reb") ? ScoreType.PointRebound :
                        metricName.Contains("Pts + Ast") ? ScoreType.PointAssist :
                        metricName.Contains("Reb + Ast") ? ScoreType.ReboundAssist :
                        string.Empty;

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var playerName = metricName.Split('-')[0];
                    var player     = ScrapeHelper.FindPlayerInMatch(playerName, match);
                    if (player == null)
                    {
                        Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                        continue;
                    }

                    var    selection = rawMetric.SelectToken("$.selections[0]");
                    var    selectionName = selection.SelectToken("$.name").ToString();
                    double?over = 0, overLine = 0, under = 0, underLine = 0;
                    if (selectionName.Contains("Over"))
                    {
                        over     = ScrapeHelper.ConvertMetric(selection.SelectToken("$.price.winPrice")?.ToString());
                        overLine = ScrapeHelper.ConvertMetric(selection.SelectToken("$.unformattedHandicap")?.ToString());
                    }
                    else if (selectionName.Contains("Under"))
                    {
                        under     = ScrapeHelper.ConvertMetric(selection.SelectToken("$.price.winPrice")?.ToString());
                        underLine = ScrapeHelper.ConvertMetric(selection.SelectToken("$.unformattedHandicap")?.ToString());
                    }

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        MatchId   = match.Id,
                        Over      = over,
                        OverLine  = overLine,
                        Under     = under,
                        UnderLine = underLine,
                        CreatedAt = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            Logger.Information("Scrape metric data complete");
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
        protected override async Task ScrapeData()
        {
            // Fetch all teams from web portal
            var teams = await WebPortalHelper.GetTeams(Helper.GetSportCode());

            if (teams == null || teams.Count == 0)
            {
                throw new ArgumentNullException(nameof(teams), "Teams from web portal is null");
            }
            FromDate = Helper.ToMinTime(FromDate);
            ToDate   = Helper.ToMaxTime(ToDate);
            var totalDays = Convert.ToInt32((ToDate - FromDate).TotalDays);

            for (var date = FromDate.Date; date <= ToDate.Date; date = date.AddDays(1))
            {
                Logger.Information($"Scrape matches: {date.ToShortDateString()}");
                await UpdateScrapeStatus(null, $"Scrape matches: {date.ToShortDateString()}");

                var url       = $"http://site.api.espn.com/apis/site/v2/sports/basketball/nba/scoreboard?lang=en&region=au&calendartype=blacklist&limit=100&dates={Helper.GetDate(date)}&tz=Australia%2FMelbourne";
                var rawResult = await ScrapeHelper.GetDocument(url);

                var jObject = JObject.Parse(rawResult);
                if (jObject == null)
                {
                    throw new ArgumentNullException(nameof(jObject));
                }

                var sportCode    = Helper.GetSportCode();
                var teamCodes    = new List <string>();
                var competitions = jObject.SelectTokens("$.events[*].competitions[*]");
                foreach (var competition in competitions)
                {
                    var homeAbbr = competition.SelectToken("$.competitors[0].team.abbreviation").ToString();
                    var awayAbbr = competition.SelectToken("$.competitors[1].team.abbreviation").ToString();

                    if (teams.All(x => x.ShortName != homeAbbr))
                    {
                        throw new Exception($"Cannot find any home team named '{homeAbbr}' in teams");
                    }
                    if (teams.All(x => x.ShortName != awayAbbr))
                    {
                        throw new Exception($"Cannot find any away team named '{awayAbbr}' in teams");
                    }

                    teamCodes.Add(homeAbbr);
                    teamCodes.Add(awayAbbr);

                    var homeTeamId = teams.First(x => x.ShortName.Equals(homeAbbr)).Id;
                    var awayTeamId = teams.First(x => x.ShortName.Equals(awayAbbr)).Id;

                    var homeTeamName = competition.SelectToken("$.competitors[0].team.name").ToString();
                    var awayTeamName = competition.SelectToken("$.competitors[1].team.name").ToString();
                    homeTeamName = homeTeamName.Substring(0, Math.Min(homeTeamName.Length, 3)).ToUpper();
                    awayTeamName = awayTeamName.Substring(0, Math.Min(awayTeamName.Length, 3)).ToUpper();

                    var gameCode = $"{Helper.GetDate(date, "MMddyyyy")}{homeTeamName}{awayTeamName}";
                    var gameDate = competition.SelectToken("$.date").ToString();
                    Logger.Information($"Match: {gameCode}, {homeTeamName} vs {awayTeamName}, {gameDate}");
                    Matches.Add(new Match
                    {
                        StartTime  = DateTime.Parse(gameDate),
                        HomeTeamId = homeTeamId,
                        AwayTeamId = awayTeamId,
                        GameCode   = gameCode,
                        SportCode  = sportCode
                    });
                }
                Logger.Information("Scraped matches complete");

                Logger.Information("Scrape players from teams");
                const string baseTeamsUrl   = "https://www.espn.com/nba/team/stats/_/name";
                const string xPathToPlayers = "/html/body/div[1]/div/div/div/div/div[5]/div[2]/div[5]/div[1]/div/section/div/section[1]/div[2]/table/tbody/tr[*]/td/span/a";
                var          playerTasks    = new List <Task <HtmlNodeCollection> >();
                foreach (var teamCode in teamCodes)
                {
                    url = $"{baseTeamsUrl}/{teamCode}";
                    playerTasks.Add(ScrapeHelper.GetInnerHtml(url, xPathToPlayers));
                }

                var nodes = await Task.WhenAll(playerTasks);

                for (var i = 0; i < teamCodes.Count; i++)
                {
                    var teamId = teams.First(x => x.ShortName == teamCodes[i]).Id;
                    Logger.Information($"Scrape player from: {baseTeamsUrl}/{teamCodes[i]}");
                    ExtractPlayers(nodes[i], teamId);
                }

                Logger.Information("Scrape players complete");
                var newProgress = GetScrapingInformation().Progress;
                newProgress = Math.Min(newProgress + 90 / totalDays, 90);
                await UpdateScrapeStatus(newProgress, $"Scrape matches: {date.ToShortDateString()} complete");
            }
        }
 public EspnFutureCompetition(ILogger logger, WebPortalHelper webPortalHelper, ScrapeHelper scrapeHelper)
     : base(logger, webPortalHelper, scrapeHelper)
 {
 }
        public void Search(int page, SearchFilters filters)
        {
            if (SearchFinished != null)
            {
                this.CurrentSearchFilters = filters;
                TaskFactory f = new TaskFactory();
                var t = f.StartNew(() =>
                {
                    int count = HotItemController.CurrentApi.ItemsPerPage;
                    int offset = (page) * HotItemController.CurrentApi.ItemsPerPage;

                    ScrapeHelper searchScraper = new ScrapeHelper(Config.SessionKey);
                    searchScraper.Finished += new EventHandler<DataProvider.Event.ScrapeFinishedEventArgs>(searchScraper_Finished);

                    string sortingMode = filters.SortingMode.ToString();
                    if (filters.SortingMode == SortingMode.none)
                    {
                        sortingMode = null;
                    }
                    IsSearchInProgress = true;
                    String uri = HotItemController.CurrentApi.UriSearch(
                        filters.QueryString, offset, count, filters.TypeId, filters.SubTypeId, filters.Rarity, filters.LevelMin, filters.LevelMax, sortingMode, filters.DescendingSorting); //h.UseSearchApi().Add("text", query).Add("offset", offset.ToString()).Add("count", count.ToString()).Generate();
                    searchScraper.CrawlString(uri, 0, filters.QueryString, HotItemController.CurrentApi);
                });
            }
        }
        protected override async Task ScrapeData()
        {
            const string url    = "https://www.betvictor.com/api/top_bets/601600?number_to_show=20&exclude_in_running=true&event_ids_to_exclude=&sport_ids_to_exclude=";
            var          rawDoc = await ScrapeHelper.GetDocument(url);

            var jDoc = JsonConvert.DeserializeObject <JToken>(rawDoc);

            await UpdateScrapeStatus(10, "Scraping match data");

            var rawMatches   = jDoc.SelectTokens("$.[?(@.meeting_description == 'NBA')]");
            var foundMatches = new List <Match>();

            foreach (var rawMatch in rawMatches)
            {
                var sourceMatchId = rawMatch.SelectToken("$.event_id").ToString();
                if (string.IsNullOrEmpty(sourceMatchId))
                {
                    Logger.Warning("Source Id is null");
                    continue;
                }

                if (foundMatches.Select(x => x.SourceId).Contains(sourceMatchId))
                {
                    continue;
                }

                var game     = rawMatch.SelectToken("$.event_description").ToString();
                var clubs    = game.Split('@');
                var homeTeam = clubs[1];
                var awayTeam = clubs[0];

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceMatchId;
                foundMatches.Add(match);
            }
            await UpdateScrapeStatus(20, "Scrape match data complete");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            await UpdateScrapeStatus(20, "Scraping metric data");

            foreach (var match in foundMatches)
            {
                rawDoc = await ScrapeHelper.GetDocument($"https://www.betvictor.com/bv_event_level/en-gb/1/coupons/{match.SourceId}/4787?t=1573192805056");

                var jResult = JsonConvert.DeserializeObject <JToken>(rawDoc);

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                var rawMetrics = jResult.SelectTokens("$.[*].markets[*]").ToList();
                foreach (var rawMetric in rawMetrics)
                {
                    var description = rawMetric.SelectToken("$.des").ToString();
                    var scoreType   =
                        description.Contains("Total combined points, assists & rebounds") ? ScoreType.PointReboundAssist :
                        description.Contains("Total points") ? ScoreType.Point :
                        description.Contains("Total assists") ? ScoreType.Assist :
                        description.Contains("Total three pointers") ? ScoreType.ThreePoint :
                        description.Contains("Total rebounds") ? ScoreType.Rebound :
                        description.Contains("Total combined points & rebounds") ? ScoreType.PointRebound :
                        description.Contains("Total combined points & assists") ? ScoreType.PointAssist :
                        description.Contains("Total combined assists & rebounds") ? ScoreType.ReboundAssist :
                        string.Empty;

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var playerName = rawMetric.SelectToken("$.opponentDescription").ToString();
                    var player     = ScrapeHelper.FindPlayerInMatch(playerName, match);
                    if (player == null)
                    {
                        Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                        continue;
                    }

                    var playerMetrics = rawMetric.SelectTokens("$.o[*]");

                    double?over = 0, overLine = 0, under = 0, underLine = 0;
                    foreach (var metricItem in playerMetrics)
                    {
                        var des = metricItem.SelectToken("$.des").ToString();
                        if (des.Contains("Over"))
                        {
                            overLine = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(des, "Over (.*)"));
                            over     = ScrapeHelper.ConvertMetric(metricItem.SelectToken("$.pr").ToString());
                        }
                        else if (des.Contains("Under"))
                        {
                            underLine = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(des, "Under (.*)"));
                            under     = ScrapeHelper.ConvertMetric(metricItem.SelectToken("$.pr").ToString());
                        }
                    }

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        MatchId   = match.Id,
                        Over      = over,
                        OverLine  = overLine,
                        Under     = under,
                        UnderLine = underLine,
                        CreatedAt = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
        private void ThreadRunProcessVerifier()
        {
            try
            {
                GuildWars2Status = Notifier.GuildWars2Status.NotRunning;

                while (IsRunning)
                {
                    if (_scraper == null)
                    {
                        _scraper = new ScrapeHelper(Config.SessionKey);
                    }
                    _scraper.EatCookie(Config.SessionKey);
                    if (_scraper.VerifyKey())
                    {
                        CurrentApi = tradingPostApi;
                        GuildWars2Status = Notifier.GuildWars2Status.FoundKey;
                        IsSessionKeyValid = true;
                        break;
                    }
                    else
                    {
                        CheckGuildWars2Process();
                        if (_keyHelper == null)
                        {
                            _keyHelper = new SessionKeyReader.KeyHelper();
                        }

                        if (GuildWars2Running && !_keyHelper.Running)
                        {
                            GuildWars2Status = Notifier.GuildWars2Status.SearchingKey;
                            _keyHelper.UriFound -= new EventHandler<SessionKeyReader.UriFoundEventArgs>(keyHelper_UriFound);
                            _keyHelper.UriFound += new EventHandler<SessionKeyReader.UriFoundEventArgs>(keyHelper_UriFound);
                            _keyHelper.FindKey();
                        }
                    }
                    Thread.Sleep(10000);
                }
            }
            catch (ThreadInterruptedException)
            {
                IsRunning = false;
            }
        }
        protected override async Task ScrapeData()
        {
            const string url = "https://api.pointsbet.com/api/v2/competitions/7176/events/featured?includeLive=true";
            var          doc = await ScrapeHelper.GetDocument(url);

            var jDoc         = JsonConvert.DeserializeObject <JToken>(doc);
            var rawMatches   = jDoc.SelectTokens("$.events[*]");
            var foundMatches = new List <Match>();

            await UpdateScrapeStatus(10, "Scraping match data");

            Logger.Information("Scraping match data");
            foreach (var rawMatch in rawMatches)
            {
                var sourceId = rawMatch.SelectToken("$.key").ToString();
                if (string.IsNullOrEmpty(sourceId))
                {
                    Logger.Warning("Source Id is null");
                    continue;
                }
                var homeTeam = rawMatch.SelectToken("$.homeTeam").ToString();
                var awayTeam = rawMatch.SelectToken("$.awayTeam").ToString();
                var match    = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);

                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceId;
                foundMatches.Add(match);
            }
            Logger.Information("Scrape match data complete");
            await UpdateScrapeStatus(20, "Scrape match data complete");

            await UpdateScrapeStatus(20, "Scraping metric data");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            Logger.Information("Scrape metric data");
            foreach (var match in foundMatches)
            {
                var metricUrl = $"https://api.pointsbet.com/api/v2/events/{match.SourceId}";
                doc = await ScrapeHelper.GetDocument(metricUrl);

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                var rawMetrics = jDoc
                                 .SelectTokens(
                    @"$.fixedOddsMarkets[?(@.name =~ /(Player Points Over\/Under .*)/ || @.name =~ /(Player Rebounds Over\/Under .*)/ || @.name =~ /(Player Assists Over\/Under .*)/)]")
                                 .ToList();
                foreach (var rawMetric in rawMetrics)
                {
                    var metricName = rawMetric.SelectToken("$.name").ToString();
                    var scoreType  =
                        metricName.Contains("Player Points") ? ScoreType.Point :
                        metricName.Contains("Player Assists") ? ScoreType.Assist :
                        metricName.Contains("Player Rebounds") ? ScoreType.Rebound :
                        metricName.Contains("Player Pts + Rebs + Asts") ? ScoreType.PointReboundAssist :
                        string.Empty;

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var outcomeOvers  = rawMetric.SelectTokens("$.outcomes[?(@.name =~ /(.* Over .*)/)]").ToList();
                    var outcomeUnders = rawMetric.SelectTokens("$.outcomes[?(@.name =~ /(.* Under .*)/)]").ToList();

                    var playerNames = new HashSet <string>();

                    foreach (var name in outcomeOvers.Select(outcome => outcome.SelectToken("name").ToString()))
                    {
                        playerNames.Add(ScrapeHelper.RegexMappingExpression(name, "(.*)(?:Over|Under)"));
                    }

                    foreach (var name in outcomeUnders.Select(outcome => outcome.SelectToken("name").ToString()))
                    {
                        playerNames.Add(ScrapeHelper.RegexMappingExpression(name, "(.*)(?:Over|Under)"));
                    }

                    foreach (var playerName in playerNames)
                    {
                        var player = ScrapeHelper.FindPlayerInMatch(playerName, match);
                        if (player == null)
                        {
                            Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                            continue;
                        }

                        var outcomeOver = outcomeOvers.FirstOrDefault(x =>
                                                                      x.SelectToken("$.name").ToString().Contains(playerName));
                        var outcomeUnder = outcomeUnders.FirstOrDefault(x =>
                                                                        x.SelectToken("$.name").ToString().Contains(playerName));

                        var rawOver     = outcomeOver?.SelectToken("price").ToString();
                        var rawOverLine =
                            ScrapeHelper.RegexMappingExpression(outcomeOver?.SelectToken("$.name").ToString(),
                                                                "(?:Over) (.*)");

                        var rawUnder     = outcomeUnder?.SelectToken("price").ToString();
                        var rawUnderLine =
                            ScrapeHelper.RegexMappingExpression(outcomeUnder?.SelectToken("$.name").ToString(),
                                                                "(?:Under) (.*)");

                        Logger.Information($"{player.Name}: {scoreType} - {rawOver} {rawOverLine} | {rawUnder} {rawUnderLine}");

                        var metric = new PlayerOverUnder
                        {
                            MatchId               = match.Id,
                            Over                  = ScrapeHelper.ConvertMetric(rawOver),
                            OverLine              = ScrapeHelper.ConvertMetric(rawOverLine),
                            Under                 = ScrapeHelper.ConvertMetric(rawUnder),
                            UnderLine             = ScrapeHelper.ConvertMetric(rawUnderLine),
                            PlayerId              = player.Id,
                            ScoreType             = scoreType,
                            ScrapingInformationId = GetScrapingInformation().Id,
                            CreatedAt             = DateTime.Now
                        };

                        PlayerUnderOvers.Add(metric);

                        var newProgress = GetScrapingInformation().Progress;
                        newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                        await UpdateScrapeStatus(newProgress, null);
                    }
                    await UpdateScrapeStatus(currentRange, null);
                }
            }
            Logger.Information("Scrape metric data complete");
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
Example #30
0
        protected override async Task ScrapeData()
        {
            const string url = "https://cds-api.borgataonline.com/bettingoffer/fixtures?x-bwin-accessid=ZTJhZDliYjgtNTdmOC00Njk0LWIxZmItODI3YzhjZGQ5NmIx&lang=en-US&country=VN&userCountry=VN&streamProviders=unas%2Cperform%2Cimgdge&fixtureTypes=Standard&state=Latest&skip=0&take=50&offerMapping=Filtered&offerCategories=Gridable&fixtureCategories=Gridable,NonGridable,Other&sortBy=Tags&sportIds=7&regionIds=9&competitionIds=6004";
            var          doc = await ScrapeHelper.GetDocument(url);

            var jDoc       = JsonConvert.DeserializeObject <JToken>(doc);
            var rawMatches = jDoc.SelectTokens("$.fixtures[*]");

            await UpdateScrapeStatus(10, "Scraping match data");

            var foundMatches = new List <Match>();

            foreach (var rawMatch in rawMatches)
            {
                var sourceId = rawMatch.SelectToken("$.id").ToString();
                if (string.IsNullOrEmpty(sourceId))
                {
                    Logger.Warning("Source match id is null");
                    continue;
                }
                var participants = rawMatch.SelectTokens("$.participants[*]").ToList();
                var homeTeam     = participants.Last().SelectToken("$.name.value").ToString();
                var awayTeam     = participants.First().SelectToken("$.name.value").ToString();

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceId;
                foundMatches.Add(match);
            }
            await UpdateScrapeStatus(20, "Scrape match data complete");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            await UpdateScrapeStatus(20, "Scraping metric data");

            foreach (var match in foundMatches)
            {
                var metricUrl = $"https://cds-api.borgataonline.com/bettingoffer/fixture-view?x-bwin-accessid=ZTJhZDliYjgtNTdmOC00Njk0LWIxZmItODI3YzhjZGQ5NmIx&lang=en-US&country=VN&userCountry=VN&streamProviders=unas%2Cperform%2Cimgdge&offerMapping=All&scoreboardMode=Full&fixtureIds={match.SourceId}";
                doc = await ScrapeHelper.GetDocument(metricUrl);

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                var rawMetrics = jDoc.SelectTokens("$.fixture.games[*]").ToList();
                foreach (var rawMetric in rawMetrics)
                {
                    var nameData  = rawMetric.SelectToken("$.name.value").ToString();
                    var scoreType =
                        nameData.Contains("How many points") ? ScoreType.Point :
                        nameData.Contains("How many assists") ? ScoreType.Assist :
                        nameData.Contains("How many rebounds") ? ScoreType.Rebound :
                        string.Empty;
                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var playerName = ScrapeHelper.RegexMappingExpression(nameData, @".* will (.*) \(");
                    var player     = ScrapeHelper.FindPlayerInMatch(playerName, match);
                    if (player == null)
                    {
                        Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                        continue;
                    }

                    var overData     = rawMetric.SelectToken("$.results[0]");
                    var over         = ScrapeHelper.ConvertMetric(overData.SelectToken("$.odds").ToString());
                    var overLineData = overData.SelectToken("$.name.value").ToString();
                    var overLine     = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(overLineData, "Over (.*)"));

                    var underData     = rawMetric.SelectToken("$.results[0]");
                    var under         = ScrapeHelper.ConvertMetric(underData.SelectToken("$.odds").ToString());
                    var underLineData = underData.SelectToken("$.name.value").ToString();
                    var underLine     = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(underLineData, "Over (.*)"));

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        MatchId               = match.Id,
                        Over                  = over,
                        OverLine              = overLine,
                        Under                 = under,
                        UnderLine             = underLine,
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        CreatedAt             = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
Example #31
0
 public virtual void BuildItem(bool force)
 {
     if (!ItemBuildDone || force)
     {
         using (var s = new ScrapeHelper(HotItemController.Config.SessionKey))
         {
             ItemBuildDone = true;
             String uri = HotItemController.CurrentApi.UriBuildItem(DataId); //new UriHelper().UseSearchApi().Add("ids", DataId.ToString()).Generate();
             s.Finished -= new EventHandler<DataProvider.Event.ScrapeFinishedEventArgs>(sSearch_Finished);
             s.Finished += new EventHandler<DataProvider.Event.ScrapeFinishedEventArgs>(sSearch_Finished);
             s.CrawlString(uri, DataId, DataId, HotItemController.CurrentApi);
         }
     }
 }
Example #32
0
        protected override async Task ScrapeData()
        {
            const string url = "https://api.neds.com.au/v2/sport/event-request?category_ids=%5B%223c34d075-dc14-436d-bfc4-9272a49c2b39%22%5D";
            var          doc = await ScrapeHelper.GetDocument(new Uri(url));

            var jDoc       = JsonConvert.DeserializeObject <JToken>(doc);
            var rawMatches = jDoc.SelectToken("$.events").ToList();

            var foundMatches = new List <Match>();

            await UpdateScrapeStatus(10, "Scraping match data");

            Logger.Information("Scraping match data");
            foreach (var matchContent in rawMatches.Select(rawMatch => rawMatch.Children().FirstOrDefault()))
            {
                if (matchContent == null)
                {
                    Logger.Warning("Match content is null");
                    continue;
                }

                var sourceMatchId = matchContent.SelectToken("$.id").ToString();
                if (string.IsNullOrEmpty(sourceMatchId))
                {
                    Logger.Warning("Source match id is null");
                    continue;
                }

                var matchName       = matchContent.SelectToken("$.name").ToString();
                var competitionName = matchContent.SelectToken("$.competition.name").ToString();

                if (!matchName.Contains(" V ") || !competitionName.Contains("NBA"))
                {
                    continue;
                }

                var homeTeam = ScrapeHelper.RegexMappingExpression(matchName, "(.*) V");
                var awayTeam = ScrapeHelper.RegexMappingExpression(matchName, "V (.*)");

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);

                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceMatchId;
                foundMatches.Add(match);
            }
            Logger.Information("Scrape match data complete");
            await UpdateScrapeStatus(20, "Scrape match data complete");

            Logger.Information("Scraping metric data");
            await UpdateScrapeStatus(20, "Scraping metric data");

            foreach (var match in foundMatches)
            {
                var metricUrl = $"https://api.neds.com.au/v2/sport/event-card?id={match.SourceId}";
                doc = await ScrapeHelper.GetDocument(new Uri(metricUrl));

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);

                var entrants = jDoc.SelectToken("$.entrants").ToList();
                var prices   = jDoc.SelectToken("$.prices").ToList();
                ProcessMetric(match, entrants, prices, ScoreType.Point, "Points");
                ProcessMetric(match, entrants, prices, ScoreType.Rebound, "Rebounds");
                ProcessMetric(match, entrants, prices, ScoreType.Assist, "Assists");
                ProcessMetric(match, entrants, prices, ScoreType.PointReboundAssist, "PRA");
                ProcessMetric(match, entrants, prices, ScoreType.PointRebound, "PR");
                ProcessMetric(match, entrants, prices, ScoreType.PointAssist, "PA");
                ProcessMetric(match, entrants, prices, ScoreType.ReboundAssist, "RA");

                var newProgress = GetScrapingInformation().Progress;
                newProgress = Math.Min(newProgress + 90 / foundMatches.Count, 90);
                await UpdateScrapeStatus(newProgress, null);
            }
            Logger.Information("Scrape metric data complete");
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
Example #33
0
 public virtual void Crawl()
 {
     DataId = DataId;
     using (var s = new ScrapeHelper(HotItemController.Config.SessionKey))
     {
         String uri = HotItemController.CurrentApi.UriListingItem(DataId); //new UriHelper().UseListingApi().AddId(DataId.ToString()).Generate();
         s.Finished -= new EventHandler<DataProvider.Event.ScrapeFinishedEventArgs>(s_Finished);
         s.Finished += new EventHandler<DataProvider.Event.ScrapeFinishedEventArgs>(s_Finished);
         s.CrawlString(uri, DataId, DataId, HotItemController.CurrentApi);
     }
 }
Example #34
0
        protected override async Task ScrapeData()
        {
            const string url = "https://ubet.com/api/sportsViewData/mainevents/false/6698";
            var          doc = await ScrapeHelper.GetDocument(url);

            var jDoc = JsonConvert.DeserializeObject <JToken>(doc);

            var rawMatches   = jDoc.SelectTokens("$.[*]");
            var foundMatches = new List <Match>();

            await UpdateScrapeStatus(10, "Scraping match data");

            Logger.Information("Scraping match data");
            foreach (var rawMatch in rawMatches)
            {
                var sourceMatchId = rawMatch.SelectToken("$.MainEventId").ToString();
                if (string.IsNullOrEmpty(sourceMatchId))
                {
                    Logger.Warning("Source Id is null");
                    continue;
                }

                var mainEventName = rawMatch.SelectToken("$.MainEventName").ToString();
                var date          = Helper.GetCurrentDate("dd/M");
                var teams         = mainEventName
                                    .Split(new[] { date }, StringSplitOptions.None)[0]
                                    .Split(new[] { " v " }, StringSplitOptions.None);

                var homeTeam = teams[0];
                var awayTeam = teams[1];

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceMatchId;
                foundMatches.Add(match);
            }
            Logger.Information("Scrape match data complete");
            await UpdateScrapeStatus(20, "Scrape match data complete");

            await UpdateScrapeStatus(20, "Scraping metric data");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            Logger.Information("Scraping metric data");
            var betTypes = new HashSet <string>();

            foreach (var match in foundMatches)
            {
                var metricUrl = $"https://ubet.com/api/sportsViewData/markets/false/{match.SourceId}";
                doc = await ScrapeHelper.GetDocument(metricUrl);

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);
                var rawMetrics = jDoc
                                 .SelectTokens("$.All[?(@.GroupId == -1)].SubEvents[?(@.LongDisplayName =~ /(.* (Ttl|Total).*)/)]")
                                 .ToList();

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                foreach (var rawMetric in rawMetrics)
                {
                    var betTypeShortName = rawMetric.SelectToken("$.BetTypeShortName").ToString();
                    var scoreType        =
                        betTypeShortName.Contains("Total Points Scored") ? ScoreType.Point :
                        betTypeShortName.Contains("Total Pts+Rebound+Assist") ? ScoreType.PointReboundAssist :
                        string.Empty;

                    betTypes.Add(betTypeShortName);

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }
                    var longDisplayName = rawMetric.SelectToken("$.LongDisplayName").ToString();
                    var playerName      = ScrapeHelper.RegexMappingExpression(longDisplayName, @"(.*)(?:Ttl|Total)");
                    var player          = ScrapeHelper.FindPlayerInMatch(playerName, match);
                    if (player == null)
                    {
                        Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                        continue;
                    }

                    double?over = 0, overLine = 0, under = 0, underLine = 0;
                    var    offers = rawMetric.SelectTokens(@"$.Offers[?(@.OfferName =~ /(.* Over|Under|OV|UN .*)/)]");
                    foreach (var offer in offers)
                    {
                        var offerName = offer.SelectToken("$.OfferName").ToString();
                        if (offerName.Contains("Over") || offerName.Contains("OV"))
                        {
                            over     = ScrapeHelper.ConvertMetric(offer.SelectToken("$.WinReturn").ToString());
                            overLine = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(offerName, @".* (\d*.\d)"));
                        }
                        else if (offerName.Contains("Under") || offerName.Contains("UN"))
                        {
                            under     = ScrapeHelper.ConvertMetric(offer.SelectToken("$.WinReturn").ToString());
                            underLine = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(offerName, @".* (\d*.\d)"));
                        }
                    }

                    Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                    var metric = new PlayerOverUnder
                    {
                        MatchId               = match.Id,
                        Over                  = over,
                        OverLine              = overLine,
                        Under                 = under,
                        UnderLine             = underLine,
                        PlayerId              = player.Id,
                        ScoreType             = scoreType,
                        ScrapingInformationId = GetScrapingInformation().Id,
                        CreatedAt             = DateTime.Now
                    };

                    PlayerUnderOvers.Add(metric);

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            Logger.Information($"Unique scoreTypes: {JsonConvert.SerializeObject(betTypes)}"); // notify to update
            Logger.Information("Scrape metric data complete");
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }
Example #35
0
        protected override async Task ScrapeData()
        {
            const string url = "https://api.beta.tab.com.au/v1/tab-info-service/sports/Basketball/competitions/NBA/matches?jurisdiction=VIC";
            var          doc = await ScrapeHelper.GetDocument(url);

            var jDoc       = JsonConvert.DeserializeObject <JToken>(doc);
            var rawMatches = jDoc.SelectTokens("$.matches[*]");

            await UpdateScrapeStatus(10, "Scraping match data");

            Logger.Information("Scraping match data");
            var foundMatches = new List <Match>();

            foreach (var rawMatch in rawMatches)
            {
                var sourceId = rawMatch.SelectToken("$._links.self").ToString();
                if (string.IsNullOrEmpty(sourceId))
                {
                    Logger.Warning("Source match id is null");
                    continue;
                }

                var matchName = rawMatch.SelectToken("$.name").ToString();

                var homeTeam = ScrapeHelper.RegexMappingExpression(matchName, "(.*) v .*");
                var awayTeam = ScrapeHelper.RegexMappingExpression(matchName, ".* v (.*)");

                var match = ScrapeHelper.FindMatchByHomeAndAwayTeam(TodayMatches, homeTeam, awayTeam);
                if (match == null)
                {
                    Logger.Warning($"Cannot find match with Home team: {homeTeam} and Away team: {awayTeam}");
                    continue;
                }

                match.SourceId = sourceId;
                foundMatches.Add(match);
            }
            await UpdateScrapeStatus(20, "Scrape match data complete");

            await UpdateScrapeStatus(20, "Scraping metric data");

            var rangeProgress = foundMatches.Count != 0 ? 90 / foundMatches.Count : 0;
            var currentRange  = 20;

            Logger.Information("Scrape metric data");
            foreach (var match in foundMatches)
            {
                doc = await ScrapeHelper.GetDocument($"{match.SourceId}");

                jDoc = JsonConvert.DeserializeObject <JToken>(doc);
                var rawMetrics = jDoc.SelectTokens("$.markets[?(@.betOptionSpectrumId =~ /(837|838|839|1789|1791)/)]").ToList();

                currentRange = Math.Min(currentRange + rangeProgress, 90);

                foreach (var rawMetric in rawMetrics)
                {
                    var spectrumId = rawMetric.SelectToken("$.betOptionSpectrumId").ToString();
                    var scoreType  = spectrumId == "837" ? ScoreType.Point :
                                     spectrumId == "838" ? ScoreType.Rebound :
                                     spectrumId == "839" ? ScoreType.Assist :
                                     spectrumId == "1789" ? ScoreType.PointReboundAssist :
                                     spectrumId == "1791" ? ScoreType.ThreePoint :
                                     string.Empty;

                    if (string.IsNullOrEmpty(scoreType))
                    {
                        continue;
                    }

                    var playerOvers  = rawMetric.SelectTokens("$.propositions[?(@.name =~ /(.* Over .*)/)]").ToList();
                    var playerUnders = rawMetric.SelectTokens("$.propositions[?(@.name =~ /(.* Under .*)/)]").ToList();

                    var playerNames = new HashSet <string>();
                    foreach (var playerName in playerOvers.Select(item => item.SelectToken("name").ToString()).Select(itemName => ScrapeHelper.RegexMappingExpression(itemName, "(.*)(?:Over|Under)")))
                    {
                        playerNames.Add(playerName);
                    }

                    foreach (var playerName in playerUnders.Select(item => item.SelectToken("name").ToString()).Select(itemName => ScrapeHelper.RegexMappingExpression(itemName, "(.*)(?:Over|Under)")))
                    {
                        playerNames.Add(playerName);
                    }

                    foreach (var playerName in playerNames)
                    {
                        var player = ScrapeHelper.FindPlayerInMatch(playerName, match);
                        if (player == null)
                        {
                            Logger.Warning($"Cannot find any player {playerName} in match {match.Id}");
                            continue;
                        }
                        var overOutcomeItem = playerOvers.FirstOrDefault(x => x.SelectToken("$.name").ToString().Contains(playerName));
                        var overName        = overOutcomeItem?.SelectToken("name").ToString() ?? string.Empty;
                        var overLine        = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(overName, @".* (\d*.\d*) .*"));
                        var over            = ScrapeHelper.ConvertMetric(overOutcomeItem?.SelectToken("returnWin").ToString() ?? string.Empty);

                        var underOutcomeItem = playerUnders.FirstOrDefault(x => x.SelectToken("$.name").ToString().Contains(playerName));
                        var underName        = underOutcomeItem?.SelectToken("name").ToString() ?? string.Empty;
                        var underLine        = ScrapeHelper.ConvertMetric(ScrapeHelper.RegexMappingExpression(underName, @".* (\d*.\d*) .*"));
                        var under            = ScrapeHelper.ConvertMetric(underOutcomeItem?.SelectToken("returnWin").ToString() ?? string.Empty);

                        Logger.Information($"{player.Name}: {scoreType} - {over} {overLine} | {under} {underLine}");

                        var metric = new PlayerOverUnder
                        {
                            MatchId               = match.Id,
                            Over                  = over,
                            OverLine              = overLine,
                            Under                 = under,
                            UnderLine             = underLine,
                            PlayerId              = player.Id,
                            ScoreType             = scoreType,
                            ScrapingInformationId = GetScrapingInformation().Id,
                            CreatedAt             = DateTime.Now
                        };

                        PlayerUnderOvers.Add(metric);
                    }

                    var newProgress = GetScrapingInformation().Progress;
                    newProgress = Math.Min(newProgress + currentRange / rawMetrics.Count, currentRange);
                    await UpdateScrapeStatus(newProgress, null);
                }
                await UpdateScrapeStatus(currentRange, null);
            }
            Logger.Information("Scrape metric data complete");
            await UpdateScrapeStatus(90, "Scrape metric data complete");
        }