加载网络页面
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