Last active
June 10, 2016 21:46
-
-
Save gubed/6dccfa408b8ce85fe279f4aa85fd6952 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 Shared _UserAgent As String | |
Private Shared Function RandomUserAgent() As String | |
'Consider using stronger random class... | |
Dim r As New Random(CInt(DateTime.Now.Ticks)) | |
Dim uA As String() = {"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) | |
End Function | |
Public Shared Function CFClient(domain As String) As WebClient | |
Dim cc As New CookieContainer() | |
Dim req As HttpWebRequest = DirectCast(WebRequest.Create(domain), HttpWebRequest) | |
req.CookieContainer = cc | |
_UserAgent = RandomUserAgent() | |
req.UserAgent = _UserAgent | |
Try | |
req.GetResponse() | |
Return New WebClient() | |
Catch ex As WebException | |
' CF should returns 503 error | |
If ex.Response IsNot Nothing Then | |
Dim response = TryCast(ex.Response, HttpWebResponse) | |
If response IsNot Nothing Then | |
If response.StatusCode <> HttpStatusCode.ServiceUnavailable Then | |
Return New WebClient() | |
End If | |
' Other error | |
End If | |
End If | |
' Get CF cookie | |
Dim cfduid = GetCookie(cc, domain, "_cfduid") | |
If String.IsNullOrEmpty(cfduid) Then | |
Return Nothing | |
End If | |
Dim shit As HttpWebResponse = DirectCast(ex.Response, HttpWebResponse) | |
' Get the bypass url, and amount of time to sleep | |
Dim reg As Match = Regex.Match(shit.Headers("Refresh"), "(.*?);URL\=(.*?)$") | |
Dim refreshBit = reg.Groups(2).Value | |
Dim refreshTime = Integer.Parse(reg.Groups(1).Value) | |
' Wait the refresh time | |
Thread.Sleep(refreshTime * 1000 + 100) | |
' Pad with 100ms just in case | |
' Get clearance | |
Try | |
req = DirectCast(WebRequest.Create(domain & Convert.ToString(refreshBit)), HttpWebRequest) | |
req.CookieContainer = cc | |
req.UserAgent = _UserAgent | |
' Test clearance | |
Dim r As HttpWebResponse = DirectCast(req.GetResponse(), HttpWebResponse) | |
If String.IsNullOrEmpty(GetCookie(cc, domain, "cf_clearence")) Then | |
Return Nothing | |
End If | |
' Create new webclient with our cf_clearance cookies | |
Dim client = New WebClientEx(cc) | |
client.Headers.Add("UserAgent", _UserAgent) | |
client.Headers.Add("Referer", domain) | |
Return client | |
Catch generatedExceptionName As WebException | |
Return Nothing | |
End Try | |
End Try | |
End Function | |
Private Shared Function GetCookie(cc As CookieContainer, domain As String, cookie As String) As String | |
For Each c As Cookie In cc.GetCookies(New Uri(domain)) | |
If c.Name = cookie Then | |
Return c.Value | |
End If | |
Next | |
Return Nothing | |
End Function | |
End Class | |
' Credit to someone on stackoverflow, sorry | |
Friend Class WebClientEx | |
Inherits WebClient | |
Public Sub New(container As CookieContainer) | |
Me.container = container | |
End Sub | |
Public Property CookieContainer() As CookieContainer | |
Get | |
Return container | |
End Get | |
Set | |
container = value | |
End Set | |
End Property | |
Private container As CookieContainer | |
Protected Overrides Function GetWebRequest(address As Uri) As WebRequest | |
Dim r As WebRequest = MyBase.GetWebRequest(address) | |
Dim request = TryCast(r, HttpWebRequest) | |
If request IsNot Nothing Then | |
request.CookieContainer = container | |
End If | |
Return r | |
End Function | |
Protected Overrides Function GetWebResponse(request As WebRequest, result As IAsyncResult) As WebResponse | |
Dim response As WebResponse = MyBase.GetWebResponse(request, result) | |
ReadCookies(response) | |
Return response | |
End Function | |
Protected Overrides Function GetWebResponse(request As WebRequest) As WebResponse | |
Dim response As WebResponse = MyBase.GetWebResponse(request) | |
ReadCookies(response) | |
Return response | |
End Function | |
Private Sub ReadCookies(r As WebResponse) | |
Dim response = TryCast(r, HttpWebResponse) | |
If response IsNot Nothing Then | |
Dim cookies As CookieCollection = response.Cookies | |
container.Add(cookies) | |
End If | |
End Sub | |
End Class |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment