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}");
    }
};
复制代码

 

posted on   空明流光  阅读(506)  评论(1编辑  收藏  举报

相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2020-10-19 css3 自定义变量和动态计算示例
2012-10-19 asp.net 文件下载,多任务并行有进度条 (2012-10-18 15:36)

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示