如何在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
相关产品推荐
相关产品推荐

