京东慧眼
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

250 lines
8.2 KiB

using CefSharp;
using CefSharp.Handler;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using .UserControls;
namespace .cefhelper
{
public class MyRequestHandler : RequestHandler
{
protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture,
bool isRedirect)
{
// 先调用基类的实现,断点调试
return base.OnBeforeBrowse(chromiumWebBrowser, browser, frame, request, userGesture, isRedirect);
}
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame,
IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
// 先调用基类的实现,断点调试
return base.GetResourceRequestHandler(
chromiumWebBrowser, browser, frame, request, isNavigation,
isDownload, requestInitiator, ref disableDefaultHandling);
}
}
public class MyResourceRequestHandlerFactory : ResourceRequestHandlerFactory
{
public MyResourceRequestHandlerFactory(BrowerControl brower)
{
Brower = brower;
}
public MyResourceRequestHandlerFactory(SomeBrowerControl brower)
{
Brower2 = brower;
}
public SomeBrowerControl Brower2;
public BrowerControl Brower;
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
if (Brower != null)
{
return new MyResourceRequestHandler(Brower);
}
return new MyResourceRequestHandler(Brower2);
}
}
public class MyResourceRequestHandler : ResourceRequestHandler
{
public MyResourceRequestHandler(BrowerControl brower)
{
Brower = brower;
}
public MyResourceRequestHandler(SomeBrowerControl brower)
{
Brower2 = brower;
}
public SomeBrowerControl Brower2;
public BrowerControl Brower;
protected override bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
if (Brower != null)
Brower.OnUrlEnd(request.Url);
else
Brower2.OnUrlEnd(request.Url);
return base.OnResourceResponse(chromiumWebBrowser, browser, frame, request, response);
}
//https://static.pddpic.com/assets/css/widgets_ba9e42522602b85cbbbc.css
//max-width:768px
protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
if (!request.Url.Contains("mobile.yangkeduo.com/login.html"))
{
if (request.Url.Contains("yangkeduo"))
{
request.SetHeaderByName("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63070517)", true);
}
}
return base.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback);
}
protected override IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
if (request.Url.Contains("https://static.pddpic.com/assets/css/SearchResultTab") ||request.Url.StartsWith("https://static.pddpic.com/assets/css/SearchBar2")||request.Url.StartsWith("https://static.pddpic.com/assets/css/widgets"))
{
if(!request.Url.StartsWith("data:text/html"))
{
var fil = new MyResponseFilter(true, Brower, request.Url);
return fil;
}
}
return base.GetResourceResponseFilter(chromiumWebBrowser, browser, frame, request, response);
}
}
public class MyResponseFilter : IResponseFilter
{
public BrowerControl Brower;
private string Url;
public MyResponseFilter(bool _filter, BrowerControl brower, string url) { filter = _filter; Brower = brower; Url = url; }
bool Disposed = false;
/// <summary>
/// 是否过滤,如果不过滤就截获
/// </summary>
bool filter = false;
private MemoryStream memoryStream;
public void Dispose()
{
//memoryStream?.Dispose();
//memoryStream = null;
}
public void Dispose(bool r)
{
if (Disposed)
return;
if (r)
{
memoryStream?.Dispose();
memoryStream = null;
}
Disposed = true;
}
public FilterStatus Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten)
{
if (dataIn == null)
{
dataInRead = 0;
dataOutWritten = 0;
return FilterStatus.Done;
}
////Copy data to stream
dataIn.Position = 0;
dataIn.CopyTo(memoryStream);
byte[] response = null;
string json = DataStr.Replace(" .",".");
if (Url.Contains("https://static.pddpic.com/assets/css/SearchBar2")||Url.Contains("https://static.pddpic.com/assets/css/SearchResultTab"))
{
var matchs = Regex.Matches(json, ":(.*?)rem");
if (matchs.Count > 0)
{
matchs.ToList().ForEach(c =>
{
string px = c.Groups[1].Value;
if (px.StartsWith("."))
{
px = "0" + px;
}
decimal pxVal = 0;
if (decimal.TryParse(px, out pxVal))
{
json = json.Replace(c.Value, ":" + (pxVal * 100) + "px ");
}
});
}
matchs = Regex.Matches(json, " (.*?)rem");
if (matchs.Count > 0)
{
matchs.ToList().ForEach(c =>
{
string px = c.Groups[1].Value;
if (px.StartsWith("."))
{
px = "0" + px;
}
decimal pxVal = 0;
if (decimal.TryParse(px, out pxVal))
{
json = json.Replace(c.Value, " " + (pxVal * 100) + "px ");
}
});
}
if (Url.Contains("https://static.pddpic.com/assets/css/SearchResultTab"))
{
json = json.Replace(".gNxXM8Fs{top:.5rem;}", ".gNxXM8Fs{top:55px;}");
}
}
json = json.Replace("768px", "100%");
response = Encoding.GetEncoding("gb2312").GetBytes(json);
var ms = new MemoryStream(response);
ms.CopyTo(dataOut);
dataInRead = dataIn.Length;
dataOutWritten = response.Length;
return FilterStatus.Done;
}
public bool InitFilter()
{
memoryStream = new MemoryStream();
return true;
}
public byte[] Data
{
get { return memoryStream.ToArray(); }
}
public string DataStr
{
get { return Encoding.UTF8.GetString(memoryStream.ToArray()); }
}
}
}