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}"); } };
桂棹兮兰桨,击空明兮溯流光。