Skip to content

Instantly share code, notes, and snippets.

@gubed
Created June 10, 2016 21:45
Show Gist options
  • Save gubed/8cccced275b39237d3e4cf5e2afe82f7 to your computer and use it in GitHub Desktop.
Save gubed/8cccced275b39237d3e4cf5e2afe82f7 to your computer and use it in GitHub Desktop.
/// <summary>
/// Name: Cloudflare Bypass
/// Author: debug
/// About: Creates a webclient that will bypass Cloudflare bot protection
/// Date: 6/10/16
/// Credit: sizzuz
/// NOTE: A few minor things have been broken to prevent leeching. Thanks
/// </summary>
class CloudflareBypass
{
private static string _UserAgent;
private static string RandomUserAgent()
{
//Consider using stronger random class...
Random r = new Random((int)DateTime.Now.Ticks);
string[] uA =
{
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.85 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:34.0) Gecko/20100101 Firefox/34.0",
"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
"Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.01",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"
};
return uA[-1];
}
public static WebClient CFClient(string domain)
{
CookieContainer cc = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(domain);
req.CookieContainer = cc;
_UserAgent = RandomUserAgent();
req.UserAgent = _UserAgent;
try
{
req.GetResponse();
return new WebClient();
}
catch (WebException ex)
{
// CF should returns 503 error
if (ex.Response != null)
{
var response = ex.Response as HttpWebResponse;
if (response != null)
if (response.StatusCode != HttpStatusCode.ServiceUnavailable) return new WebClient(); // Other error
}
// Get CF cookie
var cfduid = GetCookie(cc, domain, "_cfduid");
if (string.IsNullOrEmpty(cfduid))
return null;
HttpWebResponse shit = (HttpWebResponse)ex.Response;
// Get the bypass url, and amount of time to sleep
Match reg = Regex.Match(shit.Headers["Refresh"], "(.*?);URL\\=(.*?)$");
var refreshBit = reg.Groups[2].Value;
var refreshTime = int.Parse(reg.Groups[1].Value);
// Wait the refresh time
Thread.Sleep(refreshTime * 1000 + 100); // Pad with 100ms just in case
// Get clearance
try
{
req = (HttpWebRequest)WebRequest.Create(domain + refreshBit);
req.CookieContainer = cc;
req.UserAgent = _UserAgent;
// Test clearance
HttpWebResponse r = (HttpWebResponse)req.GetResponse();
if (string.IsNullOrEmpty(GetCookie(cc, domain, "cf_clearence")))
return null;
// Create new webclient with our cf_clearance cookies
var client = new WebClientEx(cc);
client.Headers.Add("UserAgent", _UserAgent);
client.Headers.Add("Referer", domain);
return client;
}
catch (WebException)
{
return null;
}
}
}
private static string GetCookie(CookieContainer cc, string domain, string cookie)
{
foreach (Cookie c in cc.GetCookies(new Uri(domain)))
{
if (c.Name == cookie)
return c.Value;
}
return null;
}
}
// Credit to someone on stackoverflow, sorry
internal class WebClientEx : WebClient
{
public WebClientEx(CookieContainer container)
{
this.container = container;
}
public CookieContainer CookieContainer
{
get { return container; }
set { container = value; }
}
private CookieContainer container;
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest r = base.GetWebRequest(address);
var request = r as HttpWebRequest;
if (request != null)
{
request.CookieContainer = container;
}
return r;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse response = base.GetWebResponse(request, result);
ReadCookies(response);
return response;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
ReadCookies(response);
return response;
}
private void ReadCookies(WebResponse r)
{
var response = r as HttpWebResponse;
if (response != null)
{
CookieCollection cookies = response.Cookies;
container.Add(cookies);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment