改变所述web浏览器控件的用户代理
-
06-09-2019 - |
题
我试图改变一个应用程序的Winforms web浏览器控件的用户代理。
我已经成功通过使用以下代码来实现这一点:
[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()方法,第二次它不工作。它保持设定为第一个变化值。这是很烦人的,我已经试过各种方法,但它只是不会改变一次以上。
没有人知道不同的,更灵活的方法的?
由于
解决方案
我不知道我是否应该只是复制/粘贴从的网站,但我宁愿离开这里的答案,而不是链接。如果任何人都可以在留言澄清,我将非常感激。
基本上,必须扩展web浏览器类。
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}\r\n", UserAgent);
renavigating = true;
cancel = true;
Navigate((string)url, (string)targetFrameName, (byte[])postData, (string)headers);
}
else
{
renavigating = false;
}
}
}
}
请注意:要使用上面的方法,你将需要一个COM引用添加到“Microsoft Internet控制”
他提到你的方法太,并指出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阿泽帕迪的答案。
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}\r\n", UserAgent);
}
这个解决方案工作最适合我。使用renavigating引起其他奇怪的问题对我来说,就像浏览器内容突然消失,有时还让不支持浏览器。利用这种技术,在提琴手所有请求具有正确的用户代理。
不隶属于 StackOverflow