C# 实时快速更改用户代理
我正在我的C# 实时快速更改用户代理,c#,winforms,cefsharp,C#,Winforms,Cefsharp,我正在我的Winform项目中使用CefSharp,我只想更改特定浏览器的用户代理 我通过使用自定义IRequestHandler并在其中设置用户代理来实现这一点: class IGRequestHandler : IRequestHandler { public bool CanGetCookies(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request) {
Winform
项目中使用CefSharp
,我只想更改特定浏览器的用户代理
我通过使用自定义IRequestHandler
并在其中设置用户代理来实现这一点:
class IGRequestHandler : IRequestHandler
{
public bool CanGetCookies(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
{
return true;
}
public bool CanSetCookie(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, Cookie cookie)
{
return true;
}
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 IResponseFilter GetResourceResponseFilter(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return null;
}
public bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
return false;
}
public CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
var headers = request.Headers;
headers["User-Agent"] = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1";
request.Headers = headers;
return CefReturnValue.Continue;
}
public bool OnCertificateError(IWebBrowser chromiumWebBrowser, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
{
callback.Dispose();
return false;
}
public bool OnOpenUrlFromTab(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
{
return false;
}
public void OnPluginCrashed(IWebBrowser chromiumWebBrowser, IBrowser browser, string pluginPath)
{
}
public bool OnProtocolExecution(IWebBrowser chromiumWebBrowser, IBrowser browser, string url)
{
return false;
}
public bool OnQuotaRequest(IWebBrowser chromiumWebBrowser, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
{
callback.Dispose();
return false;
}
public void OnRenderProcessTerminated(IWebBrowser chromiumWebBrowser, IBrowser browser, CefTerminationStatus status)
{
}
public void OnRenderViewReady(IWebBrowser chromiumWebBrowser, IBrowser browser)
{
}
public void OnResourceLoadComplete(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
{
}
public void OnResourceRedirect(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response, ref string newUrl)
{
}
public bool OnResourceResponse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IResponse response)
{
return false;
}
public bool OnSelectClientCertificate(IWebBrowser chromiumWebBrowser, IBrowser browser, bool isProxy, string host, int port, System.Security.Cryptography.X509Certificates.X509Certificate2Collection certificates, ISelectClientCertificateCallback callback)
{
callback.Dispose();
return false;
}
}
当我加载这个页面时,我仍然会得到网站的常规版本,而不是移动版本
当我使用以下命令更改useragent时:
var settings = new CefSettings();
settings.CachePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\CEF";
settings.IgnoreCertificateErrors = true;
settings.WindowlessRenderingEnabled = true;
settings.SetOffScreenRenderingBestPerformanceArgs();
settings.UserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1";
Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
我正在获取移动版,但我希望实时完成,而不是针对每个浏览器
以下是我实现浏览器的方式:
instaBrowser = new ChromiumWebBrowser("");
instaBrowser.RequestHandler = new IGRequestHandler();
instaBrowser.Dock = DockStyle.Fill;
instaBrowser.FrameLoadEnd += webViewFrameLoadEnd;
instaBrowser.LoadError += getFromBrowser_LoadError;
instaBrowser.BrowserSettings.Plugins = CefState.Disabled;
instaBrowser.BrowserSettings.WebGl = CefState.Disabled;
instaBrowser.BrowserSettings.RemoteFonts = CefState.Disabled;
instaBrowser.BrowserSettings.WindowlessFrameRate = 1;
instaBrowser.JsDialogHandler = new JsDialogHandler();
instaPanel.Controls.Add(instaBrowser);
这真的很痛苦,但似乎:
browser.GetDevToolsClient().Emulation.SetUserAgentOverrideAsync("");
即使已创建浏览器对象,也会成功更改useragent
例如,我有一个方法,处理“OnIsBrowserInitializedChanged”事件:
当我这样做的时候:
browser = new ChromiumWebBrowser("https://www.whatismybrowser.com/detect/what-is-my-user-agent");
该站点显示的字符串与我输入的字符串完全相同。主题之前已经讨论过很多次,请参阅GetDevToolsClient返回一个实现IDisposable的实例,因此应该包装在using块中或手动调用dispose。您需要使用版本85或更高版本才能使用它。非常好,谢谢。我很快在中添加了一个指向此答案的链接
browser = new ChromiumWebBrowser("https://www.whatismybrowser.com/detect/what-is-my-user-agent");