用户代理检测与浏览器Ua详细分析

Opera

Opera(欧朋)浏览器也算得上是浏览器界的一朵奇葩了

在Opera 12.16之前,它有着自己的内核Presto /'prestəʊ/

而之后,Opera改用Google Chrome的Blink内核(同样基于WebKit)

几近沦为一款套壳浏览器

虽然根据上文数据,Opera浏览器在国内的市场份额几乎可以忽略不计(被归入了“其它”范畴)

但据说其在欧洲市场还是有相当的人气,而且有着不同寻常的过去(自有内核)

所以本文还是将Opera单独分析

Opera 9.6

Opera/9.64 (Windows NT 6.0; U; Edition IBIS; zh-cn) Presto/2.1.1

Opera 12.15

Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.15

Opera 26

Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60

从以上测试和书本介绍可以知道,在Opera 9之前,其默认的用户代理字符串是所有现代浏览器中最合理的

没有任何伪装,且正确地标识了自身及其版本号

可是,因为因特网上不少浏览器嗅探代码只钟情于报告Mozilla产品名的那些Ua或只对IE和Gecko感兴趣

Opera没有伪装的Ua可能令某些站点的兼容性出现问题

于是,Opera就开始变奇葩了......

Opera 9以后,出现了两种修改用户代理字符串的方式

第一种方式是,针对某些站点,将自身表示为另外一个浏览器,只不过在末尾追加Opera品牌和版本信息,如下为例

Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50

第二种方式是,针对某些站点,直接隐瞒身份,Ua与其它浏览器返回的相同

注意,这些奇葩行为都是针对某些站点的,这令用户代理检测识别Opera难上加难

不过,通过以上亲测,还是可以总结出正常情况下Opera的Ua的一些特点

Opera 9.8之前,Ua开头的“Opera/”字段正确标识出了浏览器品牌和版本信息;

Opera 9.8-12.15中,Ua开头固定为“Opera/9.8,但有通过“Version”字段正确标识版本信息;

Opera 12.15之前,一直有通过Presto字段正确地标识Presto内核及其版本信息;

Opera 12.16后,因为使用了Blink(WebKit)内核,出现“AppleWebKit”字段正确标识内核及内核版本信息,同时出现“Chrome”、“Safari”、“(KHTML, like Gecko)”伪装字段;

使用了Blink(Webkit)内核后,Ua末尾通过“OPR”字段标识浏览器品牌及版本信息;

一直有正确标识所在操作系统信息。

此外,Opera 5+独家支持通过window.opera探测浏览器版本等信息

尽管无法通过用户代理检测获得隐瞒身份状态下的Opera信息

但还是可以根据以上规律,使用以下代码检测正常情况下Opera的Ua信息

/*以下代码作用为判断与分析Opera浏览器Ua信息*/

if(/AppleWebKit\/(\S+)/.test(ua)){ //匹配Webkit内核浏览器(Chrome、Safari、新Opera)

engine.ver=RegExp["$1"];

engine.webkit=parseFloat(engine.ver);

//...

}else if(window.opera){ //只匹配拥有Presto内核的老版本Opera 5+(12.15-)

engine.ver=browser.ver=window.opera.version();

engine.presto=browser.opera=parseFloat(engine.ver);

}else if(/Opera[\/\s](\S+)/.test(ua)){ //匹配不支持window.opera的Opera 5-或伪装的Opera

engine.ver=browser.ver=RegExp["$1"];

engine.presto=browser.opera=parseFloat(engine.ver);

}

//...