⁉️说明
之前因为Mirai框架的滑动验证码有点麻烦,所以写了一个Mirai框架的滑块验证码工具。
主要就是重写CefSharp库的RequestHandler截取所有的http请求。
例子可以参考:https://github.com/SwaggyMacro/MiraiSliderTool
美中不足的就是需要打包整个Cefsharp库,相当于封装了一个完整的chromium内核到项目里,体积非常之大,有100MB左右。
💻实现代码
首先去Nuget安装符合版本的CefSharp
浏览器窗口
BrowserForm.cs
using CefSharp;
using CefSharp.WinForms;
using System;
using System.Windows.Forms;
namespace CefSharpCapture
{
public partial class BrowserForm : Form
{
private ChromiumWebBrowser browser;
public static BrowserForm form;
public BrowserForm()
{
InitializeComponent();
InitBrowser();
}
private void InitBrowser()
{
try
{
Cef.Initialize(new CefSettings());
browser = new ChromiumWebBrowser();
browser.Parent = panel1;
browser.Dock = DockStyle.Fill;
browser.RequestHandler = new CustomRequestHandler();
}
catch (Exception ex)
{
//throw ex;
}
}
}
}
CustomHandler类
Capture.cs
using CefSharp;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace CefSharpCapture
{
public class CustomResourceRequestHandler : CefSharp.Handler.ResourceRequestHandler
{
protected override IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame,
IRequest request, IResponse response)
{
var filter = FilterManager.CreateFilter(request.Identifier.ToString());
return filter;
}
protected override void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request,
IResponse response, UrlRequestStatus status, long receivedContentLength)
{
// 这里就是request response了,请求后的结果在这获取,例子:
var filter = FilterManager.GetFileter(request.Identifier.ToString()) as CustomFilter;
if (filter != null)
{
ASCIIEncoding encoding = new ASCIIEncoding();
string data = encoding.GetString(filter.DataAll.ToArray());
//data就是返回内容
}
}
}
public class CustomFilter : IResponseFilter
{
public List<byte> DataAll = new List<byte>();
public FilterStatus Filter(System.IO.Stream dataIn, out long dataInRead, System.IO.Stream dataOut, out long dataOutWritten)
{
try
{
if (dataIn == null)
{
dataInRead = 0;
dataOutWritten = 0;
return FilterStatus.Done;
}
if (dataIn.Length > dataOut.Length)
{
dataInRead = dataIn.Length;
dataOutWritten = dataOut.Length;
return FilterStatus.Done;
}
dataInRead = dataIn.Length;
dataOutWritten = Math.Min(dataInRead, dataOut.Length);
dataIn.CopyTo(dataOut);
dataIn.Seek(0, SeekOrigin.Begin);
byte[] bs = new byte[dataIn.Length];
dataIn.Read(bs, 0, bs.Length);
DataAll.AddRange(bs);
dataInRead = dataIn.Length;
dataOutWritten = dataIn.Length;
return FilterStatus.NeedMoreData;
}
catch (Exception ex)
{
dataInRead = dataIn.Length;
dataOutWritten = dataIn.Length;
//throw ex;
return FilterStatus.Done;
}
}
public bool InitFilter()
{
return true;
}
public void Dispose()
{
}
}
public class FilterManager
{
private static Dictionary<string, IResponseFilter> dataList = new Dictionary<string, IResponseFilter>();
public static IResponseFilter CreateFilter(string guid)
{
lock (dataList)
{
var filter = new CustomFilter();
dataList.Add(guid, filter);
return filter;
}
}
public static IResponseFilter GetFileter(string guid)
{
lock (dataList)
{
if (dataList.ContainsKey(guid))
{
return dataList[guid];
}
else
{
return null;
}
}
}
}
public class CustomRequestHandler : CefSharp.Handler.RequestHandler
{
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
return new CustomResourceRequestHandler();
}
}
}