cefsharp 基础使用方法

本文详细介绍了如何在CEFSharp中进行各种操作,包括加载网络页面,实现js前台事件调用后台方法,使用IDownloadHandler弹出下载保存框,启用F12审查元素功能,隔离Cookie,拦截HTTP和WebSocket请求,以及设置代理更换IP。此外,还展示了如何抓取web微信好友信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加载网络页面

 static ChromiumWebBrowser web;
        private void Browserform_Load(object sender, EventArgs e)
        {
            try
            {
                web = new ChromiumWebBrowser("www.baidu.com");  
                web.Dock = DockStyle.Fill;
                web.RequestHandler = re;
                web.FrameLoadStart += Web_FrameLoadStart;
                web.FrameLoadEnd += Web_FrameLoadEnd;
                web.LoadingStateChanged += Web_LoadingStateChanged;
                this.Invoke(new Action(() =>
                {
                    this.Controls.Add(web);
                }));
 
                //browser表示你的CefSharp对象使用它的RegisterJsObject来绑定你的.net类  
                web.RegisterJsObject("bound", new BoundObject());
 
                //在实际的JS代码中,你将使用这样的对象:
                //bound.myProperty; // 使用此语法访问属性 
 
                //bound.myMethod(); // 使用此调用方法。
 
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }

 js前台事件执行后台方法

 

记录工作使用心得。

使用过程中想用js调用后台事件,如果做那?

不像正常接口可以直接调用访问。其实这个问题CEFSharp的设计者们,早就想好了。

那就是通过调用 JavascriptResponse 类来执行后台时间。

 

你可以在代码中load js 到浏览器中。js内容调用你的后台事件。 下面就是一个简单的列子。

示例代码均已上传github    git地址

 

 static ChromiumWebBrowser web;
        private void Browserform_Load(object sender, EventArgs e)
        {
            try
            {
                web = new ChromiumWebBrowser("www.baidu.com");  
                web.Dock = DockStyle.Fill;
                web.RequestHandler = re;
                web.FrameLoadStart += Web_FrameLoadStart;
                web.FrameLoadEnd += Web_FrameLoadEnd;
                web.LoadingStateChanged += Web_LoadingStateChanged;
                this.Invoke(new Action(() =>
                {
                    this.Controls.Add(web);
                }));
 
                //browser表示你的CefSharp对象使用它的RegisterJsObject来绑定你的.net类  
                web.RegisterJsObject("bound", new BoundObject());
 
                //在实际的JS代码中,你将使用这样的对象:
                //bound.myProperty; // 使用此语法访问属性 
 
                //bound.myMethod(); // 使用此调用方法。
 
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.ToString());
            }

将js事件通过注册进入页面,通过

bound.myMethod(); 访问后台方法。
bound.MyProperty 访问后台属性。
    private async Task initmethodAsync()
        {
            string js_func = "";        
            js_func += " var all = $(\"div[class='ng-scope']\"); for (i = 0; i < all.length; i++) { all[i].onclick = onNickName; }";
            js_func += " function onNickName() {bound.myMethod($(this).find('span').eq(0).text(),$(this).find('img').eq(0).attr('src'));}; ";
            JavascriptResponse x = await web.EvaluateScriptAsync(js_func);
        }

C# 事件响应类:

  public class BoundObject
    {
        public string MyProperty { get; set; }
        public void MyMethod(string ShowNickName,string html)
        {
            try
            {
              Console.WriteLine("我来响应前台的的事件");
            }
            catch (Exception ex)
            {
 
            }
        }
     
    }

下载文件 弹出保存框 IDownloadHandler

 

最近一直在做CEFsharp 方面的,遇到了下载文件的无法保存的问题 。 记录解决下。 主要是应用了 
IDownloadHandler
调用方法:
              web.MenuHandler = new MyWebContextMenu();
                web.DownloadHandler = new MyDownLoadFile();

/// <summary>
    /// 下载文件
    /// </summary>
    public class MyDownLoadFile : IDownloadHandler
    {
        public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
        {
            if (!callback.IsDisposed)
            {
                using (callback)
                {
                    callback.Continue(@"C:\Users\" +
                            System.Security.Principal.WindowsIdentity.GetCurrent().Name+
                            @"\Downloads\" +
                            downloadItem.SuggestedFileName,
                        showDialog: true);
                }
            }
        }
 
        public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
        {
            //downloadItem.IsCancelled = false;
        }
        public bool OnDownloadUpdated(CefSharp.DownloadItem downloadItem)
        {
            return false;
        }
    }

cefsharp 调用F12 审查元素功能

        private void button1_Click_1(object sender, EventArgs e)
        {
            web.ShowDevTools();
          
        }

CEFSharp 隔离Cookie

 

怎么隔离那?最近做项目中一直不甘心使用程序应用域隔离的办法,终于找到了可以实现的办法

提出来做个笔记: 红色部分关键的四句话。

                RequestContextSettings requestContextSettings = new RequestContextSettings();
                requestContextSettings.PersistSessionCookies = false;
                requestContextSettings.PersistUserPreferences = false;
   
                string BaseUrl = "www.baidu.com";
                web = new ChromiumWebBrowser(BaseUrl);   
                web.RequestContext = new RequestContext(requestContextSettings);

RequestContextSettings requestContextSettings = new RequestContextSettings();

 

web.RequestContext = new RequestContext(requestContextSettings);

这两句是关键

官方帖子出处:

CEF3:介绍BrowsingInstance和SiteInstance概念 #1044

https://github.com/roadlabs/chromiumembedded/issues/1044

 现存的问题 Cookie隔离后 单独的Cookie 获取成了新的问题,正在研究中,如果有知道请留言。


拦截网络请求 截取get post response返回

 

主要是继承实现 Cefsharp的IRquestHandler对象,

废话不多说上代码:

  public class request : IRequestHandler
    {
 
        public event Action<string> msg;
        public event Action<string, object> msg2;
        public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy,
            string host, int port, string realm, string scheme, IAuthCallback callback)
        {
 
            return false;
        }
 
        public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
 
            //if (!response.ResponseHeaders["Content-Type"].Contains("application/json"))
            //{
            //    return null;
            //}
 
            var filter = FilterManager.CreateFilter(request.Identifier.ToString());
 
            return filter;
        }
        private void Filter_VOIDFUN(string arg1, string arg2, string arg3, long arg4)
        {
            msg2?.Invoke(arg1, arg2);
        }
 
 
        public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request,
            bool isRedirect)
        {
 
            var m = request.Method;
            msg?.Invoke(request.Url);
            msg?.Invoke(m);
            if (request.Method == "POST")
            {
                using (var postData = request.PostData)
                {
                    if (postData != null)
                    {
                        var elements = postData.Elements;
 
                        var charSet = request.GetCharSet();
 
                        foreach (var element in elements)
                        {
                            if (element.Type == PostDataElementType.Bytes)
                            {
                                var body = element.GetBody(charSet);
                                msg?.Invoke(body);
                            }
                        }
                    }
                }
            }
 
            return false;
        }
 
        public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
        {
            var m = request.Method;
            msg?.Invoke(request.Url);
            msg?.Invoke(m);
            if (request.Method == "POST")
            {
                using (var postData = request.PostData)
                {
                    if (postData != null)
                    {
                        var elements = postData.Elements;
 
                        var charSet = request.GetCharSet();
 
                        foreach (var element in elements)
                        {
                            if (element.Type == PostDataElementType.Bytes)
                            {
                                var body = element.GetBody(charSet);
                                msg?.Invoke(body);
                            }
                        }
                    }
                }
            }
 
            return CefReturnValue.Continue;
        }
 
        public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
        {
            return true;
        }
 
        public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
        {
            return false;
        }
 
        public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
        {
 
        }
 
        public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
        {
            return false;
        }
 
        public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
        {
            return false;
        }
 
        public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
        {
 
        }
 
        public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
        {
 
        }
 
        public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
        {
          
        }
 
        public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl)
        {
 
        }
 
        public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
        {
 
        }
 
        public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
            return false; ;
 
        }
 
        public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
        {
            return true;
        }
    }
    public class FilterManager
    {
        private static Dictionary<string, IResponseFilter> dataList = new Dictionary<string, IResponseFilter>();
 
        public static IResponseFilter CreateFilter(string guid)
        {
            lock (dataList)
            {
                var filter = new AppendResponseFilter("","");
                dataList.Add(guid, filter);
 
                return filter;
            }
        }
 
        public static IResponseFilter GetFileter(string guid)
        {
            lock (dataList)
            {
                return dataList[guid];
            }
        }
    }
}


