cefsharp网页请求js的时候,替换掉整个js文件的代码.

### 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);
        }



    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值