Switched to CloudflareSolver, dropped Leaf.xNet.

This commit is contained in:
ruri
2019-04-29 18:57:42 +02:00
parent b9d4eb2366
commit e1523dbdb2
3 changed files with 99 additions and 54 deletions
+87 -50
View File
@@ -5,10 +5,10 @@ using System.Text.RegularExpressions;
using System.Windows.Media;
using System.Threading;
using Jint;
using Leaf.xNet;
using System.Net;
using Leaf.xNet.Services.Cloudflare;
using Leaf.xNet.Services.Captcha;
using Cloudflare;
using Cloudflare.CaptchaProviders;
using System.Net.Http;
namespace RuriLib
{
@@ -86,62 +86,93 @@ namespace RuriLib
var timeout = data.GlobalSettings.General.RequestTimeout * 1000;
var request = new HttpRequest();
request.IgnoreProtocolErrors = true;
request.ConnectTimeout = timeout;
request.ReadWriteTimeout = timeout;
request.Cookies = new CookieStorage();
// We initialize the solver basing on the captcha service available
CloudflareSolver cf = null;
switch (data.GlobalSettings.Captchas.CurrentService)
{
case BlockCaptcha.CaptchaService.AntiCaptcha:
cf = new CloudflareSolver(new AntiCaptchaProvider(data.GlobalSettings.Captchas.AntiCapToken));
break;
case BlockCaptcha.CaptchaService.TwoCaptcha:
cf = new CloudflareSolver(new TwoCaptchaProvider(data.GlobalSettings.Captchas.TwoCapToken));
break;
default:
cf = new CloudflareSolver();
break;
}
// Initialize the handler with the Proxy and the previous cookies
HttpClientHandler handler = null;
CookieContainer cookies = new CookieContainer();
foreach (var cookie in data.Cookies)
request.Cookies.Add(new Cookie(cookie.Key, cookie.Value));
cookies.Add(new Cookie(cookie.Key, cookie.Value));
if (data.UseProxies)
{
switch (data.Proxy.Type)
var client = data.Proxy.GetClient();
handler = new HttpClientHandler()
{
case Extreme.Net.ProxyType.Http:
request.Proxy = HttpProxyClient.Parse(data.Proxy.Proxy);
break;
Proxy = (IWebProxy)client,
CookieContainer = cookies,
AllowAutoRedirect = true,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
}
else
{
handler = new HttpClientHandler()
{
CookieContainer = cookies,
AllowAutoRedirect = true,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
}
// Initialize the HttpClient with the given handler, timeout, user-agent
var httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromMinutes(timeout);
httpClient.DefaultRequestHeaders.Add("User-Agent", ReplaceValues(userAgent, data));
case Extreme.Net.ProxyType.Socks4:
request.Proxy = Socks4ProxyClient.Parse(data.Proxy.Proxy);
break;
var uri = new Uri(localUrl);
case Extreme.Net.ProxyType.Socks4a:
request.Proxy = Socks4AProxyClient.Parse(data.Proxy.Proxy);
break;
case Extreme.Net.ProxyType.Socks5:
request.Proxy = Socks5ProxyClient.Parse(data.Proxy.Proxy);
break;
case Extreme.Net.ProxyType.Chain:
throw new Exception("The Chain Proxy Type is not supported in Leaf.xNet (used for CF Bypass).");
}
request.Proxy.ReadWriteTimeout = timeout;
request.Proxy.ConnectTimeout = timeout;
request.Proxy.Username = data.Proxy.Username;
request.Proxy.Password = data.Proxy.Password;
// Solve the CF challenge
var result = cf.Solve(httpClient, handler, uri).Result;
if (result.Success)
{
data.Log(new LogEntry($"[Success] Protection bypassed: {result.DetectResult.Protection}", Colors.GreenYellow));
}
else
{
throw new Exception($"CF Bypass Failed: {result.FailReason}");
}
request.UserAgent = ReplaceValues(userAgent, data);
// Once the protection has been bypassed we can use that httpClient to send the requests as usual
var response = httpClient.GetAsync(uri).Result;
// Save the cookies
var ck = cookies.GetCookies(uri);
var clearance = "";
var cfduid = "";
try
{
clearance = ck["cf_clearance"].Value;
cfduid = ck["__cfduid"].Value;
}
catch { }
var twoCapToken = data.GlobalSettings.Captchas.TwoCapToken;
if (twoCapToken != "") request.CaptchaSolver = new TwoCaptchaSolver() { ApiKey = data.GlobalSettings.Captchas.TwoCapToken };
var response = request.GetThroughCloudflare(new Uri(localUrl));
var cookies = response.Cookies.GetCookies(localUrl);
var clearanceCookie = cookies["cf_clearance"];
var cfduidCookie = cookies["__cfduid"];
data.Cookies.Add("cf_clearance", clearanceCookie.Value);
data.Cookies.Add("__cfduid", cfduidCookie.Value);
if (data.UseProxies)
{
data.Proxy.Clearance = clearanceCookie.Value;
data.Proxy.Cfduid = cfduidCookie.Value;
data.Proxy.Clearance = clearance;
data.Proxy.Cfduid = cfduid;
}
data.Log(new LogEntry("Got Cloudflare clearance!", Colors.GreenYellow));
data.Log(new LogEntry(clearanceCookie + Environment.NewLine + cfduidCookie + Environment.NewLine, Colors.White));
data.Log(new LogEntry(clearance + Environment.NewLine + cfduid + Environment.NewLine, Colors.White));
// Get code
data.ResponseCode = ((int)response.StatusCode).ToString();
@@ -150,25 +181,31 @@ namespace RuriLib
// Get headers
data.Log(new LogEntry("Received headers:", Colors.DeepPink));
var headerList = new List<KeyValuePair<string, string>>();
var receivedHeaders = response.EnumerateHeaders();
var receivedHeaders = response.Headers.GetEnumerator();
data.ResponseHeaders.Clear();
while (receivedHeaders.MoveNext())
{
var header = receivedHeaders.Current;
data.ResponseHeaders.Add(header.Key, header.Value);
data.Log(new LogEntry(header.Key + ": " + header.Value, Colors.LightPink));
var value = header.Value.GetEnumerator();
if (value.MoveNext())
{
data.ResponseHeaders.Add(header.Key, value.Current);
data.Log(new LogEntry(header.Key + ": " + value.Current, Colors.LightPink));
}
}
// Get cookies
data.Log(new LogEntry("Received cookies:", Colors.Goldenrod));
foreach (Cookie cookie in response.Cookies.GetCookies(localUrl))
foreach (Cookie cookie in ck)
{
if (data.Cookies.ContainsKey(cookie.Name)) data.Cookies[cookie.Name] = cookie.Value;
else data.Cookies.Add(cookie.Name, cookie.Value);
data.Log(new LogEntry(cookie.Name + ": " + cookie.Value, Colors.LightGoldenrodYellow));
}
data.ResponseSource = response.ToString();
// Save the content
data.ResponseSource = response.Content.ReadAsStringAsync().Result;
data.Log(new LogEntry("Response Source:", Colors.Green));
data.Log(new LogEntry(data.ResponseSource, Colors.GreenYellow));
}
+9 -3
View File
@@ -33,9 +33,18 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="2Captcha, Version=1.3.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\2CaptchaAPI.1.3.1\lib\netstandard2.0\2Captcha.dll</HintPath>
</Reference>
<Reference Include="AngleSharp, Version=0.9.9.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
<HintPath>..\packages\AngleSharp.0.9.9.2\lib\net45\AngleSharp.dll</HintPath>
</Reference>
<Reference Include="AntiCaptcha, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\AntiCaptchaAPI.1.0.0\lib\netstandard2.0\AntiCaptcha.dll</HintPath>
</Reference>
<Reference Include="CloudflareSolver, Version=1.4.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\CloudflareSolver.1.4.1\lib\netstandard2.0\CloudflareSolver.dll</HintPath>
</Reference>
<Reference Include="Extreme.Net, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\Extreme.Net.dll</HintPath>
@@ -55,9 +64,6 @@
<Reference Include="Jint, Version=0.0.0.0, Culture=neutral, PublicKeyToken=2e92ba9c8d81157f, processorArchitecture=MSIL">
<HintPath>..\packages\Jint.2.11.58\lib\net451\Jint.dll</HintPath>
</Reference>
<Reference Include="Leaf.xNet, Version=5.1.76.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Leaf.xNet.5.1.76\lib\net452\Leaf.xNet.dll</HintPath>
</Reference>
<Reference Include="LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
<HintPath>..\packages\LiteDB.4.1.4\lib\net40\LiteDB.dll</HintPath>
</Reference>
+3 -1
View File
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="2CaptchaAPI" version="1.3.1" targetFramework="net461" />
<package id="AngleSharp" version="0.9.9.2" targetFramework="net461" />
<package id="AntiCaptchaAPI" version="1.0.0" targetFramework="net461" />
<package id="CloudflareSolver" version="1.4.1" targetFramework="net461" />
<package id="DynamicLanguageRuntime" version="1.2.2" targetFramework="net461" />
<package id="IronPython" version="2.7.9" targetFramework="net461" />
<package id="Jint" version="2.11.58" targetFramework="net461" />
<package id="Leaf.xNet" version="5.1.76" targetFramework="net461" />
<package id="LiteDB" version="4.1.4" targetFramework="net461" />
<package id="Microsoft.Owin" version="4.0.1" targetFramework="net461" />
<package id="Microsoft.Owin.Security" version="4.0.1" targetFramework="net461" />