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);
}
//...
