Created
June 10, 2016 21:45
-
-
Save gubed/8cccced275b39237d3e4cf5e2afe82f7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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