using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; namespace CRD.Utils; public class ChallengeDetector{ private static readonly HashSet CloudflareServerNames = new HashSet{ "cloudflare", "cloudflare-nginx", "ddos-guard" }; /// /// Checks if clearance is required. /// /// The HttpResponseMessage to check. /// True if the site requires clearance public static bool IsClearanceRequired(HttpResponseMessage response) => IsCloudflareProtected(response); /// /// Checks if the site is protected by Cloudflare /// /// The HttpResponseMessage to check. /// True if the site is protected private static bool IsCloudflareProtected(HttpResponseMessage response){ // check response headers if (!response.Headers.Server.Any(i => i.Product != null && CloudflareServerNames.Contains(i.Product.Name.ToLower()))) return false; // detect CloudFlare and DDoS-GUARD if (response.StatusCode.Equals(HttpStatusCode.ServiceUnavailable) || response.StatusCode.Equals(HttpStatusCode.Forbidden)){ var responseHtml = response.Content.ReadAsStringAsync().Result; if (responseHtml.Contains("Just a moment...") || // Cloudflare responseHtml.Contains("Access denied") || // Cloudflare Blocked responseHtml.Contains("Attention Required! | Cloudflare") || // Cloudflare Blocked responseHtml.Trim().Equals("error code: 1020") || // Cloudflare Blocked responseHtml.IndexOf("DDOS-GUARD", StringComparison.OrdinalIgnoreCase) > -1) // DDOS-GUARD return true; } // detect Custom CloudFlare for EbookParadijs, Film-Paleis, MuziekFabriek and Puur-Hollands if (response.Headers.Vary.ToString() == "Accept-Encoding,User-Agent" && response.Content.Headers.ContentEncoding.ToString() == "" && response.Content.ReadAsStringAsync().Result.ToLower().Contains("ddos")) return true; return false; } }