• 更改WebBrowser控件的用户代理


    我试图在Winforms应用程序中更改WebBrowser控件的UserAgent。 我已成功使用以下代码实现此目的: 
    [DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
    private static extern int UrlMkSetSessionOption(
        int dwOption, string pBuffer, int dwBufferLength, int dwReserved);
    
    const int URLMON_OPTION_USERAGENT = 0x10000001;
    
    public void ChangeUserAgent()
    {
        List<string> userAgent = new List<string>();
        string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";
    
        UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
    }
    
    唯一的问题是这只能工作一次。当我尝试第二次运行ChangeUserAgent()方法时,它不起作用。它保持设置为第一个更改的值。这很烦人,我已经尝试了一切,但它不会改变不止一次。 有谁知道一种不同的,更灵活的方法? 谢谢     
    我不确定是否应该从网站上复制/粘贴,但我宁愿在这里留下答案,而不是链接。如果有人可以在评论中澄清,我将非常感激。 基本上,您必须扩展WebBrowser类。 
    public class ExtendedWebBrowser : WebBrowser
    {
        bool renavigating = false;
    
        public string UserAgent { get; set; }
    
        public ExtendedWebBrowser()
        {
            DocumentCompleted += SetupBrowser;
    
            //this will cause SetupBrowser to run (we need a document object)
            Navigate("about:blank");
        }
    
        void SetupBrowser(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            DocumentCompleted -= SetupBrowser;
            SHDocVw.WebBrowser xBrowser = (SHDocVw.WebBrowser)ActiveXInstance;
            xBrowser.BeforeNavigate2 += BeforeNavigate;
            DocumentCompleted += PageLoaded;
        }
    
        void PageLoaded(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
    
        }
    
        void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
            ref object postData, ref object headers, ref bool cancel)
        {
            if (!string.IsNullOrEmpty(UserAgent))
            {
                if (!renavigating)
                {
                    headers += string.Format("User-Agent: {0}rn", UserAgent);
                    renavigating = true;
                    cancel = true;
                    Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
                }
                else
                {
                    renavigating = false;
                }
            }
        }
    }
    
    注意:要使用上述方法,您需要向“Microsoft Internet Controls”添加COM引用。 他也提到了你的方法,并声明WebBrowser控件似乎缓存了这个用户代理字符串,因此它不会在不重新启动进程的情况下更改用户代理。     

    佬棠

     

    最简单的方法: 
    webBrowser.Navigate("http://localhost/run.php", null, null,
                        "User-Agent: Here Put The User Agent");
    
        
    此外,该功能还有一个刷新选项(根据MSDN)。它适用于我(你应该在任何用户代理更改之前设置它)。然后问题代码可以像这样改变: 
    [DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
    private static extern int UrlMkSetSessionOption(
        int dwOption, string pBuffer, int dwBufferLength, int dwReserved);
    
    const int URLMON_OPTION_USERAGENT = 0x10000001;
    const int URLMON_OPTION_USERAGENT_REFRESH = 0x10000002;
    
    public void ChangeUserAgent()
    {
        string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";
    
        UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, null, 0, 0);
        UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
    }
    
        
    我想补充@Jean Azzopardi的答案。 
    void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
            ref object postData, ref object headers, ref bool cancel)
    {
        // This alone is sufficient, because headers is a "Ref" parameters, and the browser seems to pick this back up.
        headers += string.Format("User-Agent: {0}rn", UserAgent);
    }
    
    这个解决方案最适合我。使用renavigating给我带来了其他奇怪的问题,比如浏览器内容突然消失,有时仍然得到不支持的浏览器。使用这种技术,Fiddler中的所有请求都具有正确的用户代理。     
  • 相关阅读:
    2.如何搭建MQTT环境
    1.如何安装maven
    4.线程同步-未使用线程同步的生产者/消费者关系
    3.线程的优先级和线程调度
    2.如何使用matlab拟合曲线
    1.如何安装matlab2016a
    2.线程状态:一个线程的声明周期
    Oracle"TNS监听程序找不到符合协议堆栈要求的可用处理程序"解决方案
    快速登录MySQL数据库
    数据仓库模型建设基础及kimball建模方法总结
  • 原文地址:https://www.cnblogs.com/soundcode/p/10261804.html
Copyright © 2020-2023  润新知