You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CefSharp中捕获自动加载资源请求头内的Cookie

用CefSharp捕获资源加载时的请求Cookie

我来帮你搞定这个问题,你之前提到的接口应该记混啦——不是IRequestHeader,而是要通过实现**IRequestHandler**接口来拦截资源请求,进而提取到你需要的cf_clearance和__cfduid这类Cookie。下面是具体的操作步骤和代码示例:

核心思路

主页面加载时不带目标Cookie,但子资源(脚本、样式、图片等)的请求会携带,所以我们要做的就是:拦截所有资源加载请求,筛选出子资源的请求,然后从请求头里提取Cookie信息。


步骤1:自定义RequestHandler类

创建一个实现IRequestHandler接口的类,重点重写OnBeforeResourceLoad方法——这个方法会在每个资源请求发送前触发,正好适合我们获取请求头。

using CefSharp;
using System.Collections.Specialized;

public class CustomRequestHandler : IRequestHandler
{
    // 接口其他方法留空或返回默认值即可
    public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
    {
        return false;
    }

    // 重点:拦截资源请求并提取Cookie
    public IRequestHandler.ResourceLoadAction OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
    {
        // 尝试从请求头中获取Cookie
        if (request.Headers.TryGetValue("Cookie", out string cookieHeader))
        {
            // 只处理子资源请求(主页面请求不带目标Cookie)
            if (request.ResourceType != ResourceType.MainFrame)
            {
                Console.WriteLine($"捕获到子资源Cookie: {cookieHeader}");
                
                // 解析出你需要的cf_clearance和__cfduid
                var cookiePairs = cookieHeader.Split(';');
                foreach (var pair in cookiePairs)
                {
                    var keyValue = pair.Trim().Split('=');
                    if (keyValue.Length == 2)
                    {
                        string key = keyValue[0];
                        string value = keyValue[1];
                        
                        if (key == "cf_clearance")
                        {
                            Console.WriteLine($"提取到cf_clearance: {value}");
                            // 这里可以把值保存到变量/文件/数据库中
                        }
                        else if (key == "__cfduid")
                        {
                            Console.WriteLine($"提取到__cfduid: {value}");
                            // 这里可以把值保存到变量/文件/数据库中
                        }
                    }
                }
            }
        }

        // 返回Continue让请求正常加载
        return IRequestHandler.ResourceLoadAction.Continue;
    }

    // 以下是接口其他方法的默认实现,直接复制即可
    public bool GetAuthCredentials(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
    {
        callback.Dispose();
        return false;
    }

    public bool OnCertificateError(IWebBrowser chromiumWebBrowser, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
    {
        callback.Dispose();
        return false;
    }

    public void OnPluginCrashed(IWebBrowser chromiumWebBrowser, IBrowser browser, string pluginPath) { }

    public void OnRenderProcessTerminated(IWebBrowser chromiumWebBrowser, IBrowser browser, CefTerminationStatus status) { }

    public bool OnQuotaRequest(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
    {
        callback.Dispose();
        return false;
    }

    public void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, ref string newUrl) { }

    public bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
    {
        return false;
    }

    public void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength) { }

    public bool OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, string url)
    {
        return false;
    }

    public bool OnRenderViewReady(IWebBrowser chromiumWebBrowser, IBrowser browser)
    {
        return false;
    }

    public bool OnPreKeyEvent(IWebBrowser chromiumWebBrowser, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
    {
        return false;
    }
}

步骤2:绑定自定义处理器到浏览器

在初始化ChromiumWebBrowser时,把我们的CustomRequestHandler赋值给它的RequestHandler属性:

// 先初始化CefSharp(全局只需一次)
Cef.Initialize(new CefSettings());

// 创建浏览器实例并指定目标网址
var browser = new ChromiumWebBrowser("https://你的目标站点.com");

// 绑定自定义请求处理器
browser.RequestHandler = new CustomRequestHandler();

// 将浏览器添加到窗体(以WinForms为例)
this.Controls.Add(browser);
browser.Dock = DockStyle.Fill;

关键细节说明

  • 为什么选OnBeforeResourceLoad:这个方法在请求发送前触发,能完整获取请求头,不会漏掉任何子资源的Cookie信息。
  • 过滤主页面请求:通过request.ResourceType != ResourceType.MainFrame判断,只处理子资源请求,避免主页面的无效请求干扰。
  • Cookie解析:直接拆分Cookie字符串是最直接的方式,如果你需要更严谨的解析,也可以用System.Net.CookieContainer处理,但针对你要的两个Cookie键,直接拆分足够高效。

这样设置后,当浏览器加载子资源时,就会自动捕获并提取你需要的Cookie值啦,你可以根据需求把这些值保存到合适的地方。

内容的提问来源于stack exchange,提问作者salt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:16:55