WebView2 拦截查看所有的请求
有两种方式:
1. 使用 devtool protocol:
// 启用网络监控 await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Network.enable", "{}"); //注册 Network.requestWillBeSent 事件 var requestWillBeSentReceiver = webView.CoreWebView2.GetDevToolsProtocolEventReceiver("Network.requestWillBeSent"); requestWillBeSentReceiver.DevToolsProtocolEventReceived += (m, n) => { //Debug.WriteLine("Request will be sent: " + n.ParameterObjectAsJson); if(n.ParameterObjectAsJson.Contains(".m3u8")) Debugger.Break(); }; //注册 Network.responseReceived 事件 var responseReceivedReceiver = webView.CoreWebView2.GetDevToolsProtocolEventReceiver("Network.responseReceived"); requestWillBeSentReceiver.DevToolsProtocolEventReceived += (m, n) => { //Debug.WriteLine("Response recieved: " + n.ParameterObjectAsJson); if (n.ParameterObjectAsJson.Contains(".m3u8")) Debugger.Break(); };
2. 使用控件自带事件
webView.CoreWebView2.WebResourceRequested += CoreWebView2_WebResourceRequested;
webView.CoreWebView2.WebResourceResponseReceived += CoreWebView2_WebResourceResponseReceived;
没有详细对比,感觉以下两种方案是一样的,都会漏掉一部分请求。用几个电影网站做了对比,确实会漏掉。
因为我用 cefsharp 做的另一个方案(当然代码要复杂很多),可以拦截到所有网站上的请求,但这个只能拦截到大多数网站,一部分网站是拦截不到的,但 开发者工具中明显可以看到是有请求的
还有以下方法,与方法1类似,但貌似没啥用:
var receiver = webView.CoreWebView2.GetDevToolsProtocolEventReceiver("Fetch.requestPaused"); receiver.DevToolsProtocolEventReceived += async (sender, args) => { var doc = JsonDocument.Parse(args.ParameterObjectAsJson); var requestId = doc.RootElement.GetProperty("requestId").GetString(); var request = doc.RootElement.GetProperty("request"); var url = request.GetProperty("url").GetString(); if (args.ParameterObjectAsJson.ToLower().Contains(".m3u8")) Debugger.Break(); await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.continueRequest", args.ParameterObjectAsJson); }; await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.enable", "{}"); // 启用 Fetch 拦截 string enableParams = "{\"handleAuthRequests\":true, \"pattern\": [{ \"urlPattern\": \"*\" }]}"; // 使用通配符捕获所有请求 await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.enable", enableParams); // 捕获请求暂停事件 var receiver2 = webView.CoreWebView2.GetDevToolsProtocolEventReceiver("Fetch.requestPaused"); receiver2.DevToolsProtocolEventReceived += async (sender, args) => { // 解析接收到的参数 var doc = JsonDocument.Parse(args.ParameterObjectAsJson); // 获取 requestId 和请求对象 var requestId = doc.RootElement.GetProperty("requestId").GetString(); var request = doc.RootElement.GetProperty("request"); // 提取 URL var url = request.GetProperty("url").GetString(); Console.WriteLine($"Intercepted URL: {url}"); // 打印被拦截的 URL // 获取请求头 var headers = request.GetProperty("headers").Deserialize<Dictionary<string, string>>(); // 你可以在这里修改请求头,或者添加自定义逻辑 // 构建继续请求的参数 var continueParams = new { requestId = requestId, headers = headers // 继续发送原始请求头 }; // 转换为 JSON 字符串 string continueParamsJson = JsonSerializer.Serialize(continueParams); // 继续请求 try { await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Fetch.continueRequest", continueParamsJson); } catch (Exception ex) { Console.WriteLine($"Error continuing request: {ex.Message}"); } };
桂棹兮兰桨,击空明兮溯流光。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2020-10-19 css3 自定义变量和动态计算示例
2012-10-19 asp.net 文件下载,多任务并行有进度条 (2012-10-18 15:36)