CEFSharp 拦截 http 请求 websocket 内容

  private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
 
                //更改设置浏览器语言
                CefSettings settings = new CefSettings();
                settings.Locale = "zh-CN";
                settings.AcceptLanguageList = "zh-CN";
                Cef.Initialize(settings);
 
                var re = new request();
 
                //接收和发送的http消息
                re.msg += Re_msg;
                re.msg2 += Re_msg2;    ... 这里是使用

 private void Re_msg(string obj)
        {   //可打印Obj 内容即可看到 }

 public class request : IRequestHandler
    {
        public event Action<string> msg;
        public event Action<string,object> msg2;
        public event Action<string> msgGetuser;
        public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy,
            string host, int port, string realm, string scheme, IAuthCallback callback)
        {
 
            return false;
        }
 
        public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
 
            if (response.MimeType.ToLower().IndexOf("text") > -1 || response.MimeType.ToLower().IndexOf("json") > -1)
            {
 
                var filter = new AppendResponseFilter(request.Url, response.MimeType);
 
                filter.VOIDFUN += Filter_VOIDFUN;
                return filter;
                //var filter2 = FilterManager.CreateFilter(request.Identifier.ToString());
 
                //return filter2;
 
            }
 
            return null;
 
            //var filter1 = FilterManager.CreateFilter(request.Identifier.ToString());
 
            //return filter1;
 
        }
        private void Filter_VOIDFUN(string arg1, string arg2, string arg3, long arg4)
        {    
            msg2?.Invoke(arg1,arg2);
        }
 
 
        public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request,
            bool isRedirect)
        {
 
            var m = request.Method;
            msg?.Invoke(request.Url);
            msg?.Invoke(m);
            if (request.Method == "POST")
            {
                using (var postData = request.PostData)
                {
                    if (postData != null)
                    {
                        var elements = postData.Elements;
 
                        var charSet = request.GetCharSet();
 
                        foreach (var element in elements)
                        {
                            if (element.Type == PostDataElementType.Bytes)
                            {
                                var body = element.GetBody(charSet);
                                msg?.Invoke(body);
                            }
                        }
                    }
                }
            }
 
            return false;
        }
 
        public CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
        {
            var m = request.Method;
            msg?.Invoke(request.Url);
            msg?.Invoke(m);
            if (request.Method == "POST")
            {
                using (var postData = request.PostData)
                {
                    if (postData != null)
                    {
                        var elements = postData.Elements;
 
                        var charSet = request.GetCharSet();
 
                        foreach (var element in elements)
                        {
                            if (element.Type == PostDataElementType.Bytes)
                            {
                                var body = element.GetBody(charSet);
                                msg?.Invoke(body);
                            }
                        }
                    }
                }
            }
           
            return CefReturnValue.Continue;
        }
 
        public bool OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
        {
            return true;
        }
 
        public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
        {
            return false;
        }
 
        public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
        {
 
        }
 
        public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
        {
            return false;
        }
 
        public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
        {
            return false;
        }
 
        public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
        {
 
        }
 
        public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
        {
 
        }
 
        public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
        {
            //if (request.Url.Contains("https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?") || request.Url.Contains("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?"))
            //{
            //    //if (!response.ResponseHeaders["Content-Type"].Contains("application/json"))
            //    //{
            //    //    return;
            //    //}
            //    var filter1 = FilterManager.GetFileter(request.Identifier.ToString()) as AppendResponseFilter;
 
            //    if (filter1 != null)
            //        Console.WriteLine(filter1.DataAll);
            //    byte[] bys = filter1.DataAll.ToArray();
            //    string s1 = System.Text.Encoding.UTF8.GetString(bys);
 
            //    msgGetuser.Invoke(s1);
            //}
 
        }
 
        public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl)
        {
 
        }
 
        public void OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
        {
 
        }
 
        public bool OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
        {
            return false; ;
 
        }
 
        public bool OnSelectClientCertificate(IWebBrowser browserControl, IBrowser browser, bool isProxy, string host, int port, X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
        {
            return true;
        }
    }

 


