From ebe05267b2c69ad1b4138a9ed11c58d6148e04d2 Mon Sep 17 00:00:00 2001 From: Diego Heras Date: Sun, 13 Dec 2020 21:42:10 +0100 Subject: [PATCH] core: FlareSolverr integration. Bypass Cloudflare protection (#9028) --- src/Jackett.Common/Content/custom.js | 3 +++ src/Jackett.Common/Content/index.html | 6 +++++- src/Jackett.Common/Jackett.Common.csproj | 2 +- src/Jackett.Common/Models/Config/ServerConfig.cs | 1 + src/Jackett.Common/Models/DTO/ServerConfig.cs | 3 +++ src/Jackett.Common/Services/CacheService.cs | 5 +++-- src/Jackett.Common/Utils/BrowserUtil.cs | 4 ++-- src/Jackett.Common/Utils/Clients/HttpWebClient.cs | 7 ++++--- src/Jackett.Common/Utils/Clients/HttpWebClient2.cs | 7 ++++--- .../Controllers/ServerConfigurationController.cs | 7 +++++++ src/Jackett.Server/Services/ServerService.cs | 2 ++ 11 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/Jackett.Common/Content/custom.js b/src/Jackett.Common/Content/custom.js index f663ffed3..3238db74f 100644 --- a/src/Jackett.Common/Content/custom.js +++ b/src/Jackett.Common/Content/custom.js @@ -106,6 +106,7 @@ function loadJackettSettings() { $("#jackett-show-releases").attr("disabled", true); } + $("#jackett-flaresolverrurl").val(data.flaresolverrurl); $("#jackett-omdbkey").val(data.omdbkey); $("#jackett-omdburl").val(data.omdburl); var password = data.password; @@ -1137,6 +1138,7 @@ function bindUIButtons() { var jackett_cache_enabled = $("#jackett-cache-enabled").is(':checked'); var jackett_cache_ttl = $("#jackett-cache-ttl").val(); var jackett_cache_max_results_per_indexer = $("#jackett-cache-max-results-per-indexer").val(); + var jackett_flaresolverr_url = $("#jackett-flaresolverrurl").val(); var jackett_omdb_key = $("#jackett-omdbkey").val(); var jackett_omdb_url = $("#jackett-omdburl").val(); @@ -1158,6 +1160,7 @@ function bindUIButtons() { cache_enabled: jackett_cache_enabled, cache_ttl: jackett_cache_ttl, cache_max_results_per_indexer: jackett_cache_max_results_per_indexer, + flaresolverrurl: jackett_flaresolverr_url, omdbkey: jackett_omdb_key, omdburl: jackett_omdb_url, proxy_type: jackett_proxy_type, diff --git a/src/Jackett.Common/Content/index.html b/src/Jackett.Common/Content/index.html index cb1c89c1b..72baf17ef 100644 --- a/src/Jackett.Common/Content/index.html +++ b/src/Jackett.Common/Content/index.html @@ -200,6 +200,10 @@ Cache max results per indexer: +
+ FlareSolverr API URL: + +
OMDB API key: @@ -692,6 +696,6 @@ - + diff --git a/src/Jackett.Common/Jackett.Common.csproj b/src/Jackett.Common/Jackett.Common.csproj index 82b26ad1f..be121c3b9 100644 --- a/src/Jackett.Common/Jackett.Common.csproj +++ b/src/Jackett.Common/Jackett.Common.csproj @@ -14,7 +14,7 @@ - + diff --git a/src/Jackett.Common/Models/Config/ServerConfig.cs b/src/Jackett.Common/Models/Config/ServerConfig.cs index 11c3bebd7..df137f1eb 100644 --- a/src/Jackett.Common/Models/Config/ServerConfig.cs +++ b/src/Jackett.Common/Models/Config/ServerConfig.cs @@ -42,6 +42,7 @@ namespace Jackett.Common.Models.Config public bool CacheEnabled { get; set; } public long CacheTtl { get; set; } public long CacheMaxResultsPerIndexer { get; set; } + public string FlareSolverrUrl { get; set; } public string OmdbApiKey { get; set; } public string OmdbApiUrl { get; set; } diff --git a/src/Jackett.Common/Models/DTO/ServerConfig.cs b/src/Jackett.Common/Models/DTO/ServerConfig.cs index 2e935a259..67fc57e66 100644 --- a/src/Jackett.Common/Models/DTO/ServerConfig.cs +++ b/src/Jackett.Common/Models/DTO/ServerConfig.cs @@ -34,6 +34,8 @@ namespace Jackett.Common.Models.DTO [DataMember] public long cache_max_results_per_indexer { get; set; } [DataMember] + public string flaresolverrurl { get; set; } + [DataMember] public string omdbkey { get; set; } [DataMember] public string omdburl { get; set; } @@ -70,6 +72,7 @@ namespace Jackett.Common.Models.DTO cache_enabled = config.CacheEnabled; cache_ttl = config.CacheTtl; cache_max_results_per_indexer = config.CacheMaxResultsPerIndexer; + flaresolverrurl = config.FlareSolverrUrl; omdbkey = config.OmdbApiKey; omdburl = config.OmdbApiUrl; app_version = version; diff --git a/src/Jackett.Common/Services/CacheService.cs b/src/Jackett.Common/Services/CacheService.cs index 1a7126b06..8ef77978a 100644 --- a/src/Jackett.Common/Services/CacheService.cs +++ b/src/Jackett.Common/Services/CacheService.cs @@ -8,7 +8,6 @@ using Jackett.Common.Indexers; using Jackett.Common.Models; using Jackett.Common.Models.Config; using Jackett.Common.Services.Interfaces; -using Jint.Parser; using NLog; namespace Jackett.Common.Services @@ -218,7 +217,9 @@ namespace Jackett.Common.Services var total = resultsPerQuery.Select(q => q.Item2).Sum(); if (total <= _serverConfig.CacheMaxResultsPerIndexer) break; - trackerCache.Queries.Remove(resultsPerQuery.Pop().Item1); // remove the older + var olderQuery = resultsPerQuery.Last(); + trackerCache.Queries.Remove(olderQuery.Item1); // remove the older + resultsPerQuery.Remove(olderQuery); prunedCounter++; } diff --git a/src/Jackett.Common/Utils/BrowserUtil.cs b/src/Jackett.Common/Utils/BrowserUtil.cs index d6008981f..9ce1026d0 100644 --- a/src/Jackett.Common/Utils/BrowserUtil.cs +++ b/src/Jackett.Common/Utils/BrowserUtil.cs @@ -7,8 +7,8 @@ namespace Jackett.Common.Utils // When updating these make sure they are not detected by the incapsula bot detection engine // (e.g. kickasstorrent indexer) public static string ChromeUserAgent => Environment.OSVersion.Platform == PlatformID.Unix ? - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" : - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"; + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" : + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"; } } diff --git a/src/Jackett.Common/Utils/Clients/HttpWebClient.cs b/src/Jackett.Common/Utils/Clients/HttpWebClient.cs index c075215f8..cc962101b 100644 --- a/src/Jackett.Common/Utils/Clients/HttpWebClient.cs +++ b/src/Jackett.Common/Utils/Clients/HttpWebClient.cs @@ -8,7 +8,7 @@ using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; -using CloudflareSolverRe; +using FlareSolverrSharp; using Jackett.Common.Helpers; using Jackett.Common.Models.Config; using Jackett.Common.Services.Interfaces; @@ -77,9 +77,10 @@ namespace Jackett.Common.Utils.Clients var userAgent = webRequest.EmulateBrowser.Value ? BrowserUtil.ChromeUserAgent : "Jackett/" + configService.GetVersion(); - using (var clearanceHandlr = new ClearanceHandler(userAgent)) + using (var clearanceHandlr = new ClearanceHandler(serverConfig.FlareSolverrUrl)) { - clearanceHandlr.MaxTries = 10; + clearanceHandlr.UserAgent = userAgent; + clearanceHandlr.MaxTimeout = 50000; using (var clientHandlr = new HttpClientHandler { CookieContainer = cookies, diff --git a/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs b/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs index d9a620f73..5bf8d5655 100644 --- a/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs +++ b/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs @@ -8,7 +8,7 @@ using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; -using CloudflareSolverRe; +using FlareSolverrSharp; using Jackett.Common.Helpers; using Jackett.Common.Models.Config; using Jackett.Common.Services.Interfaces; @@ -54,9 +54,10 @@ namespace Jackett.Common.Utils.Clients public void CreateClient() { - clearanceHandlr = new ClearanceHandler(BrowserUtil.ChromeUserAgent) + clearanceHandlr = new ClearanceHandler(serverConfig.FlareSolverrUrl) { - MaxTries = 10 + UserAgent = BrowserUtil.ChromeUserAgent, + MaxTimeout = 50000 }; clientHandlr = new HttpClientHandler { diff --git a/src/Jackett.Server/Controllers/ServerConfigurationController.cs b/src/Jackett.Server/Controllers/ServerConfigurationController.cs index 136ab0ef8..dab9545bf 100644 --- a/src/Jackett.Server/Controllers/ServerConfigurationController.cs +++ b/src/Jackett.Server/Controllers/ServerConfigurationController.cs @@ -113,6 +113,13 @@ namespace Jackett.Server.Controllers serverConfig.RuntimeSettings.BasePath = serverService.BasePath(); configService.SaveConfig(serverConfig); + if (config.flaresolverrurl != serverConfig.FlareSolverrUrl) + { + serverConfig.FlareSolverrUrl = config.flaresolverrurl; + configService.SaveConfig(serverConfig); + webHostRestartNeeded = true; + } + if (omdbApiKey != serverConfig.OmdbApiKey || omdbApiUrl != serverConfig.OmdbApiUrl) { serverConfig.OmdbApiKey = omdbApiKey; diff --git a/src/Jackett.Server/Services/ServerService.cs b/src/Jackett.Server/Services/ServerService.cs index 6a5f714ee..0512c97d6 100644 --- a/src/Jackett.Server/Services/ServerService.cs +++ b/src/Jackett.Server/Services/ServerService.cs @@ -139,6 +139,8 @@ namespace Jackett.Server.Services logger.Info($"Using proxy: {config.ProxyType}"); + logger.Info("Using FlareSolverr: " + (string.IsNullOrEmpty(config.FlareSolverrUrl) ? "No" : config.FlareSolverrUrl)); + var monotype = Type.GetType("Mono.Runtime"); if (monotype != null && !DotNetCoreUtil.IsRunningOnDotNetCore) {