diff --git a/KfChatDotNetBot/Services/BotServices.cs b/KfChatDotNetBot/Services/BotServices.cs index 99f709a..f264610 100644 --- a/KfChatDotNetBot/Services/BotServices.cs +++ b/KfChatDotNetBot/Services/BotServices.cs @@ -128,6 +128,7 @@ public class BotServices var settings = await SettingsProvider.GetMultipleValuesAsync([BuiltIn.Keys.Proxy, BuiltIn.Keys.RainbetEnabled]); _rainbet = new RainbetWs(settings[BuiltIn.Keys.Proxy].Value, _cancellationToken); _rainbet.OnRainbetBet += OnRainbetBet; + await _rainbet.RefreshCookies(); await _rainbet.StartWsClient(); _logger.Info("Built Rainbet Websocket"); } diff --git a/KfChatDotNetBot/Services/RainbetWs.cs b/KfChatDotNetBot/Services/RainbetWs.cs index 914b771..452b312 100644 --- a/KfChatDotNetBot/Services/RainbetWs.cs +++ b/KfChatDotNetBot/Services/RainbetWs.cs @@ -1,7 +1,9 @@ using System.Net; using System.Net.WebSockets; using System.Text.Json; +using FlareSolverrSharp; using KfChatDotNetBot.Models; +using KfChatDotNetBot.Settings; using NLog; using Websocket.Client; @@ -19,6 +21,8 @@ public class RainbetWs : IDisposable public event OnRainbetBetEventHandler OnRainbetBet; public event OnWsDisconnectionEventHandler OnWsDisconnection; private CancellationToken _cancellationToken = CancellationToken.None; + private IEnumerable? _cookies = null; + private string? _userAgent = null; public RainbetWs(string? proxy = null, CancellationToken? cancellationToken = null) { @@ -39,7 +43,8 @@ public class RainbetWs : IDisposable { var clientWs = new ClientWebSocket(); clientWs.Options.SetRequestHeader("Origin", "https://rainbet.com"); - clientWs.Options.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0"); + clientWs.Options.SetRequestHeader("User-Agent", _userAgent); + clientWs.Options.SetRequestHeader("Cookie", string.Join("; ", _cookies!)); if (_proxy == null) return clientWs; _logger.Debug($"Using proxy address {_proxy}"); clientWs.Options.Proxy = new WebProxy(_proxy); @@ -138,6 +143,32 @@ public class RainbetWs : IDisposable _logger.Error("--- End of Payload ---"); } } + + public async Task RefreshCookies() + { + _logger.Info("Refreshing cookies for Rainbet"); + var settings = + await SettingsProvider.GetMultipleValuesAsync([BuiltIn.Keys.FlareSolverrApiUrl, BuiltIn.Keys.FlareSolverrProxy]); + var flareSolverrUrl = settings[BuiltIn.Keys.FlareSolverrApiUrl]; + var flareSolverrProxy = settings[BuiltIn.Keys.FlareSolverrProxy]; + var handler = new ClearanceHandler(flareSolverrUrl.Value) + { + // Generally takes <5 seconds + MaxTimeout = 30000, + }; + _logger.Debug($"Configured clearance handler to use FlareSolverr endpoint: {flareSolverrUrl.Value}"); + // I would suggest not using a proxy. It's pretty much a miracle this works at all. + if (flareSolverrProxy.Value != null) + { + handler.ProxyUrl = flareSolverrProxy.Value; + _logger.Debug($"Configured clearance handler to use {flareSolverrProxy.Value} for proxying the request"); + } + var client = new HttpClient(handler); + // You get CF checkbox'd if you go directly to sportsbook.rainbet.com but works ok for root + var getResponse = await client.GetAsync("https://rainbet.com/", _cancellationToken); + _cookies = getResponse.Headers.GetValues("Set-Cookie"); + _userAgent = getResponse.RequestMessage!.Headers.UserAgent.ToString(); + } public void Dispose() {