代码之家  ›  专栏  ›  技术社区  ›  YosiFZ

实时更改用户代理

  •  0
  • YosiFZ  · 技术社区  · 7 年前

    CefSharp 在我的 Winform Project和我只想更改特定浏览器的用户代理。

    我是用定制的 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);
    
    0 回复  |  直到 7 年前
        1
  •  2
  •   jonas dufek    5 年前

    这真的很痛苦,但似乎:

    browser.GetDevToolsClient().Emulation.SetUserAgentOverrideAsync("");
    

    例如,我有一个方法,它处理“OnIsBrowserInitializedChanged”事件:

        private void OnIsBrowserInitializedChanged(object sender, EventArgs e)
        {
            using (DevToolsClient DTC = browser.GetDevToolsClient()) {
                DTC.Emulation.SetUserAgentOverrideAsync("Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; SCH-I535 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30");
            }
        }
    

    当我这么做的时候:

    browser = new ChromiumWebBrowser("https://www.whatismybrowser.com/detect/what-is-my-user-agent");
    

    该网站显示的字符串与我输入的完全相同。

    推荐文章