CEFSharp 使用代理 更换位置IP

 

直接上代码:

var settings = new CefSettings();

settings.CachePath = "cache";

settings.CefCommandLineArgs.Add("proxy-server", ProxyAddress);

Cef.Initialize(settings);

 


抓取web微信自己的好友信息

上面文章写了一些使用cefsharp的内容和技巧 ,这篇文章主要写下实际 应用:

这里例子用的webwechat wx2.qq.com 做实例的。

通过登录web微信获取到获取通讯录的url:   https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?

            //开启线程,抓取用户列表并保存到数据库
            if (obj.Contains("https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?"))
            {
                modcssAsync();
                ///新加获取Cookie 
                WxorWx2 = 2;
                var cookieManager = CefSharp.Cef.GetGlobalCookieManager();
                CookieVisitor visitor = new CookieVisitor();
                visitor.SendCookie += Visitor_GetUin;
                cookieManager.VisitAllCookies(visitor);
 
 
                Thread getFriendsThread = new Thread(new ParameterizedThreadStart(getfriends));
                getFriendsThread.IsBackground = true;
                getFriendsThread.Name = DateTime.Now.ToString();
                getFriendsThread.Start((Object)obj);
            }  
 /// <summary>
        /// 1 获取好友列表    
        /// </summary>
        /// <param name="url">路径</param>
        /// <param name="myCookieContainer">Cookie</param>
        /// <returns></returns>
        public static JObject GetContactByUrl(string url, CookieContainer myCookieContainer1,string CookieStr)
        {
            try
            {
          
                StringBuilder content = new StringBuilder();
                HttpWebRequest request = HttpWebRequest.Create(url.ToString()) as HttpWebRequest;
                request.Method = "GET";
                request.CookieContainer = myCookieContainer1;
                CookiesContainer = myCookieContainer1;
                HttpWebResponse response = null;
                using (WebResponse wr = request.GetResponse())
                {
                    response = wr as HttpWebResponse;
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                        // 开始读取数据
                        Char[] sReaderBuffer = new Char[256];
                        int count = sReader.Read(sReaderBuffer, 0, 256);
                        while (count > 0)
                        {
                            String tempStr = new String(sReaderBuffer, 0, count);
                            content.Append(tempStr);
                            count = sReader.Read(sReaderBuffer, 0, 256);
                        }
                        // 读取结束
                        sReader.Close();
                    }
                }
 
                JObject job = (JObject)JsonConvert.DeserializeObject(content.ToString());
 
                //Console.WriteLine("================获取通讯录是的CookieList================================");
                //Console.WriteLine(GetAllCookies(myCookieContainer1));
                //Console.WriteLine("================================================");
                return job;
            }
            catch (Exception ex)
            {
}
}

