Skip to content

Commit

Permalink
updated 模块化管理
Browse files Browse the repository at this point in the history
  • Loading branch information
mumuy committed Jul 31, 2024
1 parent da86f10 commit b240cde
Show file tree
Hide file tree
Showing 114 changed files with 1,791 additions and 1,274 deletions.
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@
```js
var browser = require("browser-tool");

// 同步获取信息
console.log(browser());
// 解析User-Agent
let info = browser.parse('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0');

// 异步获取信息(结果更为全面)
browser.getInfo().then(console.log);
// 获取浏览器详细信息 - 指定字段:'browser','engine','system','device','gpu','network','battery','screen','language','timezone'
let networkInfo = await browser.getInfo(['network']);

// 获取浏览器详细信息 - 全部字段
let info = await browser.getInfo();
```
#### 返回
```js
Expand Down
6 changes: 5 additions & 1 deletion babel.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
module.exports = {
presets: [
'@babel/preset-env'
['@babel/preset-env',{
"targets" : {
"chrome" : "88"
}
}]
],
plugins: [
'@babel/plugin-transform-runtime'
Expand Down
6 changes: 3 additions & 3 deletions dist/browser.min.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions dist/browser.min.mjs

Large diffs are not rendered by default.

767 changes: 467 additions & 300 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "browser-tool",
"version": "1.2.8",
"version": "1.3.0",
"description": "Useragent analysis tool.",
"author": "HaoLe Zheng",
"license": "MIT",
Expand Down
82 changes: 35 additions & 47 deletions src/browser.js
Original file line number Diff line number Diff line change
@@ -1,56 +1,44 @@
import browserLoader from './module/browser-loader.js';
import deviceLoader from './module/device-loader.js';
import engineLoader from './module/engine-loader.js';
import systemLoader from './module/system-loader.js';
import deviceLoader from './module/device-loader.js';
import gpuLoader from './module/gpu-loader.js';
import languageLoader from './module/language-loader.js';
import networkLoader from './module/network-loader.js';
import batterykLoader from './module/battery-loader.js';
import otherLoader from './module/other-loader.js';
import globalObject from './module/runtime/globalThis.js';

import wrapperPromise from './module/method/wrapperPromise.js';

let getInfo = function(userAgent,isAsync = false){
let info = {};
info.userAgent = userAgent || globalObject?.navigator?.userAgent||'';
[
browserLoader,
deviceLoader,
engineLoader,
systemLoader,
gpuLoader,
languageLoader,
networkLoader,
batterykLoader,
otherLoader
].forEach(loader=>loader(info,isAsync));
return info;
}
import batteryLoader from './module/battery-loader.js';
import screenLoader from './module/screen-loader.js';
import languageLoader from './module/language-loader.js';
import timezoneLoader from './module/timezone-loader.js';

// 旧版同步获取
function browser(userAgent){
let info = getInfo(userAgent);
for(let key in info){
if(typeof info[key]=='object'){
info[key] = '';
export default {
parse(ua){
let data = {};
[
browserLoader,
engineLoader,
systemLoader,
deviceLoader,
].forEach(loader=>{
data = Object.assign(data,loader.parse(ua));
});
return data;
},
async getInfo(list = ['browser','engine','system','device','gpu','network','battery','screen','language','timezone']){
let data = {};
let loaderList = [
browserLoader,
engineLoader,
systemLoader,
deviceLoader,
gpuLoader,
networkLoader,
batteryLoader,
screenLoader,
languageLoader,
timezoneLoader
].filter(loader=>list.includes(loader.name));
for(let loader of loaderList){
data = Object.assign(data,await loader.getInfo());
}
return data;
}
return info;
}

// 新版异步获取
browser.getInfo = function(userAgent){
let info = getInfo(userAgent,true);
let keys = Object.keys(info);
let all_promise = wrapperPromise(Object.values(info));
return Promise.all(all_promise).then(list=>{
let result = {};
list.forEach(function(value,index){
result[keys[index]] = value;
});
return result;
});
};

export default browser;
36 changes: 23 additions & 13 deletions src/module/battery-loader.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
import _globalThis from './runtime/globalThis.js';
import globalThis from './runtime/globalThis.js';

export default function(_){
if(_globalThis?.navigator?.getBattery){
_.isCharging = _globalThis.navigator.getBattery().then((battery) => {
return battery?.charging;
});
_.battery = _globalThis.navigator.getBattery().then((battery) => {
return +battery?.level||-1;
});
}else{
_.isCharging = true;
_.battery = 1;
export default {
name:'battery',
parse(){
return {};
},
async getInfo(){
let isCharging = true;
let battery = 1;
if(globalThis?.navigator?.getBattery){
isCharging = await globalThis.navigator.getBattery().then((battery) => {
return battery?.charging;
});
battery = await globalThis.navigator.getBattery().then((battery) => {
return +battery?.level||-1;
});
}

return {
isCharging,
battery
};
}
};
}
125 changes: 75 additions & 50 deletions src/module/browser-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,62 +69,87 @@ import _YisouSpider from './browser/YisouSpider.js';
import _YodaoBot from './browser/YodaoBot.js';
import _YandexBot from './browser/YandexBot.js';

import wrapperPromise from './method/wrapperPromise.js';
import userAgent from './runtime/userAgent.js';

export default function(_,isAsync = false){
let ua = _.userAgent;
let browserList = [_Safari, _Chrome, _Edge, _IE, _Firefox, _Firefox_Focus, _Chromium, _Opera, _Opera_GX, _Vivaldi, _Yandex, _Brave, _Arora, _Lunascape, _QupZilla, _Coc_Coc, _Kindle, _Iceweasel, _Konqueror, _Iceape, _SeaMonkey, _Epiphany, _Huawei, _OPPO, _Vivo, _Xiaomi, _Meizu, _OnePlus, _Samsung, _360, _360EE, _360SE, _360EE_macOS, _360AI, _360AI_macOS, _360ENT, _UC, _QQBrowser, _QQ, _Baidu, _Maxthon, _Sogou, _Liebao, _2345Explorer, _115Browser, _TheWorld, _Quark, _Qiyu, _Lenovo, _Wechat, _WechatWork, _Taobao, _Alipay, _Weibo, _Douban, _Suning, _iQIYI, _DingTalk, _Douyin, _Toutiao, _Googlebot, _Baiduspider, _Sogouspider, _Bingbot, _360Spider, _Bytespider, _YisouSpider, _YodaoBot, _YandexBot];

_.browser = '';
_.browserVersion = '';
let loaderList = [_Safari, _Chrome, _Edge, _IE, _Firefox, _Firefox_Focus, _Chromium, _Opera, _Opera_GX, _Vivaldi, _Yandex, _Brave, _Arora, _Lunascape, _QupZilla, _Coc_Coc, _Kindle, _Iceweasel, _Konqueror, _Iceape, _SeaMonkey, _Epiphany, _Huawei, _OPPO, _Vivo, _Xiaomi, _Meizu, _OnePlus, _Samsung, _360, _360EE, _360SE, _360EE_macOS, _360AI, _360AI_macOS, _360ENT, _UC, _QQBrowser, _QQ, _Baidu, _Maxthon, _Sogou, _Liebao, _2345Explorer, _115Browser, _TheWorld, _Quark, _Qiyu, _Lenovo, _Wechat, _WechatWork, _Taobao, _Alipay, _Weibo, _Douban, _Suning, _iQIYI, _DingTalk, _Douyin, _Toutiao, _Googlebot, _Baiduspider, _Sogouspider, _Bingbot, _360Spider, _Bytespider, _YisouSpider, _YodaoBot, _YandexBot];
loaderList.forEach(item=>{
if(!item.is){
item.is = async function(){
return item.parse().is;
};
}
if(!item.version){
item.version = async function(){
return item.parse().version;
};
}
});

if(isAsync){
let all_promise = wrapperPromise(browserList.map(item=>item.match(ua,isAsync)));
_.browser = Promise.all(all_promise).then(function(list){
let browser = '';
list.forEach(function(isMatch,index){
if(isMatch){
browser = browserList[index].name;
}
});
// 修正
if(browser == 'Chrome'&&ua.match(/\S+Browser/)){
browser = ua.match(/\S+Browser/)[0];
export default {
name:'browser',
parse(ua = userAgent){
let browser = '';
let browserVersion = '';
loaderList.forEach(function(item){
if(item.parse(ua).is){
browser = item.name;
browserVersion = item.parse(ua).version;
}
return browser;
});
_.browserVersion = Promise.all(all_promise).then(function(list){
let browser = '';
let version = '';
list.forEach(function(isMatch,index){
if(isMatch){
browser = browserList[index].name;
version = browserList[index].version(ua);
}
});
// 修正
if(browser == 'Chrome'&&ua.match(/\S+Browser/)){
version = ua.replace(/^.*Browser\/([\d.]+).*$/)?.[1]||'';
}
if(!version){
version = ua.match(/Version\/([\d.]+)/)?.[1]||'';
}
return version;
});
}else{
browserList.forEach(function(item){
if(item.match(ua,isAsync)){
_.browser = item.name;
_.browserVersion = item.version(ua,isAsync);

// 修正
if(browser == 'Chrome'&&ua.match(/\S+Browser/)){
browser = ua.match(/\S+Browser/)[0];
}
if(browser == 'Chrome'&&ua.match(/\S+Browser/)){
browserVersion = ua.replace(/^.*Browser\/([\d.]+).*$/)?.[1]||'';
}
if(!browserVersion){
browserVersion = ua.match(/Version\/([\d.]+)/)?.[1]||'';
}

let isWebview = ua.includes('; wv)');
let isRobot = ['Googlebot', 'Baiduspider', 'Sogouspider', 'Bingbot', '360Spider', 'Bytespider', 'YandexBot'].includes(browser);

return {
browser,
browserVersion,
isWebview,
isRobot
};
},
async getInfo(){
let {
browser,
browserVersion,
isWebview,
isRobot
} = this.parse();
for(let loader of loaderList){
if(await loader.is()){
browser = loader.name;
browserVersion = await loader.version();
}
});
}

// 修正
if(_.browser == 'Chrome'&&ua.match(/\S+Browser/)){
_.browser = ua.match(/\S+Browser/)[0];
_.browserVersion = ua.replace(/^.*Browser\/([\d.]+).*$/)?.[1]||'';
let ua = userAgent;
if(browser == 'Chrome'&&ua.match(/\S+Browser/)){
browser = ua.match(/\S+Browser/)[0];
}
if(browser == 'Chrome'&&ua.match(/\S+Browser/)){
browserVersion = ua.replace(/^.*Browser\/([\d.]+).*$/)?.[1]||'';
}
if(!_.browserVersion){
_.browserVersion = ua.match(/Version\/([\d.]+)/)?.[1]||'';
if(!browserVersion){
browserVersion = ua.match(/Version\/([\d.]+)/)?.[1]||'';
}

return {
browser,
browserVersion,
isWebview,
isRobot,
userAgent:ua
};
}
};
}
14 changes: 8 additions & 6 deletions src/module/browser/115Browser.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import userAgent from '../runtime/userAgent.js';

export default {
name:'115Browser',
match(ua){
return ua.includes('115Browser');
},
version(ua){
return ua.match(/115Browser\/([\d.]+)/)?.[1]||'';
parse(ua = userAgent){
return {
is:ua.includes('115Browser'),
version:ua.match(/115Browser\/([\d.]+)/)?.[1]||''
};
}
};
}
36 changes: 21 additions & 15 deletions src/module/browser/2345Explorer.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
import _Chrome from './Chrome.js';
import _globalThis from '../runtime/globalThis.js';
import userAgent from '../runtime/userAgent.js';
import globalThis from '../runtime/globalThis.js';

export default {
name:'2345Explorer',
match(ua){
let isMatch = _globalThis?.chrome&&(_globalThis?.chrome?.adblock2345||_globalThis?.chrome?.common2345);
return ua.includes('2345Explorer')
||ua.includes('Mb2345Browser')
||ua.includes('2345chrome')
||isMatch;
},
version(ua){
parse(ua = userAgent){
let hash = {
'109':'13.0',
'69':'10.0',
'55':'9.9'
};
let chrome_version = parseInt(_Chrome.version(ua));
return ua.match(/2345Explorer\/([\d.]+)/)?.[1]
||ua.match(/Mb2345Browser\/([\d.]+)/)?.[1]
||hash[chrome_version]
||'';
let chrome_version = parseInt(_Chrome.parse(ua).version);
return {
is:ua.includes('2345Explorer')
||ua.includes('Mb2345Browser')
||ua.includes('2345chrome'),
version:ua.match(/2345Explorer\/([\d.]+)/)?.[1]
||ua.match(/Mb2345Browser\/([\d.]+)/)?.[1]
||hash[chrome_version]
||''
};
},
async is(){
let isMatch = this.parse().is;
if(!isMatch){
isMatch = globalThis?.chrome&&(globalThis?.chrome?.adblock2345||globalThis?.chrome?.common2345);
}
return isMatch;
}
};
}
Loading

0 comments on commit b240cde

Please sign in to comment.