转载

UA的秘密

UA的秘密

userAgent,这种大众脸,大家一定不陌生,平时似乎没什么用.

但是当我们需要去了解外网用户时,就会发现,非常有意义。

如果一个用户向你投诉,这个时候。

需要第一时间拿到用户环境去分析问题,于是ua就能派上用场了

请看下面这条ua信息:

Mozilla/5.0(Linux;U;Android5.1.1;zh-cn;SCL-TL00HBuild/HonorSCL-TL00H)AppleWebKit/533.1(KHTML,likeGecko)Version/4.0MQQBrowser/5.4TBS/025477MobileSafari/533.1lolapp/3.9.0.1260lolappcpu/armeabi-v7a

扫一眼,能看出多少信息量呢,在说明之前,我们先看看官方文档吧.下面是谷歌开发者上关于ua的格式说明

WebView on Android

The Android 4.4 (KitKat) Chromium-based WebView adds  Chrome/_version_ to the user agent string.

Old WebView UA:

Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) AppleWebKit/534.30 (KHTML, likeGecko) Version/4.0 Safari/534.30

WebView UA in KitKat to Lollipop

Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) AppleWebKit/537.36 (KHTML,like Gecko) Version/4.0 <strong>Chrome/30.0.0.0 Mobile</strong> Safari/537.36

https://developer.chrome.com/multidevice/user-agent

大部分厂商,实现的ua描述都和以上一样样,但且看下方安卓webview设置ua的api描述

public abstract void setUserAgentString ( String ua)

Added in API level 3

Sets the WebView's user-agent string. If the string is null or empty, the system default value will be used. Note that starting from KITKAT Android version, changing the user-agent while loading a web page causes WebView to initiate loading once again.

Parameters

ua new user-agent string

调用此方法,可以随意设置自己的个性ua.

所以也有些个性厂商出现,例如下方把自己的厂商品牌放最前面..这种可分析度就不太高,不过幸好量并不大

ZTE U985_TD/1.0Linux/3.1.10Android/4.0Release/8.1.2012Browser/AppleWebKit534.30V1_AND_SQ_5.4.0_218_YYB_DQQ/5.4.1.2395NetType/3G

然后,我们再回头看看开头的ua上包含了多少信息:

大致扫一眼,我会知道,这个人是中文安卓5.1.1 (Android 5.1.1, zh-cn),机型是华为荣耀SCL-TL00H(Build/HonorSCL-TL00H),这些是约定中可看出的数据

再看后面的信息. MQQBrowser/5.4 表示是QQ浏览器,版本5.4, Moblie后面则可以看出

Safari/533.1lolapp/3.9.0.1260这是LOLapp 大概是掌上英雄联盟?/软件版本 

lolappcpu/armeabi-v7a然后是设备CPU类型,armeabi-v7a;

因为是自定义的,所以每个不同的app在ua上带的信息量大小是不同的.再来看一个

Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 V1_AND_SQ_5.9.1_272_YYB_D QQ/5.9.1.2535 NetType/WIFI WebP/0.3.1 Pixel/720

这个,可以看出基本信息外,能知道,用户是在用WIFI上网 NetType/WIFI , 且屏幕分辨率是 Pixel/720,使用的软件是应用宝V1_AND_SQ_5.9.1_272_YYB_D,机型百度一下JRO03L,发现是小米2s..

好了,基本结构已经介绍完了,接下来看下如何用代码将所需内容提取出来

/**

* [一个非常简版的ua分析器]

*/

(function(){

/**

* [plate_reg description]

* @type {RegExp}

* 安卓和IOS的版本判断,

* 安卓的版本分割用的点","IOS都用的"_“

* 可以很好的区分平台

*/

function parseUa( ua ){

var ua_array = ua.split('Mobile') ,

result = [“平台信息:”] ,

common = ua_array[0] ,

apps = ua_array[1] ,

tmp_data = [] ,

properkey = "" ,

app_reg = /IPadQQ//[^/s]*|MQQBrowser//[^/s]*|qqnews//[^/s]*|QQJSSDK//[^/s]*|Qzone//[^/s]*|QZONEJSSDK//[^/s]*|QQ//[^/s]*|NetType//[^/s]*|Pixel//[^/s]*|MicroMessenger//[^/s]*|(lol)appcpu//[^/s]*|[^/s]*(YYB)[^/s]*|QQHD/g ,

plate_reg = /Android/s[^;]+|[a-z]{2}-[a-z]{2}|Build//[^/)]*|/d_/d_/d|iPad|iPhone|iPod/g ,

/**

* [app_map description]

* @type {Object}

* 需要做解释和检测的,appua信息

*/

app_map = {

IPadQQ : "IPadQQ" ,

MQQBrowser : "QQ浏览器" ,

qqnews : "腾讯新闻" ,

QQJSSDK : "QJS" ,

Qzone : "Qzone" ,

QZONEJSSDK : "QZONEJSSDK" ,

QQ : "QQ" ,

MicroMessenger : "微信" ,

YYB : "应用宝" ,

lol : "掌上英雄联盟"

} ,

common_map = {

Android : "安卓" ,

};

while( tmp_data = plate_reg.exec( common ) ){

result.push( tmp_data[0] );

}

result.push("应用信息:");

while( tmp_data = app_reg.exec( apps ) ){

properkey = tmp_data[1] || tmp_data[0] ;

result.push( app_map[properkey] || properkey );

}

return result.join(' ');

}    

var format_str = parseUa( 'Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; SCL-TL00H Build/HonorSCL-TL00H) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.4 TBS/025477 Mobile Safari/533.1lolapp/3.9.0.1260 lolappcpu/armeabi-v7a' );

console.log( format_str );

})();

正文到此结束
Loading...