获取到通讯录信息为一个json 字符串可自行解析。

   信息如下:

{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"Count": 3,
"ContactList": [{
"Uin": 0,
"UserName": "@@01aea33427c286a7b577444df4eac4b41178eaeb3db784eb1ed434b2bfc80cff",
"NickName": "大狗子",
"HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=615460722&username=@@01aea33427c286a7b577444df4eac4b41178eaeb3db784eb1ed434b2bfc80cff&skey=",
"ContactFlag": 1,
"MemberCount": 129,
"MemberList": [{
"Uin": 0,
"UserName": "@2ed30e16babab19ab60198619e82bd02",
"NickName": "雪儿|ä¹èŠ³èˆžä¼ åª’",
"AttrStatus": 2151794919,
"PYInitial": "",
"PYQuanPin": "",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"MemberStatus": 0,
"DisplayName": "",
"KeyWord": "lix"
}
,{
"Uin": 0,
"UserName": "@d01b4a2bbcbc1e44fe0be53e1c71d14bdfdf64ec0289e9f0becd7862eea4a81c",
"NickName": "二狗子",
"AttrStatus": 235965,
"PYInitial": "",
"PYQuanPin": "",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"MemberStatus": 0,
"DisplayName": "",
"KeyWord": ""
}
,{
"Uin": 0,
"UserName": "@df308c250ab3dbdf21d8b46ed97386b9eef70eaa2240b7ba05d77d4566319b14",
"NickName": "三狗子",
"AttrStatus": 233509,
"PYInitial": "",
"PYQuanPin": "",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"MemberStatus": 0,
"DisplayName": "",
"KeyWord": ""
}
,{
"Uin": 0,
"UserName": "@1d324615827361ab3e17ebb276c8e2476fe924a12caae99c528daee449bff527",
"NickName": "四狗子",
"AttrStatus": 2164265061,
"PYInitial": "",
"PYQuanPin": "",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"MemberStatus": 0,
"DisplayName": "",
"KeyWord": ""
}
,{
"Uin": 0,
"UserName": "@b1bf531545704729d422b953fdebd72e5e86441fda3f838e3d7d297eaa0d2e84",
"NickName": "五狗子",
"AttrStatus": 4133,
"PYInitial": "",
"PYQuanPin": "",
"RemarkPYInitial": "",
"RemarkPYQuanPin": "",
"MemberStatus": 0,
"DisplayName": "",
"KeyWord": ""
}

]
}

 

 

 

 

 

 

 

出处:https://blog.youkuaiyun.com/u010919083/article/category/7219618

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值