### 1. CefSharp 简介
CefSharp 允许 .NET 开发者将 Chromium web 浏览器嵌入到他们的应用中。通过这种方式,开发者可以在网页加载前后执行自定义的 JavaScript 代码。
### 2. 注入 JavaScript
使用 CefSharp,您可以在网页加载之后注入并执行 JavaScript 代码。这可以通过 `ExecuteScriptAsync` 方法实现。
示例:
```csharp
var browser = new ChromiumWebBrowser("http://www.example.com");
browser.FrameLoadEnd += (sender, args) => {
if (args.Frame.IsMain)
{
args.Frame.ExecuteScriptAsync("alert('Hello from CefSharp!');");
}
};
```
这里,当主框架的加载结束后,会弹出一个带有消息“Hello from CefSharp!”的对话框。
### 3. 替换 JavaScript
如果您想替换网页中的现有 JavaScript 函数或代码,可以使用以下策略:
1. 使用 `ExecuteScriptAsync` 来执行自定义的 JavaScript,这将会覆盖网页中的同名函数。
示例:
假设一个网页中有以下 JavaScript 函数:
```javascript
function showMessage() {
alert('Original Message');
}
```
您可以这样替换它:
```csharp
browser.FrameLoadEnd += (sender, args) => {
if (args.Frame.IsMain)
{
args.Frame.ExecuteScriptAsync(@"
function showMessage() {
alert('Replaced Message from CefSharp!');
}
");
}
};
```
### 3. 请求url为js的时候,替换整个js文件内容
private void barButtonItemLoad_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs eve)
{
if(browser!=null)
{
browser.Load(SVC.url);
return;
}
//禁止再次加载;
//barButtonItemLoad.Enabled = false;
//只有包含了此列表的关键字才hook
if (true)
{
//SVC.listHookUrl.Add("sec");
SVC.listHookUrl.Add("fireye");
//SVC.listHookUrl.Add("test");
}
//url = "https://www.baidu.com";
url = "file:///C:/Users/User/Desktop/testjs.html";
url = "http://localhost/js";
url = "http://localhost:18080/js";
url = "http://localhost:9090/";
url = "https://www.baidu.com";
url = "https://passport.taobao.com/ac/password_find.htm?spm=a2107.1.0.0.30d111d9oo8f0F&from_site=0&lang=zh_CN&app_name=tbTop&tracelog=signin_main_pass";
url = "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?style=simple&aid=16&uin=3557247785&sid=2858167361258078454&cap_cd=tPg7vp9-AqmbS0Eh4HFqKnsIeEyIIrq4ZZiKEWoswjmcCRoLKi2Z_w**&clientype=1&apptype=2";
SVC.url = url;
//SVC.webBeanPath=pathClass.getResultPath(true) + Md5Class.encryptStr(SVC.url) + ".obj";
//2
//https://www.cnblogs.com/xuejianxiyang/p/9981398.html;
//CefSharp F12打开DevTools查看console js和c#方法互相调用
CefSettings settings = new CefSettings();
// 设置代理服务器和端口
//方式1
//settings.Proxy = new ProxyOptions
//{
// Type = ProxyType.Manual,
// HttpProxy = "proxyserver:port",
// HttpsProxy = "proxyserver:port"
//};
//方式2
//// 创建一个命令行实例
//var commandLine = new CefCommandLine();
//// 设置代理服务器和端口
//commandLine.AppendSwitch("proxy-server", "proxyserver:port");
//// 将命令行实例应用到浏览器
//CefCommandLineExtension.ApplyCommandLine(commandLine);
//settings.CefCommandLineArgs.Add("--disable-web-security", "1");//关闭同源策略,允许跨域
//settings.CefCommandLineArgs.Add("disable-web-security", "1");
settings.CefCommandLineArgs.Add("--disable-web-security", "");
settings.CefCommandLineArgs.Add("ppapi-flash-version", "18.0.0.209");//PepperFlash\manifest.json中的version
settings.CefCommandLineArgs.Add("ppapi-flash-path", "PepperFlash\\pepflashplayer.dll");
settings.CefCommandLineArgs.Add("--enable-system-flash", "1");//使用系统flash
//模拟手机
//settings.CefCommandLineArgs.Add("--user-agent", "Mozilla/5.0 (Linux; Android 7.1.1; ATU-TL10 Build/N6F26U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.100 Mobile Safari/537.36 V1_AND_SQ_8.1.8_1276_YYB_D QQ/8.1.8.4260 NetType/WIFI WebP/0.4.1 Pixel/1440 StatusBarHeight/85 SimpleUISwitch/0");//
Cef.Initialize(settings);
/*以上设置未测试是否可行*/
browser = new ChromiumWebBrowser(url);
//browser = new ChromiumWebBrowser();
//this.Controls.Add(browser);
this.panelControl1.AddControl(browser);
browser.Dock = DockStyle.Fill;
browser.KeyboardHandler = new CEFKeyBoardHander();
//browser.FrameLoadEnd += Browser_FrameLoadEnd;
browser.RequestHandler = new MyRequestHandler();
browser.FrameLoadEnd += (s, e) =>
{
//一个页面加载如果有多个iframe会重复加载多次,需自己判断自己的加载的iframe或标记执行一次
BeginInvoke(new Action(() =>
{
//判断是否是需要获取cookie的页面
if (e.Url.Contains(""))
{
//注册获取cookie回调事件
ICookieManager cookieManager = browser.GetCookieManager();
CookieVisitor visitor = new CookieVisitor();
visitor.SendCookie += SaveCookie;
cookieManager.VisitAllCookies(visitor);
}
}));
};
}
using CefSharp;
using CefSharp.Handler;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CefBrowser.cef
{
class MyRequestHandler : RequestHandler
{
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
//if (request.Url.Contains(".js"))
//{
// //return new MyResourceRequestHandler();
//}
////Trace.WriteLine("url:" + request.Url);
//SVC.url = request.Url;
return new MyResourceRequestHandler();
}
//protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
//{
// // 这里你可以根据需要检查请求的URL或其他条件
// //if (/* 滑块滑到末尾或其他你的条件 */)
// //{
// // return true; // 这将取消请求
// //}
// Trace.WriteLine(request.Url);
// return false; // 这将允许请求继续
//}
}
}
using CefBrowser.bean;
using CefSharp;
using CefSharp.Handler;
using roc_util_project.folder_file_package;
using roc_util_project.path_package;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CefBrowser.cef
{
class MyResourceRequestHandler : ResourceRequestHandler
{
/// <summary>
/// 替换JS;
/// </summary>
/// <param name="chromiumWebBrowser"></param>
/// <param name="browser"></param>
/// <param name="frame"></param>
/// <param name="request"></param>
/// <returns></returns>
protected override IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
//https://g.alicdn.com/AWSC/fireyejs/1.226.0/fireyejs.js
if (request.Url.EndsWith("fireyejs.js"))
{
// 返回本地JS文件内容
//var bytes = File.ReadAllBytes("path/to/your/localScript.js");
//return fileClass.readToEnd(pathClass.getResultPath(true)+ @"js\fireyejs.js",Encoding.UTF8);
//E:\svn\chobits\workspace\js\ast\src
//return code;
//fileClass.writeLineResult("flyv2",code);
//base64 没啥用
string resource = pathClass.getCurrPath() + @"resource";
string path = $@"{resource}\js\base64.txt";
string base64 = null;
if (File.Exists(path))
{
base64 = fileClass.readToEnd(path);
}
//fireyejs
path = @"E:\svn\chobits\workspace\js\ast\src\fireyejs.js";
if(!File.Exists(path))
{
path = $@"{resource}\js\fireyejs.js";
}
string codeInput = fileClass.readToEnd(path, Encoding.UTF8);//.Replace("[base64String]", base64)
//roc
path = @"E:\svn\chobits\workspace\js\ast\src\roc.js";
if (!File.Exists(path))
{
path = $@"{resource}\js\roc.js";
}
string roc = fileClass.readToEnd(path,Encoding.UTF8);
string temp = fileClass.readToEnd($@"{resource}\js\taobao\i.js", Encoding.UTF8);
roc = roc.Replace("[roci]", temp.Replace("`", @"\`"));
temp = fileClass.readToEnd($@"{resource}\js\taobao\fireyejs.js", Encoding.UTF8);
roc = roc.Replace("[fireyejs]", temp.Replace("`", @"\`"));
temp = fileClass.readToEnd($@"{resource}\js\taobao\PerformanceEntry.txt", Encoding.UTF8);
roc = roc.Replace("[entries]", temp.Replace("`", @"\`"));
//temp = fileClass.readToEnd(@"D:\js\taobao\window.txt", Encoding.UTF8);
//roc = roc.Replace("[rocwindow]", temp.Replace("`", @"\`"));
codeInput = roc + codeInput;
//Trace.WriteLine(codeInput);
//return codeInput;
var bytes=Encoding.UTF8.GetBytes(codeInput);
return ResourceHandler.FromByteArray(bytes, "application/javascript");
}
else if(request.Url.Contains("https://t.captcha.qq.com/tdc.js123"))
{
string code = @"原始JS";
//原始JS上面增加自己的js
string roc = @"
//simulateSlide('nc_1_n1z', 400,2000);
window.rocTest=function()
{
function cubicBezier(p1, p2, t) {
const u = 1 - t;
const tt = t * t;
const uu = u * u;
const uuu = uu * u;
const ttt = tt * t;
const x = uuu * 0 + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * 1;
const y = uuu * 0 + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * 1;
return { x, y };
}
function simulateSlide(id, offsetX, duration) {
//const slider = document.getElementById(id);
//console.log('slider',slider);
let slider = document.querySelector('.tc-fg-item.tc-slider-normal');
//let slider = document.querySelector('.tc-fg-item.tc-slider-normal');
const rect = slider.getBoundingClientRect();
const x0 = rect.x || rect.left;
const y0 = rect.y || rect.top;
const controlPoints = {
p1: { x: 0.42, y: 0 },
p2: { x: 0.58, y: 1 }
};
let startTime;
const stepCount = Math.abs(offsetX);
const avgDelay = duration / stepCount;
function sendMouseEvent(type, x, y) {
const event = new MouseEvent(type, {
clientX: x,
clientY: y,
bubbles: true,
cancelable: true,
view: window
});
slider.dispatchEvent(event);
}
function step(timestamp) {
if (!startTime) startTime = timestamp;
const elapsed = timestamp - startTime;
const t = Math.min(elapsed / duration, 1);
const position = cubicBezier(controlPoints.p1, controlPoints.p2, t);
const x = x0 + position.x * offsetX;
const y = y0 + position.y * offsetX;
sendMouseEvent(""mousemove"", x, y);
if (t < 1) {
const randomDelay = Math.random() * (2 * avgDelay);
setTimeout(() => requestAnimationFrame(step), randomDelay);
} else {
sendMouseEvent(""mouseup"", x, y);
}
}
sendMouseEvent(""mousedown"", x0, y0);
requestAnimationFrame(step);
}
simulateSlide('nc_1_n1z', 400,2000);
}";
code = roc +"\r\n"+ code;
var bytes = Encoding.UTF8.GetBytes(code);
return ResourceHandler.FromByteArray(bytes, "application/javascript");
}
else if (request.Url.Contains("dy-ele.f01bfcf8.js"))
{
string code = @"原始JS";
string roc = @"
//simulateSlide('nc_1_n1z', 400,2000);
window.rocTest=function()
{
function cubicBezier(p1, p2, t) {
const u = 1 - t;
const tt = t * t;
const uu = u * u;
const uuu = uu * u;
const ttt = tt * t;
const x = uuu * 0 + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * 1;
const y = uuu * 0 + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * 1;
return { x, y };
}
function simulateSlide(id, offsetX, duration) {
//const slider = document.getElementById(id);
//console.log('slider',slider);
let slider = document.querySelector('.tc-fg-item.tc-slider-normal');
//let slider = document.querySelector('.tc-fg-item.tc-slider-normal');
const rect = slider.getBoundingClientRect();
const x0 = rect.x || rect.left;
const y0 = rect.y || rect.top;
const controlPoints = {
p1: { x: 0.42, y: 0 },
p2: { x: 0.58, y: 1 }
};
let startTime;
const stepCount = Math.abs(offsetX);
const avgDelay = duration / stepCount;
function sendMouseEvent(type, x, y) {
const event = new MouseEvent(type, {
clientX: x,
clientY: y,
bubbles: true,
cancelable: true,
view: window
});
slider.dispatchEvent(event);
}
function step(timestamp) {
if (!startTime) startTime = timestamp;
const elapsed = timestamp - startTime;
const t = Math.min(elapsed / duration, 1);
const position = cubicBezier(controlPoints.p1, controlPoints.p2, t);
const x = x0 + position.x * offsetX;
const y = y0 + position.y * offsetX;
sendMouseEvent(""mousemove"", x, y);
if (t < 1) {
const randomDelay = Math.random() * (2 * avgDelay);
setTimeout(() => requestAnimationFrame(step), randomDelay);
} else {
sendMouseEvent(""mouseup"", x, y);
}
}
sendMouseEvent(""mousedown"", x0, y0);
requestAnimationFrame(step);
}
simulateSlide('nc_1_n1z', 400,2000);
}";
code = roc + "\r\n" + code;
var bytes = Encoding.UTF8.GetBytes(code);
return ResourceHandler.FromByteArray(bytes, "application/javascript");
}
return base.GetResourceHandler(chromiumWebBrowser, browser, frame, request);
}
}
}