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 2024-10-19 10:32  空明流光  阅读(271)  评论(1编辑  收藏  举报

导航