您的位置:首页 > 其它

VC 中使用 WebBrowser 控件时自定义 User-Agent 的方法

2016-04-01 15:37 549 查看
User-Agent 是客户端浏览器等应用程序在使用 HTTP 协议访问网站时,发送给网站服务器的一个标识,能够告知网站服务器浏览器类型、操作系统版本、浏览器渲染引擎等信息。

有时候我们在 VC 中使用 WebBrowser 控件时,希望该控件在访问网站时能使用自定义的 User-Agent,这样网站服务器就能够收集访问请求,根据 User-Agent 值的不同判断出哪些访问来自我们自己开发的、用到 WebBrowser 控件的应用程序,哪些来自普通的常用浏览器软件。

VC 中使用 WebBrowser 控件时自定义 User-Agent 的方法至少有以下两种。

第一种方法(有局限性):

WebBrowser 控件的 Navigate 方法定义如下:

void Navigate(LPCTSTR URL, VARIANT * Flags, VARIANT * TargetFrameName, VARIANT * PostData, VARIANT * Headers);

该方法用到的最后一个参数可以用来修改 User-Agent 的默认值,难点在于它并不是一个简单的字符串类型的变量,而是一个 VARIANT 类型的指针。要把 User-Agent 的值用 VARIANT 类型的变量来表达出来,需要做一些转换工作,可以参考以下示例代码片段:

/* 设置 HTTP 头中的 User-Agent 字段 */
char UserAgentVal[] = "User-Agent:MyCustomizedBrowser"; /* 假定要将 User-Agent 的值设为 MyCustomizedBrowser */
char VisitUrl[] = "http://www.baidu.com"; /* 假定要用 WebBrowser 控件显示百度主页 */

_bstr_t bstrVal(UserAgentVal);
VARIANT varString;
varString.vt = VT_BSTR;
varString.bstrVal = bstrVal;
MsWebBrowser.Navigate(VisitUrl, NULL, NULL, NULL, &varString); /* MsWebBrowser是 WebBrowser 控件对应变量的名字,因程序而异 */


当执行到 WebBrowser 控件的 Navigate 方法时,就会在访问百度主页时使用值 User-Agent:MyCustomizedBrowser 。如果我们使用 WireShark 工具抓取 HTTP 包,可以看到类似下图的结果:



使用本方法有局限性,只是在程序执行到使用 WebBrowser 控件的 Navigate 方法时,会使用设定的 User-Agent 值,但是如果用户在打开的网页上点击链接,跳转到其他网页时,接下来就不再使用自定义的 User-Agent 值,而是 IE 中设置的值,比如在安装 IE11 的 64 位 Win7上,接下来使用的 User-Agent 值类似于如下值:

User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; ......)

第二种方法:

要想在使用 WebBrowser 控件连续访问多个页面时,一直使用设定的 User-Agent 值,需要用到 urlmon.dll 中的 UrlMkSetSessionOption( ) 函数,MSDN 网站上介绍这个函数的网页链接为:
https://msdn.microsoft.com/en-us/library/ms775125(VS.85).aspx
这个函数的定义为:

STDAPI UrlMkSetSessionOption(DWORD dwOption, __in_bcount_opt(dwBufferLength) LPVOID pBuffer, DWORD dwBufferLength, __reserved DWORD dwReserved);

使用这个函数时,需要使用指令 #include "UrlMon.h" 来包含头文件。可以参考以下示例代码片段:

char UserAgentVal[] = "MyCustomizedBrowser";
char VisitUrl[] = "http://www.baidu.com";
UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, UserAgentVal, (strlen(UserAgentVal) + 1), 0);
MsWebBrowser.Navigate(VisitUrl, NULL, NULL, NULL, NULL);
这样当使用 WebBrowser 控件打开网页时,就会一直使用设定的 User-Agent 值,比如在百度主页点击“贴吧”或“地图”链接,会跳转到对应网站,只要是通过 WebBrowser 访问的网页,User-Agent 值会一直是 MyCustomizedBrowser。用 WireShark 抓取 HTTP 包,可以看到类似下图的结果:



只有通过 WebBrowser 控件的 HTTP 访问,其 User-Agent 才会是我们自定义的值。如果访问网页时,弹出新的IE窗口,由于弹出的窗口一般是用 IE 打开的,所以在对弹出网页的 HTTP 访问请求中,使用的 User-Agent 当然是 IE 默认使用的值,而不是我们自定义的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: