ua-browser 1.3.1 → 1.4.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +228 -0
- package/README.md +95 -85
- package/dist/index.cjs +292 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +120 -17
- package/dist/index.d.ts +120 -17
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +288 -45
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/README.zh-CN.md +0 -200
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
type EngineName = 'Trident' | 'Presto' | 'WebKit' | 'Gecko' | 'KHTML' | 'Blink' | 'EdgeHTML' | 'ArkWeb' | 'unknown';
|
|
2
|
-
type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
|
|
3
|
-
type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
|
|
4
|
-
type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV';
|
|
2
|
+
type BrowserName = 'Safari' | 'Chrome' | 'Arc' | 'Brave' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
|
|
3
|
+
type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'visionOS' | 'tvOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
|
|
4
|
+
type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV' | 'Console' | 'XR' | 'unknown';
|
|
5
5
|
type ArchName$1 = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
6
|
-
type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'GPTBot' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'GenericBot' | 'unknown';
|
|
6
|
+
type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
|
|
7
7
|
interface EnvOption {
|
|
8
8
|
browser: BrowserName;
|
|
9
9
|
version: string;
|
|
10
|
+
versionMajor: number;
|
|
10
11
|
engine: EngineName;
|
|
11
12
|
os: OsName;
|
|
12
13
|
osVersion: string;
|
|
@@ -18,6 +19,7 @@ interface EnvOption {
|
|
|
18
19
|
botName: BotName$1;
|
|
19
20
|
language: string;
|
|
20
21
|
platform: string;
|
|
22
|
+
connectionType: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';
|
|
21
23
|
}
|
|
22
24
|
declare global {
|
|
23
25
|
var chrome: {
|
|
@@ -39,6 +41,25 @@ declare global {
|
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
|
|
44
|
+
type BotName = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
|
|
45
|
+
interface BotDef {
|
|
46
|
+
name: BotName;
|
|
47
|
+
detect: RegExp;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface BotResult {
|
|
51
|
+
isBot: boolean;
|
|
52
|
+
botName: BotName;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Detect whether the UA belongs to a bot, crawler, or spider.
|
|
56
|
+
* Returns the specific bot name when recognised, 'GenericBot' for generic patterns,
|
|
57
|
+
* or 'unknown' for regular user agents.
|
|
58
|
+
*
|
|
59
|
+
* Pass `customDefs` to prepend project-specific bot rules before the GenericBot catch-all.
|
|
60
|
+
*/
|
|
61
|
+
declare function detectBot(ua: string, customDefs?: readonly BotDef[]): BotResult;
|
|
62
|
+
|
|
42
63
|
/**
|
|
43
64
|
* A subset of the Navigator interface that our detectors need.
|
|
44
65
|
* Accepting NavContext as a parameter makes every detector pure and testable.
|
|
@@ -52,6 +73,9 @@ interface NavContext {
|
|
|
52
73
|
mimeTypes?: MimeTypeArray;
|
|
53
74
|
connection?: {
|
|
54
75
|
saveData?: boolean;
|
|
76
|
+
effectiveType?: '4g' | '3g' | '2g' | 'slow-2g';
|
|
77
|
+
rtt?: number;
|
|
78
|
+
downlink?: number;
|
|
55
79
|
};
|
|
56
80
|
userAgentData?: {
|
|
57
81
|
platform: string;
|
|
@@ -76,14 +100,29 @@ interface UAHighEntropyValues {
|
|
|
76
100
|
interface EnvContext extends NavContext {
|
|
77
101
|
webglRenderer?: string;
|
|
78
102
|
webglVendor?: string;
|
|
103
|
+
webglMaxTextureSize?: number;
|
|
104
|
+
webglFragPrecision?: number;
|
|
105
|
+
webglCompressedFormats?: {
|
|
106
|
+
s3tc: boolean;
|
|
107
|
+
pvrtc: boolean;
|
|
108
|
+
etc2: boolean;
|
|
109
|
+
astc: boolean;
|
|
110
|
+
};
|
|
79
111
|
hardwareConcurrency?: number;
|
|
80
112
|
deviceMemory?: number;
|
|
81
113
|
devicePixelRatio?: number;
|
|
114
|
+
screenWidth?: number;
|
|
115
|
+
screenHeight?: number;
|
|
116
|
+
safeAreaInsetTop?: number;
|
|
117
|
+
audioSampleRate?: number;
|
|
118
|
+
hasVibration?: boolean;
|
|
119
|
+
hasDeviceMotion?: boolean;
|
|
82
120
|
pointerType?: 'coarse' | 'fine' | 'none';
|
|
83
121
|
hoverCapability?: boolean;
|
|
84
122
|
fontProbes?: Record<string, boolean>;
|
|
85
123
|
highEntropyData?: UAHighEntropyValues;
|
|
86
124
|
windowsVersion?: string | null;
|
|
125
|
+
hasBrave?: boolean;
|
|
87
126
|
}
|
|
88
127
|
/**
|
|
89
128
|
* Collect all available browser signals into a single EnvContext.
|
|
@@ -99,6 +138,14 @@ interface ParseOptions {
|
|
|
99
138
|
windowsVersion?: string | null;
|
|
100
139
|
/** Full env context from getEnvContext() — supersedes nav and windowsVersion when provided. */
|
|
101
140
|
ctx?: EnvContext;
|
|
141
|
+
/** Additional bot definitions prepended before the GenericBot catch-all. */
|
|
142
|
+
customBotDefs?: readonly BotDef[];
|
|
143
|
+
/**
|
|
144
|
+
* Explicit language override (BCP47, e.g. "zh-CN"). Useful for server-side parsing
|
|
145
|
+
* where the Accept-Language header is available but no browser context exists.
|
|
146
|
+
* Takes precedence over language derived from ctx/nav or UA string.
|
|
147
|
+
*/
|
|
148
|
+
language?: string;
|
|
102
149
|
}
|
|
103
150
|
/**
|
|
104
151
|
* Parse a user agent string into a full browser/OS/engine/device description.
|
|
@@ -119,18 +166,30 @@ declare function parseUA(ua: string, options?: ParseOptions): EnvOption;
|
|
|
119
166
|
*/
|
|
120
167
|
declare function getWindowsVersion(nav: NavContext): Promise<string | null>;
|
|
121
168
|
|
|
122
|
-
|
|
169
|
+
interface BrowserResult {
|
|
170
|
+
browser: BrowserName;
|
|
171
|
+
version: string;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Detect the browser name and version from a user agent string.
|
|
175
|
+
*
|
|
176
|
+
* When multiple BROWSER_DEFS entries match the same UA, the one with
|
|
177
|
+
* the highest `priority` value wins (ties go to the later definition).
|
|
178
|
+
*/
|
|
179
|
+
declare function detectBrowser(ua: string): BrowserResult;
|
|
123
180
|
|
|
124
|
-
interface
|
|
125
|
-
|
|
126
|
-
|
|
181
|
+
interface OsResult {
|
|
182
|
+
os: OsName;
|
|
183
|
+
osVersion: string;
|
|
127
184
|
}
|
|
128
185
|
/**
|
|
129
|
-
* Detect
|
|
130
|
-
*
|
|
131
|
-
*
|
|
186
|
+
* Detect the operating system and its version from a user agent string.
|
|
187
|
+
*
|
|
188
|
+
* @param ua - Raw user agent string
|
|
189
|
+
* @param windowsVersion - Pre-resolved Windows 11/10 string from getWindowsVersion()
|
|
190
|
+
* (avoids the async race condition of the old implementation)
|
|
132
191
|
*/
|
|
133
|
-
declare function
|
|
192
|
+
declare function detectOs(ua: string, windowsVersion?: string | null): OsResult;
|
|
134
193
|
|
|
135
194
|
type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
136
195
|
|
|
@@ -144,6 +203,44 @@ type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
|
144
203
|
*/
|
|
145
204
|
declare function detectArch(ua: string, ctx?: EnvContext): ArchName;
|
|
146
205
|
|
|
206
|
+
/**
|
|
207
|
+
* Detect the rendering engine from a user agent string.
|
|
208
|
+
*
|
|
209
|
+
* @param ua - Raw user agent string
|
|
210
|
+
* @param browser - Pre-detected browser name; auto-detected when omitted
|
|
211
|
+
* @param version - Pre-detected browser version; auto-detected when omitted
|
|
212
|
+
*/
|
|
213
|
+
declare function detectEngine(ua: string, browser?: string, version?: string): EngineName;
|
|
214
|
+
|
|
215
|
+
type DeviceNav = Pick<NavContext, 'platform' | 'maxTouchPoints'> & {
|
|
216
|
+
pointerType?: 'coarse' | 'fine' | 'none';
|
|
217
|
+
hoverCapability?: boolean;
|
|
218
|
+
screenWidth?: number;
|
|
219
|
+
webglRenderer?: string;
|
|
220
|
+
webglMaxTextureSize?: number;
|
|
221
|
+
webglFragPrecision?: number;
|
|
222
|
+
webglCompressedFormats?: {
|
|
223
|
+
s3tc: boolean;
|
|
224
|
+
pvrtc: boolean;
|
|
225
|
+
etc2: boolean;
|
|
226
|
+
astc: boolean;
|
|
227
|
+
};
|
|
228
|
+
safeAreaInsetTop?: number;
|
|
229
|
+
devicePixelRatio?: number;
|
|
230
|
+
hasVibration?: boolean;
|
|
231
|
+
hasDeviceMotion?: boolean;
|
|
232
|
+
connection?: {
|
|
233
|
+
effectiveType?: string;
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Detect the device type from a user agent string.
|
|
238
|
+
*
|
|
239
|
+
* @param ua - Raw user agent string
|
|
240
|
+
* @param nav - Optional nav context; hardware signals take precedence over UA when available
|
|
241
|
+
*/
|
|
242
|
+
declare function detectDevice(ua: string, nav?: DeviceNav): DeviceName;
|
|
243
|
+
|
|
147
244
|
/**
|
|
148
245
|
* Detect whether the UA belongs to a headless or automation-driven browser.
|
|
149
246
|
*
|
|
@@ -161,6 +258,14 @@ declare function detectHeadless(ua: string): boolean;
|
|
|
161
258
|
*/
|
|
162
259
|
declare function isWebview(ua: string): boolean;
|
|
163
260
|
|
|
261
|
+
/**
|
|
262
|
+
* Returns true if every key in `criteria` matches the corresponding value in `info`.
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* satisfies(info, { os: 'iOS', device: 'Mobile' })
|
|
266
|
+
*/
|
|
267
|
+
declare function satisfies(info: EnvOption, criteria: Partial<EnvOption>): boolean;
|
|
268
|
+
|
|
164
269
|
/**
|
|
165
270
|
* The Accept-CH value to send in server responses.
|
|
166
271
|
* After the browser sees this header it will include the corresponding
|
|
@@ -185,11 +290,9 @@ declare function parseHeaders(headers: Record<string, string | string[] | undefi
|
|
|
185
290
|
declare const VERSION: string;
|
|
186
291
|
|
|
187
292
|
/**
|
|
188
|
-
* Detect browser, OS, engine and device information.
|
|
189
|
-
*
|
|
190
|
-
* @param ua - Optional UA string override. Defaults to `navigator.userAgent`.
|
|
293
|
+
* Detect browser, OS, engine and device information from the current browser environment.
|
|
191
294
|
*/
|
|
192
|
-
declare function uaBrowser(
|
|
295
|
+
declare function uaBrowser(): EnvOption;
|
|
193
296
|
declare namespace uaBrowser {
|
|
194
297
|
var detect: (ua?: string) => Promise<EnvOption>;
|
|
195
298
|
var isWebview: typeof isWebview;
|
|
@@ -197,4 +300,4 @@ declare namespace uaBrowser {
|
|
|
197
300
|
var VERSION: string;
|
|
198
301
|
}
|
|
199
302
|
|
|
200
|
-
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA };
|
|
303
|
+
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotDef, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectBrowser, detectDevice, detectEngine, detectHeadless, detectOs as detectOS, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA, satisfies };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
type EngineName = 'Trident' | 'Presto' | 'WebKit' | 'Gecko' | 'KHTML' | 'Blink' | 'EdgeHTML' | 'ArkWeb' | 'unknown';
|
|
2
|
-
type BrowserName = 'Safari' | 'Chrome' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
|
|
3
|
-
type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
|
|
4
|
-
type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV';
|
|
2
|
+
type BrowserName = 'Safari' | 'Chrome' | 'Arc' | 'Brave' | 'IE' | 'Edge' | 'Firefox' | 'Firefox Focus' | 'Firefox Nightly' | 'Chromium' | 'Opera' | 'Vivaldi' | 'Yandex' | 'Samsung Internet' | 'DuckDuckGo' | 'Puffin' | 'Coc Coc' | 'Kindle' | 'Konqueror' | 'SeaMonkey' | 'Epiphany' | '360' | '360EE' | '360SE' | 'UC' | 'QQBrowser' | 'QQ' | 'Baidu' | 'Maxthon' | 'Sogou' | 'Liebao' | '2345Explorer' | '115Browser' | 'TheWorld' | 'XiaoMi' | 'Vivo' | 'Huawei' | 'OPPO' | 'Quark' | 'Qiyu' | 'Wechat' | 'Wechat Miniapp' | 'WechatWork' | 'Taobao' | 'Alipay' | 'Weibo' | 'Douban' | 'Suning' | 'iQiYi' | 'DingTalk' | 'Douyin' | 'Bilibili' | 'Kuaishou' | 'Xiaohongshu' | 'Feishu' | 'Toutiao' | 'JD' | 'Meituan' | 'unknown';
|
|
3
|
+
type OsName = 'Windows' | 'Linux' | 'MacOS' | 'Android' | 'HarmonyOS' | 'OpenHarmony' | 'Ubuntu' | 'FreeBSD' | 'Debian' | 'Windows Phone' | 'BlackBerry' | 'MeeGo' | 'Symbian' | 'iOS' | 'visionOS' | 'tvOS' | 'Chrome OS' | 'WebOS' | 'Tizen' | 'KaiOS' | 'unknown';
|
|
4
|
+
type DeviceName = 'Mobile' | 'Tablet' | 'PC' | 'TV' | 'Console' | 'XR' | 'unknown';
|
|
5
5
|
type ArchName$1 = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
6
|
-
type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'GPTBot' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'GenericBot' | 'unknown';
|
|
6
|
+
type BotName$1 = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
|
|
7
7
|
interface EnvOption {
|
|
8
8
|
browser: BrowserName;
|
|
9
9
|
version: string;
|
|
10
|
+
versionMajor: number;
|
|
10
11
|
engine: EngineName;
|
|
11
12
|
os: OsName;
|
|
12
13
|
osVersion: string;
|
|
@@ -18,6 +19,7 @@ interface EnvOption {
|
|
|
18
19
|
botName: BotName$1;
|
|
19
20
|
language: string;
|
|
20
21
|
platform: string;
|
|
22
|
+
connectionType: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';
|
|
21
23
|
}
|
|
22
24
|
declare global {
|
|
23
25
|
var chrome: {
|
|
@@ -39,6 +41,25 @@ declare global {
|
|
|
39
41
|
}
|
|
40
42
|
}
|
|
41
43
|
|
|
44
|
+
type BotName = 'Googlebot' | 'Bingbot' | 'Baiduspider' | 'Bytespider' | 'YandexBot' | 'DuckDuckBot' | 'Slurp' | 'Sogou' | '360Spider' | 'Applebot-Extended' | 'Applebot' | 'Facebookbot' | 'Twitterbot' | 'LinkedInBot' | 'PinterestBot' | 'Slackbot' | 'Discordbot' | 'TelegramBot' | 'WhatsApp' | 'SemrushBot' | 'AhrefsBot' | 'MJ12bot' | 'PetalBot' | 'ScreamingFrog' | 'DataForSeoBot' | 'GPTBot' | 'OAI-SearchBot' | 'ChatGPT-User' | 'ClaudeBot' | 'PerplexityBot' | 'CCBot' | 'AdsBot' | 'Google-Extended' | 'Meta-ExternalAgent' | 'Amazonbot' | 'Diffbot' | 'cohere-ai' | 'YouBot' | 'UptimeRobot' | 'ia_archiver' | 'GenericBot' | 'unknown';
|
|
45
|
+
interface BotDef {
|
|
46
|
+
name: BotName;
|
|
47
|
+
detect: RegExp;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface BotResult {
|
|
51
|
+
isBot: boolean;
|
|
52
|
+
botName: BotName;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Detect whether the UA belongs to a bot, crawler, or spider.
|
|
56
|
+
* Returns the specific bot name when recognised, 'GenericBot' for generic patterns,
|
|
57
|
+
* or 'unknown' for regular user agents.
|
|
58
|
+
*
|
|
59
|
+
* Pass `customDefs` to prepend project-specific bot rules before the GenericBot catch-all.
|
|
60
|
+
*/
|
|
61
|
+
declare function detectBot(ua: string, customDefs?: readonly BotDef[]): BotResult;
|
|
62
|
+
|
|
42
63
|
/**
|
|
43
64
|
* A subset of the Navigator interface that our detectors need.
|
|
44
65
|
* Accepting NavContext as a parameter makes every detector pure and testable.
|
|
@@ -52,6 +73,9 @@ interface NavContext {
|
|
|
52
73
|
mimeTypes?: MimeTypeArray;
|
|
53
74
|
connection?: {
|
|
54
75
|
saveData?: boolean;
|
|
76
|
+
effectiveType?: '4g' | '3g' | '2g' | 'slow-2g';
|
|
77
|
+
rtt?: number;
|
|
78
|
+
downlink?: number;
|
|
55
79
|
};
|
|
56
80
|
userAgentData?: {
|
|
57
81
|
platform: string;
|
|
@@ -76,14 +100,29 @@ interface UAHighEntropyValues {
|
|
|
76
100
|
interface EnvContext extends NavContext {
|
|
77
101
|
webglRenderer?: string;
|
|
78
102
|
webglVendor?: string;
|
|
103
|
+
webglMaxTextureSize?: number;
|
|
104
|
+
webglFragPrecision?: number;
|
|
105
|
+
webglCompressedFormats?: {
|
|
106
|
+
s3tc: boolean;
|
|
107
|
+
pvrtc: boolean;
|
|
108
|
+
etc2: boolean;
|
|
109
|
+
astc: boolean;
|
|
110
|
+
};
|
|
79
111
|
hardwareConcurrency?: number;
|
|
80
112
|
deviceMemory?: number;
|
|
81
113
|
devicePixelRatio?: number;
|
|
114
|
+
screenWidth?: number;
|
|
115
|
+
screenHeight?: number;
|
|
116
|
+
safeAreaInsetTop?: number;
|
|
117
|
+
audioSampleRate?: number;
|
|
118
|
+
hasVibration?: boolean;
|
|
119
|
+
hasDeviceMotion?: boolean;
|
|
82
120
|
pointerType?: 'coarse' | 'fine' | 'none';
|
|
83
121
|
hoverCapability?: boolean;
|
|
84
122
|
fontProbes?: Record<string, boolean>;
|
|
85
123
|
highEntropyData?: UAHighEntropyValues;
|
|
86
124
|
windowsVersion?: string | null;
|
|
125
|
+
hasBrave?: boolean;
|
|
87
126
|
}
|
|
88
127
|
/**
|
|
89
128
|
* Collect all available browser signals into a single EnvContext.
|
|
@@ -99,6 +138,14 @@ interface ParseOptions {
|
|
|
99
138
|
windowsVersion?: string | null;
|
|
100
139
|
/** Full env context from getEnvContext() — supersedes nav and windowsVersion when provided. */
|
|
101
140
|
ctx?: EnvContext;
|
|
141
|
+
/** Additional bot definitions prepended before the GenericBot catch-all. */
|
|
142
|
+
customBotDefs?: readonly BotDef[];
|
|
143
|
+
/**
|
|
144
|
+
* Explicit language override (BCP47, e.g. "zh-CN"). Useful for server-side parsing
|
|
145
|
+
* where the Accept-Language header is available but no browser context exists.
|
|
146
|
+
* Takes precedence over language derived from ctx/nav or UA string.
|
|
147
|
+
*/
|
|
148
|
+
language?: string;
|
|
102
149
|
}
|
|
103
150
|
/**
|
|
104
151
|
* Parse a user agent string into a full browser/OS/engine/device description.
|
|
@@ -119,18 +166,30 @@ declare function parseUA(ua: string, options?: ParseOptions): EnvOption;
|
|
|
119
166
|
*/
|
|
120
167
|
declare function getWindowsVersion(nav: NavContext): Promise<string | null>;
|
|
121
168
|
|
|
122
|
-
|
|
169
|
+
interface BrowserResult {
|
|
170
|
+
browser: BrowserName;
|
|
171
|
+
version: string;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Detect the browser name and version from a user agent string.
|
|
175
|
+
*
|
|
176
|
+
* When multiple BROWSER_DEFS entries match the same UA, the one with
|
|
177
|
+
* the highest `priority` value wins (ties go to the later definition).
|
|
178
|
+
*/
|
|
179
|
+
declare function detectBrowser(ua: string): BrowserResult;
|
|
123
180
|
|
|
124
|
-
interface
|
|
125
|
-
|
|
126
|
-
|
|
181
|
+
interface OsResult {
|
|
182
|
+
os: OsName;
|
|
183
|
+
osVersion: string;
|
|
127
184
|
}
|
|
128
185
|
/**
|
|
129
|
-
* Detect
|
|
130
|
-
*
|
|
131
|
-
*
|
|
186
|
+
* Detect the operating system and its version from a user agent string.
|
|
187
|
+
*
|
|
188
|
+
* @param ua - Raw user agent string
|
|
189
|
+
* @param windowsVersion - Pre-resolved Windows 11/10 string from getWindowsVersion()
|
|
190
|
+
* (avoids the async race condition of the old implementation)
|
|
132
191
|
*/
|
|
133
|
-
declare function
|
|
192
|
+
declare function detectOs(ua: string, windowsVersion?: string | null): OsResult;
|
|
134
193
|
|
|
135
194
|
type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
136
195
|
|
|
@@ -144,6 +203,44 @@ type ArchName = 'x86' | 'x86_64' | 'arm' | 'arm64' | 'unknown';
|
|
|
144
203
|
*/
|
|
145
204
|
declare function detectArch(ua: string, ctx?: EnvContext): ArchName;
|
|
146
205
|
|
|
206
|
+
/**
|
|
207
|
+
* Detect the rendering engine from a user agent string.
|
|
208
|
+
*
|
|
209
|
+
* @param ua - Raw user agent string
|
|
210
|
+
* @param browser - Pre-detected browser name; auto-detected when omitted
|
|
211
|
+
* @param version - Pre-detected browser version; auto-detected when omitted
|
|
212
|
+
*/
|
|
213
|
+
declare function detectEngine(ua: string, browser?: string, version?: string): EngineName;
|
|
214
|
+
|
|
215
|
+
type DeviceNav = Pick<NavContext, 'platform' | 'maxTouchPoints'> & {
|
|
216
|
+
pointerType?: 'coarse' | 'fine' | 'none';
|
|
217
|
+
hoverCapability?: boolean;
|
|
218
|
+
screenWidth?: number;
|
|
219
|
+
webglRenderer?: string;
|
|
220
|
+
webglMaxTextureSize?: number;
|
|
221
|
+
webglFragPrecision?: number;
|
|
222
|
+
webglCompressedFormats?: {
|
|
223
|
+
s3tc: boolean;
|
|
224
|
+
pvrtc: boolean;
|
|
225
|
+
etc2: boolean;
|
|
226
|
+
astc: boolean;
|
|
227
|
+
};
|
|
228
|
+
safeAreaInsetTop?: number;
|
|
229
|
+
devicePixelRatio?: number;
|
|
230
|
+
hasVibration?: boolean;
|
|
231
|
+
hasDeviceMotion?: boolean;
|
|
232
|
+
connection?: {
|
|
233
|
+
effectiveType?: string;
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Detect the device type from a user agent string.
|
|
238
|
+
*
|
|
239
|
+
* @param ua - Raw user agent string
|
|
240
|
+
* @param nav - Optional nav context; hardware signals take precedence over UA when available
|
|
241
|
+
*/
|
|
242
|
+
declare function detectDevice(ua: string, nav?: DeviceNav): DeviceName;
|
|
243
|
+
|
|
147
244
|
/**
|
|
148
245
|
* Detect whether the UA belongs to a headless or automation-driven browser.
|
|
149
246
|
*
|
|
@@ -161,6 +258,14 @@ declare function detectHeadless(ua: string): boolean;
|
|
|
161
258
|
*/
|
|
162
259
|
declare function isWebview(ua: string): boolean;
|
|
163
260
|
|
|
261
|
+
/**
|
|
262
|
+
* Returns true if every key in `criteria` matches the corresponding value in `info`.
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* satisfies(info, { os: 'iOS', device: 'Mobile' })
|
|
266
|
+
*/
|
|
267
|
+
declare function satisfies(info: EnvOption, criteria: Partial<EnvOption>): boolean;
|
|
268
|
+
|
|
164
269
|
/**
|
|
165
270
|
* The Accept-CH value to send in server responses.
|
|
166
271
|
* After the browser sees this header it will include the corresponding
|
|
@@ -185,11 +290,9 @@ declare function parseHeaders(headers: Record<string, string | string[] | undefi
|
|
|
185
290
|
declare const VERSION: string;
|
|
186
291
|
|
|
187
292
|
/**
|
|
188
|
-
* Detect browser, OS, engine and device information.
|
|
189
|
-
*
|
|
190
|
-
* @param ua - Optional UA string override. Defaults to `navigator.userAgent`.
|
|
293
|
+
* Detect browser, OS, engine and device information from the current browser environment.
|
|
191
294
|
*/
|
|
192
|
-
declare function uaBrowser(
|
|
295
|
+
declare function uaBrowser(): EnvOption;
|
|
193
296
|
declare namespace uaBrowser {
|
|
194
297
|
var detect: (ua?: string) => Promise<EnvOption>;
|
|
195
298
|
var isWebview: typeof isWebview;
|
|
@@ -197,4 +300,4 @@ declare namespace uaBrowser {
|
|
|
197
300
|
var VERSION: string;
|
|
198
301
|
}
|
|
199
302
|
|
|
200
|
-
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectHeadless, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA };
|
|
303
|
+
export { ACCEPT_CH, type ArchName$1 as ArchName, type BotDef, type BotName$1 as BotName, type BrowserName, type DeviceName, type EngineName, type EnvContext, type EnvOption, type OsName, type UAHighEntropyValues, VERSION, uaBrowser as default, detectArch, detectBot, detectBrowser, detectDevice, detectEngine, detectHeadless, detectOs as detectOS, getEnvContext, getLanguage, getNavContext, getWindowsVersion, isWebview, parseHeaders, parseUA, satisfies };
|
package/dist/index.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var uaBrowser=(function(){'use strict';var T={version:"1.3.1"};var M=[{name:"Safari",priority:10,detect:/Safari/,versionPattern:/Version\/([\d.]+)/},{name:"Chrome",priority:20,detect:/(Chrome|CriOS)/,versionPattern:[/Chrome\/([\d.]+)/,/CriOS\/([\d.]+)/]},{name:"IE",priority:30,detect:/(MSIE|Trident)/,versionPattern:[/MSIE ([\d.]+)/,/rv:([\d.]+)/]},{name:"Edge",priority:40,detect:/(Edge|Edg\/|EdgA|EdgiOS)/,versionPattern:[/Edge\/([\d.]+)/,/Edg\/([\d.]+)/,/EdgA\/([\d.]+)/,/EdgiOS\/([\d.]+)/]},{name:"Firefox",priority:50,detect:/(Firefox|FxiOS)/,versionPattern:[/Firefox\/([\d.]+)/,/FxiOS\/([\d.]+)/]},{name:"Firefox Focus",priority:55,detect:/Focus/,versionPattern:/Focus\/([\d.]+)/},{name:"Chromium",priority:60,detect:/Chromium/,versionPattern:/Chromium\/([\d.]+)/},{name:"Opera",priority:70,detect:/(Opera|OPR|OPT)/,versionPattern:[/Opera\/([\d.]+)/,/OPR\/([\d.]+)/,/OPT\/([\d.]+)/]},{name:"Vivaldi",priority:80,detect:/Vivaldi/,versionPattern:/Vivaldi\/([\d.]+)/},{name:"Yandex",priority:90,detect:/YaBrowser/,versionPattern:/YaBrowser\/([\d.]+)/},{name:"Samsung Internet",priority:92,detect:/SamsungBrowser/,versionPattern:/SamsungBrowser\/([\d.]+)/},{name:"DuckDuckGo",priority:94,detect:/DuckDuckGo\//,versionPattern:/DuckDuckGo\/([\d.]+)/},{name:"Puffin",priority:96,detect:/Puffin\//,versionPattern:/Puffin\/([\d.]+)/},{name:"Coc Coc",priority:130,detect:/coc_coc_browser/,versionPattern:/coc_coc_browser\/([\d.]+)/},{name:"Kindle",priority:140,detect:/(Kindle|Silk\/)/,versionPattern:/Version\/([\d.]+)/},{name:"Konqueror",priority:160,detect:/Konqueror/,versionPattern:/Konqueror\/([\d.]+)/},{name:"SeaMonkey",priority:180,detect:/SeaMonkey/,versionPattern:/SeaMonkey\/([\d.]+)/},{name:"Epiphany",priority:190,detect:/Epiphany/,versionPattern:/Epiphany\/([\d.]+)/},{name:"Maxthon",priority:200,detect:/Maxthon/,versionPattern:/Maxthon\/([\d.]+)/},{name:"360",priority:300,detect:/(QihooBrowser|QHBrowser)/,versionPattern:/QihooBrowser\/([\d.]+)/},{name:"360SE",priority:310,detect:/360SE/,versionPattern:null,chromeLookup:{108:"14.0",86:"13.0",78:"12.0",69:"11.0",63:"10.0",55:"9.1",45:"8.1",42:"8.0",31:"7.0",21:"6.3"}},{name:"360EE",priority:320,detect:/360EE/,versionPattern:null,chromeLookup:{86:"13.0",78:"12.0",69:"11.0",63:"9.5",55:"9.0",50:"8.7",30:"7.5"}},{name:"UC",priority:330,detect:/(UCBrowser|UBrowser|UCWEB)/,versionPattern:/UC?Browser\/([\d.]+)/},{name:"QQBrowser",priority:340,detect:/QQBrowser/,versionPattern:/QQBrowser\/([\d.]+)/},{name:"QQ",priority:345,detect:/QQ\//,versionPattern:/QQ\/([\d.]+)/},{name:"Baidu",priority:350,detect:/(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/,versionPattern:[/BIDUBrowser[\s/]([\d.]+)/,/baiduboxapp\/([\d.]+)/]},{name:"Sogou",priority:360,detect:/(MetaSr|Sogou)/,versionPattern:[/SE ([\d.X]+)/,/SogouMobileBrowser\/([\d.]+)/]},{name:"Liebao",priority:370,detect:/(LBBROWSER|LieBaoFast)/,versionPattern:/LieBaoFast\/([\d.]+)/,chromeLookup:{57:"6.5",49:"6.0",46:"5.9",42:"5.3",39:"5.2",34:"5.0",29:"4.5",21:"4.0"}},{name:"2345Explorer",priority:380,detect:/2345Explorer/,versionPattern:[/2345Explorer\/([\d.]+)/,/Mb2345Browser\/([\d.]+)/],chromeLookup:{69:"10.0",55:"9.9"}},{name:"115Browser",priority:390,detect:/115Browser/,versionPattern:/115Browser\/([\d.]+)/},{name:"TheWorld",priority:400,detect:/TheWorld/,versionPattern:/TheWorld ([\d.]+)/},{name:"XiaoMi",priority:410,detect:/MiuiBrowser/,versionPattern:/MiuiBrowser\/([\d.]+)/},{name:"Vivo",priority:420,detect:/VivoBrowser/,versionPattern:/VivoBrowser\/([\d.]+)/},{name:"Huawei",priority:430,detect:/HuaweiBrowser/,versionPattern:[/HuaweiBrowser\/([\d.]+)/,/Version\/([\d.]+)/]},{name:"OPPO",priority:440,detect:/HeyTapBrowser/,versionPattern:/HeyTapBrowser\/([\d.]+)/},{name:"Quark",priority:450,detect:/Quark/,versionPattern:/Quark\/([\d.]+)/},{name:"Qiyu",priority:460,detect:/Qiyu/,versionPattern:/Qiyu\/([\d.]+)/},{name:"WechatWork",priority:500,detect:/wxwork\//,versionPattern:/wxwork\/([\d.]+)/},{name:"Wechat",priority:510,detect:/MicroMessenger/,versionPattern:/MicroMessenger\/([\d.]+)/},{name:"Taobao",priority:520,detect:/AliApp\(TB/,versionPattern:/AliApp\(TB\/([\d.]+)/},{name:"Alipay",priority:530,detect:/AliApp\(AP/,versionPattern:/AliApp\(AP\/([\d.]+)/},{name:"Weibo",priority:540,detect:/Weibo/,versionPattern:/weibo__([\d.]+)/},{name:"Douban",priority:550,detect:/com\.douban\.frodo/,versionPattern:/com\.douban\.frodo\/([\d.]+)/},{name:"Suning",priority:560,detect:/SNEBUY-APP/,versionPattern:/SNEBUY-APP([\d.]+)/},{name:"iQiYi",priority:570,detect:/IqiyiApp/,versionPattern:/IqiyiVersion\/([\d.]+)/},{name:"DingTalk",priority:580,detect:/DingTalk/,versionPattern:/DingTalk\/([\d.]+)/},{name:"Douyin",priority:590,detect:/aweme/,versionPattern:/app_version\/([\d.]+)/},{name:"Bilibili",priority:592,detect:/BiliBili\//,versionPattern:/BiliBili\/([\d.]+)/},{name:"Kuaishou",priority:594,detect:/Kwai\//,versionPattern:/Kwai\/([\d.]+)/},{name:"Xiaohongshu",priority:596,detect:/Xiaohongshu\//,versionPattern:/Xiaohongshu\/([\d.]+)/},{name:"Feishu",priority:597,detect:/(Lark|Feishu)\//,versionPattern:[/Lark\/([\d.]+)/,/Feishu\/([\d.]+)/]},{name:"Toutiao",priority:598,detect:/NewsArticle\//,versionPattern:/NewsArticle\/([\d.]+)/},{name:"JD",priority:599,detect:/jdpingou\//,versionPattern:/jdpingou\/([\d.]+)/},{name:"Meituan",priority:600,detect:/MeituanHybrid\//,versionPattern:/MeituanHybrid\/([\d.]+)/}];function P(e,t){let r=t.exec(e);if(!r)return null;let n=r[1];return n!=null&&n!==""?n:null}function v(e,t){for(let r of t){let n=P(e,r);if(n!==null)return n}return null}function V(e,t){let r=/Chrome\/([\d]+)/.exec(e);if(!r)return null;let n=r[1];return Object.prototype.hasOwnProperty.call(t,n)?t[n]:null}function R(e){let t=null;for(let n of M)n.detect.test(e)&&(t===null||n.priority>=t.priority)&&(t=n);if(!t)return {browser:"unknown",version:"unknown"};let r=null;if(t.chromeLookup&&(r=V(e,t.chromeLookup)),r===null&&t.versionPattern!==null){let n=Array.isArray(t.versionPattern)?t.versionPattern:[t.versionPattern];r=v(e,n);}return {browser:t.name,version:r!=null?r:"unknown"}}var L=[{name:"KHTML",detect:/KHTML\//},{name:"Trident",detect:/(Trident|NET CLR)/},{name:"Presto",detect:/Presto/},{name:"Gecko",detect:/Gecko\//},{name:"WebKit",detect:/AppleWebKit/},{name:"ArkWeb",detect:/ArkWeb/}];function W(e,t,r){var o,i;let n="unknown";for(let c of L)c.detect.test(e)&&(n=c.name);return (n==="WebKit"&&/(Chrome|CriOS)/.test(e)&&parseInt((i=((o=/Chrome\/([\d]+)/.exec(e))!=null?o:[])[1])!=null?i:"0",10)>27||t==="Opera"&&parseInt(r,10)>12||t==="Yandex")&&(n="Blink"),t==="Edge"&&(n=parseInt(r,10)>75?"Blink":"EdgeHTML"),n}var F=[{name:"WebOS",detect:/hpwOS/,versionPattern:/hpwOS\/([\d.]+)/},{name:"Symbian",detect:/Symbian/,versionPattern:null},{name:"MeeGo",detect:/MeeGo/,versionPattern:null},{name:"BlackBerry",detect:/(BlackBerry|RIM)/,versionPattern:null},{name:"FreeBSD",detect:/FreeBSD/,versionPattern:null},{name:"Debian",detect:/Debian/,versionPattern:/Debian\/([\d.]+)/},{name:"Ubuntu",detect:/Ubuntu/,versionPattern:null},{name:"Linux",detect:/(Linux|X11)/,versionPattern:null},{name:"Chrome OS",detect:/CrOS/,versionPattern:null},{name:"Tizen",detect:/Tizen/,versionPattern:/Tizen ([\d.]+)/},{name:"iOS",detect:/like Mac OS X/,versionPattern:/OS ([\d_]+) like/},{name:"MacOS",detect:/Macintosh/,versionPattern:/Mac OS X -?([\d_.]+)/},{name:"Android",detect:/(Android|Adr)/,versionPattern:/(?:Android|Adr) ([\d.]+)/},{name:"HarmonyOS",detect:/HarmonyOS/,versionPattern:[/HarmonyOS[\s/]([\d.]+)/,/Android ([\d.]+)[;)]/],versionLookup:{10:"2",11:"3",12:"3",13:"4"}},{name:"OpenHarmony",detect:/OpenHarmony/,versionPattern:/OpenHarmony[\s/]([\d.]+)/},{name:"KaiOS",detect:/KAIOS/,versionPattern:/KAIOS\/([\d.]+)/},{name:"Windows",detect:/Windows/,versionPattern:/Windows NT ([\d.]+)/,versionLookup:{10:"10","6.4":"10","6.3":"8.1","6.2":"8","6.1":"7","6.0":"Vista","5.2":"XP","5.1":"XP","5.0":"2000"}},{name:"Windows Phone",detect:/(IEMobile|Windows Phone)/,versionPattern:/Windows Phone(?: OS)? ([\d.]+)/}];function _(e,t){let r=null;for(let o of F)o.detect.test(e)&&(r=o);if(!r)return {os:"unknown",osVersion:"unknown"};let n="unknown";if(r.versionPattern){let o=Array.isArray(r.versionPattern)?v(e,r.versionPattern):P(e,r.versionPattern);if(o!==null){let i=o.replace(/_/g,".");if(r.versionLookup){let c=Object.prototype.hasOwnProperty.call(r.versionLookup,i)?r.versionLookup[i]:null;if(c!==null)n=c;else if(r.name==="Windows"){let g=parseInt(i,10);n=isNaN(g)?"unknown":g.toString();}else n=i;}else n=i;}}return r.name==="Windows"&&t&&(n=t),{os:r.name,osVersion:n}}var I=[{name:"Mobile",detect:/(Mobi|iPh)/},{name:"Tablet",detect:/(Tablet|Pad)/}];function H(e,t){if(/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(e))return "TV";if((t==null?void 0:t.platform)==="MacIntel"&&t.maxTouchPoints>1||/iPad/.test(e)||/Android/.test(e)&&!/Mobile/.test(e))return "Tablet";for(let r of I)if(r.detect.test(e))return r.name;return "PC"}var j=[{name:"Googlebot",detect:/Googlebot/},{name:"Bingbot",detect:/(bingbot|BingPreview)/},{name:"Baiduspider",detect:/(Baiduspider|BaiduMobaider)/},{name:"Bytespider",detect:/Bytespider/},{name:"YandexBot",detect:/YandexBot/},{name:"DuckDuckBot",detect:/DuckDuckBot/},{name:"Slurp",detect:/Slurp/},{name:"Sogou",detect:/(Sogou|sogou).*[Ss]pider/},{name:"360Spider",detect:/360Spider/},{name:"PetalBot",detect:/PetalBot/},{name:"Applebot",detect:/Applebot/},{name:"Facebookbot",detect:/(facebookexternalhit|FacebookBot)/},{name:"Twitterbot",detect:/Twitterbot/},{name:"LinkedInBot",detect:/LinkedInBot/},{name:"SemrushBot",detect:/SemrushBot/},{name:"AhrefsBot",detect:/AhrefsBot/},{name:"MJ12bot",detect:/MJ12bot/},{name:"GPTBot",detect:/GPTBot/},{name:"ClaudeBot",detect:/ClaudeBot/},{name:"PerplexityBot",detect:/PerplexityBot/},{name:"CCBot",detect:/CCBot/},{name:"AdsBot",detect:/AdsBot-Google/},{name:"GenericBot",detect:/(bot|crawler|spider|crawling|scraper)/i}];function G(e){for(let t of j)if(t.detect.test(e))return {isBot:true,botName:t.name};return {isBot:false,botName:"unknown"}}var U=[{name:"arm64",detect:/(aarch64|arm64|ARM64)/},{name:"arm",detect:/\bARM\b/},{name:"x86_64",detect:/(x86_64|Win64|WOW64|x64;|amd64)/i},{name:"x86",detect:/(i[36]86|i686|x86;)/}];function Q(e,t){if(t!=null&&t.highEntropyData){let{architecture:o,bitness:i}=t.highEntropyData;if(o==="arm")return i==="64"?"arm64":"arm";if(o==="x86")return i==="64"?"x86_64":"x86"}let r=t==null?void 0:t.webglRenderer;if(r){if(/Apple\s+(M\d|A\d{1,2}[A-Z]?)\b/i.test(r)||/APPLE M\d/i.test(r))return "arm64";if(/\b(Intel|AMD|NVIDIA|Radeon)\b/i.test(r))return "x86_64"}let n=t==null?void 0:t.platform;if(n){if(/iPhone|iPad|iPod/.test(n)||/arm64|aarch64/i.test(n))return "arm64";if(/arm/i.test(n))return "arm";if(/Win64|WOW64|x86_64/i.test(n))return "x86_64";if(/Win32|i686/i.test(n))return "x86"}for(let o of U)if(o.detect.test(e))return o.name;return "unknown"}var oe=/(HeadlessChrome|Headless|PhantomJS|Electron\/|Playwright|jsdom\/|Selenium)/;function K(e){return oe.test(e)}function y(e){return !!(/; wv/.test(e)||/like Mac OS X/.test(e)&&!/Version\//.test(e)&&!/Safari\//.test(e))}function l(){return typeof navigator=="undefined"?{userAgent:"",platform:"",language:"",maxTouchPoints:0}:navigator}function m(e,t){var r;try{return !!((r=e.mimeTypes)!=null&&r.namedItem(t))}catch(n){return false}}function w(e){var n,o;return ((o=(n=e.browserLanguage)!=null?n:e.language)!=null?o:"").replace(/-\w+/g,i=>i.toUpperCase())||"unknown"}function h(e,t={}){var B,E,S,A,k,O,D,C;let r=(B=t.ctx)!=null?B:t.nav,n=(S=(E=t.ctx)==null?void 0:E.windowsVersion)!=null?S:t.windowsVersion,{browser:o,version:i}=R(e),{os:c,osVersion:g}=_(e,n),x=g,Y=H(e,r),q=Q(e,t.ctx),a=r,{isBot:J,botName:z}=G(e),Z=K(e),$=a?w(a):"unknown",ee=(A=a==null?void 0:a.platform)!=null?A:"unknown",d=o,p=i;if(a){let s=typeof chrome!="undefined"?chrome:void 0,N=/Chrome\/([\d]+)/.exec(e),b=N?parseInt(N[1],10):0;if(s)if(s.adblock2345||s.common2345)d="2345Explorer",p="unknown";else {let u=false;if(m(a,"application/360softmgrplugin")||m(a,"application/mozilla-npqihooquicklogin")||b>36&&typeof showModalDialog!="undefined"?u=true:b>45&&(u=m(a,"application/vnd.chromium.remoting-viewer"),!u&&b>=69&&(u=m(a,"application/hwepass2001.installepass2001")||m(a,"application/asx"))),u){let re=((k=a.connection)==null?void 0:k.saveData)===true;m(a,"application/gameplugin")||!re?d="360SE":d="360EE",p="unknown";}}}if(d==="Baidu"&&/(Opera|OPR|OPT)/.test(e)){d="Opera";let s=(D=(O=/OPR\/([\d.]+)/.exec(e))!=null?O:/OPT\/([\d.]+)/.exec(e))!=null?D:/Opera\/([\d.]+)/.exec(e);p=(C=s==null?void 0:s[1])!=null?C:"unknown";}if(d==="Chrome"&&/\S+Browser\//.test(e)){let s=/(\S+Browser)\/([\d.]+)/.exec(e);s&&(d=s[1],p=s[2]);}if(d==="Firefox"&&a)try{(typeof clientInformation!="undefined"||typeof u2f=="undefined")&&(d="Firefox Nightly");}catch(s){}if(c==="iOS"&&d==="Safari"){let s=/Version\/([\d.]+)/.exec(e);s&&parseInt(s[1],10)>parseInt(x,10)&&(x=s[1]);}let te=W(e,d,p);return {browser:d,version:p,engine:te,os:c,osVersion:x,device:Y,arch:q,isWebview:y(e),isHeadless:Z,isBot:J,botName:z,language:$,platform:ee}}var ie=[".AppleSystemUIFont","Segoe UI","Noto Color Emoji","Ubuntu","HarmonyOS Sans"];function se(){try{let t=document.createElement("canvas").getContext("2d");if(!t)return {};let r="mmmmmmmmmmlli";t.font="72px monospace";let n=t.measureText(r).width,o={};for(let i of ie)t.font=`72px '${i}', monospace`,o[i]=t.measureText(r).width!==n;return o}catch(e){return {}}}function ae(){var e;try{let t=document.createElement("canvas"),r=(e=t.getContext("webgl"))!=null?e:t.getContext("experimental-webgl");if(!r)return {};let n=r.getExtension("WEBGL_debug_renderer_info");return n?{renderer:r.getParameter(n.UNMASKED_RENDERER_WEBGL),vendor:r.getParameter(n.UNMASKED_VENDOR_WEBGL)}:{}}catch(t){return {}}}function de(){try{if(window.matchMedia("(pointer: coarse)").matches)return "coarse";if(window.matchMedia("(pointer: fine)").matches)return "fine";if(window.matchMedia("(pointer: none)").matches)return "none"}catch(e){}}function ce(){try{return window.matchMedia("(hover: hover)").matches}catch(e){return}}function me(e){var r;if(!e)return null;let t=parseInt((r=e.split(".")[0])!=null?r:"0",10);return isNaN(t)?null:t>=13?"11":"10"}async function X(){let e=l(),t={userAgent:e.userAgent,platform:e.platform,language:e.language,maxTouchPoints:e.maxTouchPoints};if(e.browserLanguage!==void 0&&(t.browserLanguage=e.browserLanguage),e.mimeTypes!==void 0&&(t.mimeTypes=e.mimeTypes),e.connection!==void 0&&(t.connection=e.connection),e.userAgentData!==void 0&&(t.userAgentData=e.userAgentData),typeof navigator!="undefined"&&(t.hardwareConcurrency=navigator.hardwareConcurrency,t.deviceMemory=navigator.deviceMemory),typeof window!="undefined"){t.devicePixelRatio=window.devicePixelRatio,t.pointerType=de(),t.hoverCapability=ce(),t.fontProbes=se();let{renderer:r,vendor:n}=ae();r!==void 0&&(t.webglRenderer=r),n!==void 0&&(t.webglVendor=n);}if(e.userAgentData)try{let r=await e.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]);t.highEntropyData={architecture:r.architecture,bitness:r.bitness,model:r.model,platformVersion:r.platformVersion,fullVersionList:r.fullVersionList},e.userAgentData.platform==="Windows"&&(t.windowsVersion=me(r.platformVersion));}catch(r){}return t}var{version:pe}=T;function f(e){let t=l();return h(e!=null?e:t.userAgent,{nav:t})}f.detect=async e=>{let t=await X();return h(e!=null?e:t.userAgent,{ctx:t})};f.isWebview=y;f.getLanguage=()=>w(l());f.VERSION=pe;var ue=f;
|
|
2
|
-
return
|
|
1
|
+
var uaBrowser=(function(){'use strict';var ee={version:"1.4.0-beta.1"};var te=[{name:"Safari",priority:10,detect:/Safari/,versionPattern:/Version\/([\d.]+)/},{name:"Chrome",priority:20,detect:/(Chrome|CriOS)/,versionPattern:[/Chrome\/([\d.]+)/,/CriOS\/([\d.]+)/]},{name:"Arc",priority:35,detect:/Arc\//,versionPattern:/Arc\/([\d.]+)/},{name:"IE",priority:30,detect:/(MSIE|Trident)/,versionPattern:[/MSIE ([\d.]+)/,/rv:([\d.]+)/]},{name:"Edge",priority:40,detect:/(Edge|Edg\/|EdgA|EdgiOS)/,versionPattern:[/Edge\/([\d.]+)/,/Edg\/([\d.]+)/,/EdgA\/([\d.]+)/,/EdgiOS\/([\d.]+)/]},{name:"Firefox",priority:50,detect:/(Firefox|FxiOS)/,versionPattern:[/Firefox\/([\d.]+)/,/FxiOS\/([\d.]+)/]},{name:"Firefox Focus",priority:55,detect:/Focus/,versionPattern:/Focus\/([\d.]+)/},{name:"Chromium",priority:60,detect:/Chromium/,versionPattern:/Chromium\/([\d.]+)/},{name:"Opera",priority:70,detect:/(Opera|OPR|OPT)/,versionPattern:[/Opera\/([\d.]+)/,/OPR\/([\d.]+)/,/OPT\/([\d.]+)/]},{name:"Vivaldi",priority:80,detect:/Vivaldi/,versionPattern:/Vivaldi\/([\d.]+)/},{name:"Yandex",priority:90,detect:/YaBrowser/,versionPattern:/YaBrowser\/([\d.]+)/},{name:"Samsung Internet",priority:92,detect:/SamsungBrowser/,versionPattern:/SamsungBrowser\/([\d.]+)/},{name:"DuckDuckGo",priority:94,detect:/(DuckDuckGo|Ddg)\//,versionPattern:[/DuckDuckGo\/([\d.]+)/,/Ddg\/([\d.]+)/]},{name:"Puffin",priority:96,detect:/Puffin\//,versionPattern:/Puffin\/([\d.]+)/},{name:"Coc Coc",priority:130,detect:/coc_coc_browser/,versionPattern:/coc_coc_browser\/([\d.]+)/},{name:"Kindle",priority:140,detect:/(Kindle|Silk\/)/,versionPattern:/Version\/([\d.]+)/},{name:"Konqueror",priority:160,detect:/Konqueror/,versionPattern:/Konqueror\/([\d.]+)/},{name:"SeaMonkey",priority:180,detect:/SeaMonkey/,versionPattern:/SeaMonkey\/([\d.]+)/},{name:"Epiphany",priority:190,detect:/Epiphany/,versionPattern:/Epiphany\/([\d.]+)/},{name:"Maxthon",priority:200,detect:/Maxthon/,versionPattern:/Maxthon\/([\d.]+)/},{name:"360",priority:300,detect:/(QihooBrowser|QHBrowser)/,versionPattern:/QihooBrowser\/([\d.]+)/},{name:"360SE",priority:310,detect:/360SE/,versionPattern:null,chromeLookup:{108:"14.0",86:"13.0",78:"12.0",69:"11.0",63:"10.0",55:"9.1",45:"8.1",42:"8.0",31:"7.0",21:"6.3"}},{name:"360EE",priority:320,detect:/360EE/,versionPattern:null,chromeLookup:{86:"13.0",78:"12.0",69:"11.0",63:"9.5",55:"9.0",50:"8.7",30:"7.5"}},{name:"UC",priority:330,detect:/(UCBrowser|UBrowser|UCWEB)/,versionPattern:/UC?Browser\/([\d.]+)/},{name:"QQBrowser",priority:340,detect:/(MQQBrowser|QQBrowser)/,versionPattern:[/MQQBrowser\/([\d.]+)/,/QQBrowser\/([\d.]+)/]},{name:"QQ",priority:345,detect:/QQ\//,versionPattern:/QQ\/([\d.]+)/},{name:"Baidu",priority:350,detect:/(Baidu|BIDUBrowser|baidubrowser|baiduboxapp|BaiduHD)/,versionPattern:[/BIDUBrowser[\s/]([\d.]+)/,/baiduboxapp\/([\d.]+)/]},{name:"Sogou",priority:360,detect:/(MetaSr|Sogou)/,versionPattern:[/SE ([\d.X]+)/,/SogouMobileBrowser\/([\d.]+)/]},{name:"Liebao",priority:370,detect:/(LBBROWSER|LieBaoFast)/,versionPattern:/LieBaoFast\/([\d.]+)/,chromeLookup:{57:"6.5",49:"6.0",46:"5.9",42:"5.3",39:"5.2",34:"5.0",29:"4.5",21:"4.0"}},{name:"2345Explorer",priority:380,detect:/2345Explorer/,versionPattern:[/2345Explorer\/([\d.]+)/,/Mb2345Browser\/([\d.]+)/],chromeLookup:{69:"10.0",55:"9.9"}},{name:"115Browser",priority:390,detect:/115Browser/,versionPattern:/115Browser\/([\d.]+)/},{name:"TheWorld",priority:400,detect:/TheWorld/,versionPattern:/TheWorld ([\d.]+)/},{name:"XiaoMi",priority:410,detect:/MiuiBrowser/,versionPattern:/MiuiBrowser\/([\d.]+)/},{name:"Vivo",priority:420,detect:/VivoBrowser/,versionPattern:/VivoBrowser\/([\d.]+)/},{name:"Huawei",priority:430,detect:/HuaweiBrowser/,versionPattern:[/HuaweiBrowser\/([\d.]+)/,/Version\/([\d.]+)/]},{name:"OPPO",priority:440,detect:/HeyTapBrowser/,versionPattern:/HeyTapBrowser\/([\d.]+)/},{name:"Quark",priority:450,detect:/Quark/,versionPattern:/Quark\/([\d.]+)/},{name:"Qiyu",priority:460,detect:/Qiyu/,versionPattern:/Qiyu\/([\d.]+)/},{name:"WechatWork",priority:500,detect:/wxwork\//,versionPattern:/wxwork\/([\d.]+)/},{name:"Wechat",priority:510,detect:/MicroMessenger/,versionPattern:/MicroMessenger\/([\d.]+)/},{name:"Taobao",priority:520,detect:/AliApp\(TB/,versionPattern:/AliApp\(TB\/([\d.]+)/},{name:"Alipay",priority:530,detect:/AliApp\(AP/,versionPattern:/AliApp\(AP\/([\d.]+)/},{name:"Weibo",priority:540,detect:/Weibo/,versionPattern:/weibo__([\d.]+)/},{name:"Douban",priority:550,detect:/com\.douban\.frodo/,versionPattern:/com\.douban\.frodo\/([\d.]+)/},{name:"Suning",priority:560,detect:/SNEBUY-APP/,versionPattern:/SNEBUY-APP([\d.]+)/},{name:"iQiYi",priority:570,detect:/IqiyiApp/,versionPattern:/IqiyiVersion\/([\d.]+)/},{name:"DingTalk",priority:580,detect:/DingTalk/,versionPattern:/DingTalk\/([\d.]+)/},{name:"Douyin",priority:590,detect:/aweme/,versionPattern:/app_version\/([\d.]+)/},{name:"Bilibili",priority:592,detect:/BiliBili\//,versionPattern:/BiliBili\/([\d.]+)/},{name:"Kuaishou",priority:594,detect:/Kwai\//,versionPattern:/Kwai\/([\d.]+)/},{name:"Xiaohongshu",priority:596,detect:/Xiaohongshu\//,versionPattern:/Xiaohongshu\/([\d.]+)/},{name:"Feishu",priority:597,detect:/(Lark|Feishu)\//,versionPattern:[/Lark\/([\d.]+)/,/Feishu\/([\d.]+)/]},{name:"Toutiao",priority:598,detect:/NewsArticle\//,versionPattern:/NewsArticle\/([\d.]+)/},{name:"JD",priority:599,detect:/jdpingou\//,versionPattern:/jdpingou\/([\d.]+)/},{name:"Meituan",priority:600,detect:/MeituanHybrid\//,versionPattern:/MeituanHybrid\/([\d.]+)/}];function V(t,e){let r=e.exec(t);if(!r)return null;let n=r[1];return n!=null&&n!==""?n:null}function k(t,e){for(let r of e){let n=V(t,r);if(n!==null)return n}return null}function re(t,e){let r=/Chrome\/([\d]+)/.exec(t);if(!r)return null;let n=r[1];return Object.prototype.hasOwnProperty.call(e,n)?e[n]:null}function N(t){let e=null;for(let n of te)n.detect.test(t)&&(e===null||n.priority>=e.priority)&&(e=n);if(!e)return {browser:"unknown",version:"unknown"};let r=null;if(e.chromeLookup&&(r=re(t,e.chromeLookup)),r===null&&e.versionPattern!==null){let n=Array.isArray(e.versionPattern)?e.versionPattern:[e.versionPattern];r=k(t,n);}return {browser:e.name,version:r!=null?r:"unknown"}}var ne=[{name:"KHTML",detect:/KHTML\//},{name:"Trident",detect:/(Trident|NET CLR)/},{name:"Presto",detect:/Presto/},{name:"Gecko",detect:/Gecko\//},{name:"WebKit",detect:/AppleWebKit/},{name:"ArkWeb",detect:/ArkWeb/}];function oe(t,e,r){var o,i;if(e===void 0||r===void 0){let d=N(t);e=e!=null?e:d.browser,r=r!=null?r:d.version;}let n="unknown";for(let d of ne)d.detect.test(t)&&(n=d.name);return (n==="WebKit"&&/(Chrome|CriOS)/.test(t)&&parseInt((i=((o=/Chrome\/([\d]+)/.exec(t))!=null?o:[])[1])!=null?i:"0",10)>27||e==="Opera"&&parseInt(r,10)>12||e==="Yandex")&&(n="Blink"),e==="Edge"&&(n=parseInt(r,10)>75?"Blink":"EdgeHTML"),n}var ie=[{name:"WebOS",detect:/hpwOS/,versionPattern:/hpwOS\/([\d.]+)/},{name:"Symbian",detect:/Symbian/,versionPattern:null},{name:"MeeGo",detect:/MeeGo/,versionPattern:null},{name:"BlackBerry",detect:/(BlackBerry|RIM)/,versionPattern:null},{name:"FreeBSD",detect:/FreeBSD/,versionPattern:null},{name:"Debian",detect:/Debian/,versionPattern:/Debian\/([\d.]+)/},{name:"Ubuntu",detect:/Ubuntu/,versionPattern:null},{name:"Linux",detect:/(Linux|X11)/,versionPattern:null},{name:"Chrome OS",detect:/CrOS/,versionPattern:null},{name:"Tizen",detect:/Tizen/,versionPattern:/Tizen ([\d.]+)/},{name:"iOS",detect:/like Mac OS X/,versionPattern:/OS ([\d_]+) like/},{name:"MacOS",detect:/Macintosh/,versionPattern:/Mac OS X -?([\d_.]+)/},{name:"visionOS",detect:/visionOS/,versionPattern:/visionOS ([\d_]+)/},{name:"tvOS",detect:/Apple TV/,versionPattern:/OS ([\d_]+) like/},{name:"Android",detect:/(Android|Adr)/,versionPattern:/(?:Android|Adr) ([\d.]+)/},{name:"HarmonyOS",detect:/HarmonyOS/,versionPattern:[/HarmonyOS[\s/]([\d.]+)/,/Android ([\d.]+)[;)]/],versionLookup:{10:"2",11:"3",12:"3",13:"4"}},{name:"OpenHarmony",detect:/OpenHarmony/,versionPattern:/OpenHarmony[\s/]([\d.]+)/},{name:"KaiOS",detect:/KAIOS/,versionPattern:/KAIOS\/([\d.]+)/},{name:"Windows",detect:/Windows/,versionPattern:/Windows NT ([\d.]+)/,versionLookup:{10:"10","6.4":"10","6.3":"8.1","6.2":"8","6.1":"7","6.0":"Vista","5.2":"XP","5.1":"XP","5.0":"2000"}},{name:"Windows Phone",detect:/(IEMobile|Windows Phone)/,versionPattern:/Windows Phone(?: OS)? ([\d.]+)/}];function ae(t,e){let r=null;for(let o of ie)o.detect.test(t)&&(r=o);if(!r)return {os:"unknown",osVersion:"unknown"};let n="unknown";if(r.versionPattern){let o=Array.isArray(r.versionPattern)?k(t,r.versionPattern):V(t,r.versionPattern);if(o!==null){let i=o.replace(/_/g,".");if(r.versionLookup){let d=Object.prototype.hasOwnProperty.call(r.versionLookup,i)?r.versionLookup[i]:null;if(d!==null)n=d;else if(r.name==="Windows"){let c=parseInt(i,10);n=isNaN(c)?"unknown":c.toString();}else n=i;}else n=i;}}return r.name==="Windows"&&e&&(n=e),{os:r.name,osVersion:n}}var se=[{name:"Mobile",detect:/(Mobi|iPh)/},{name:"Tablet",detect:/(Tablet|Pad)/}];function de(t,e){var o,i;function r(){if(/PlayStation|Xbox|Nintendo/.test(t))return "Console";if(/visionOS|Quest/.test(t))return "XR";if(/(SMART-TV|HbbTV|SmartTV|TV Safari|Android TV|GoogleTV)/.test(t))return "TV";if(/iPad/.test(t)||/Android/.test(t)&&!/Mobile/.test(t))return "Tablet";for(let d of se)if(d.detect.test(t))return d.name;return null}function n(){var d,c,l,p,g,b,a,w,S,A,O,C,m,f,T,D;if(!e)return null;if(e.webglRenderer){if(/^ANGLE\b/.test(e.webglRenderer))return "PC";if(/Adreno/i.test(e.webglRenderer)||/Mali[-\s]/i.test(e.webglRenderer))return ((d=e.screenWidth)!=null?d:0)>=768?"Tablet":"Mobile";if(/Apple GPU/i.test(e.webglRenderer)){let M=(c=e.screenWidth)!=null?c:0;return M<=1366?M>=768?"Tablet":"Mobile":"PC"}}return e.platform==="MacIntel"&&((l=e.maxTouchPoints)!=null?l:0)>1?e.screenWidth!==void 0&&e.screenWidth<768?"Mobile":"Tablet":e.webglMaxTextureSize!==void 0&&e.webglMaxTextureSize<=8192&&((p=e.maxTouchPoints)!=null?p:0)>1&&((g=e.screenWidth)!=null?g:9999)<1367?((b=e.screenWidth)!=null?b:0)>=768?"Tablet":"Mobile":(a=e.webglCompressedFormats)!=null&&a.pvrtc&&!e.webglCompressedFormats.s3tc?((w=e.screenWidth)!=null?w:0)>=768?"Tablet":"Mobile":e.safeAreaInsetTop!==void 0&&e.safeAreaInsetTop>0?((S=e.screenWidth)!=null?S:0)>=768?"Tablet":"Mobile":e.hasVibration||e.hasDeviceMotion?((A=e.screenWidth)!=null?A:0)>=768?"Tablet":"Mobile":(O=e.connection)!=null&&O.effectiveType&&["2g","3g","slow-2g"].includes(e.connection.effectiveType)?((C=e.screenWidth)!=null?C:0)>=768?"Tablet":"Mobile":((m=e.devicePixelRatio)!=null?m:0)>2&&((f=e.maxTouchPoints)!=null?f:0)>1?((T=e.screenWidth)!=null?T:0)>=768?"Tablet":"Mobile":e.pointerType==="coarse"&&e.hoverCapability===false?((D=e.screenWidth)!=null?D:0)>=768?"Tablet":"Mobile":null}return (i=(o=n())!=null?o:r())!=null?i:"PC"}var P=[{name:"Googlebot",detect:/Googlebot/},{name:"Bingbot",detect:/(bingbot|BingPreview)/},{name:"Baiduspider",detect:/(Baiduspider|BaiduMobaider)/},{name:"Bytespider",detect:/Bytespider/},{name:"YandexBot",detect:/YandexBot/},{name:"DuckDuckBot",detect:/DuckDuckBot/},{name:"Slurp",detect:/Slurp/},{name:"Sogou",detect:/(Sogou|sogou).*[Ss]pider/},{name:"360Spider",detect:/360Spider/},{name:"PetalBot",detect:/PetalBot/},{name:"Applebot-Extended",detect:/Applebot-Extended/},{name:"Applebot",detect:/Applebot/},{name:"Facebookbot",detect:/(facebookexternalhit|FacebookBot)/},{name:"Twitterbot",detect:/Twitterbot/},{name:"LinkedInBot",detect:/LinkedInBot/},{name:"PinterestBot",detect:/Pinterest/},{name:"Slackbot",detect:/Slackbot/},{name:"Discordbot",detect:/Discordbot/},{name:"TelegramBot",detect:/TelegramBot/},{name:"WhatsApp",detect:/WhatsApp/},{name:"SemrushBot",detect:/SemrushBot/},{name:"AhrefsBot",detect:/AhrefsBot/},{name:"MJ12bot",detect:/MJ12bot/},{name:"ScreamingFrog",detect:/Screaming Frog/},{name:"DataForSeoBot",detect:/DataForSeoBot/},{name:"GPTBot",detect:/GPTBot/},{name:"OAI-SearchBot",detect:/OAI-SearchBot/},{name:"ChatGPT-User",detect:/ChatGPT-User/},{name:"ClaudeBot",detect:/ClaudeBot/},{name:"PerplexityBot",detect:/PerplexityBot/},{name:"CCBot",detect:/CCBot/},{name:"AdsBot",detect:/AdsBot-Google/},{name:"Google-Extended",detect:/Google-Extended/},{name:"Meta-ExternalAgent",detect:/meta-externalagent/i},{name:"Amazonbot",detect:/Amazonbot/},{name:"Diffbot",detect:/Diffbot/},{name:"cohere-ai",detect:/cohere-ai/},{name:"YouBot",detect:/YouBot/},{name:"UptimeRobot",detect:/UptimeRobot/},{name:"ia_archiver",detect:/ia_archiver/},{name:"GenericBot",detect:/(bot|crawler|spider|crawling|scraper)/i}];function ce(t,e){let r=e?[...P.slice(0,-1),...e,P[P.length-1]]:P;for(let n of r)if(n.detect.test(t))return {isBot:true,botName:n.name};return {isBot:false,botName:"unknown"}}var me=[{name:"arm64",detect:/(aarch64|arm64|ARM64|iPhone|iPad|iPod)/},{name:"arm",detect:/\bARM\b/},{name:"x86_64",detect:/(x86_64|Win64|WOW64|x64;|amd64)/i},{name:"x86",detect:/(i[36]86|i686|x86;)/}];function pe(t,e){if(e!=null&&e.highEntropyData){let{architecture:o,bitness:i}=e.highEntropyData;if(o==="arm")return i==="64"?"arm64":"arm";if(o==="x86")return i==="64"?"x86_64":"x86"}let r=e==null?void 0:e.webglRenderer;if(r){if(/Apple\s+(M\d|A\d{1,2}[A-Z]?)\b/i.test(r)||/APPLE M\d/i.test(r)||/^Apple GPU$/i.test(r))return "arm64";if(/\b(Intel|AMD|NVIDIA|Radeon)\b/i.test(r))return "x86_64"}let n=e==null?void 0:e.platform;if(n){if(/iPhone|iPad|iPod/.test(n)||/arm64|aarch64/i.test(n))return "arm64";if(/arm/i.test(n))return "arm";if(/Win64|WOW64|x86_64/i.test(n))return "x86_64";if(/Win32|i686/i.test(n))return "x86"}for(let o of me)if(o.detect.test(t))return o.name;return "unknown"}var he=/(HeadlessChrome|Headless|PhantomJS|Electron\/|Playwright|jsdom\/|Selenium)/;function le(t){return he.test(t)}function R(t){return !!(/; wv/.test(t)||/like Mac OS X/.test(t)&&!/Version\//.test(t)&&!/Safari\//.test(t))}function B(){return typeof navigator=="undefined"?{userAgent:"",platform:"",language:"",maxTouchPoints:0}:navigator}function x(t,e){var r;try{return !!((r=t.mimeTypes)!=null&&r.namedItem(e))}catch(n){return false}}function W(t){var n,o;return ((o=(n=t.browserLanguage)!=null?n:t.language)!=null?o:"").replace(/-\w+/g,i=>i.toUpperCase())||"unknown"}var we=[["Microsoft Edge","Edge"],["Opera","Opera"],["Vivaldi","Vivaldi"],["Google Chrome","Chrome"],["Chromium","Chromium"]];function xe(t){var i,d,c,l,p,g,b;let e=((i=t.platform)!=null?i:"").toLowerCase(),r=(d=t.userAgentData)==null?void 0:d.platform,n=(c=t.highEntropyData)==null?void 0:c.platformVersion,o=!!(n&&n!=="0.0.0");if((l=t.webglCompressedFormats)!=null&&l.pvrtc&&!t.webglCompressedFormats.s3tc)return "iOS";if(t.webglRenderer&&/^ANGLE\b/.test(t.webglRenderer))return e.startsWith("mac")||r==="macOS"?"MacOS":e.startsWith("win")||r==="Windows"?"Windows":r==="Chrome OS"?"Chrome OS":null;if(t.webglRenderer&&(/Adreno/i.test(t.webglRenderer)||/Mali[-\s]/i.test(t.webglRenderer)))return "Android";if(r&&o){let w={Windows:"Windows",macOS:"MacOS",Android:"Android",iOS:"iOS","Chrome OS":"Chrome OS"}[r];if(w)return w}return e.startsWith("mac")?"MacOS":e.startsWith("win")?"Windows":e==="iphone"||e==="ipad"||e==="ipod"||((p=t.safeAreaInsetTop)!=null?p:0)>0?"iOS":r==="Chrome OS"?"Chrome OS":r==="Android"&&(e.includes("android")||/^linux arm/i.test((g=t.platform)!=null?g:""))||e.includes("android")||/^linux arm/i.test((b=t.platform)!=null?b:"")?"Android":null}function ve(t){return /iPhone/.test(t)?"iPhone":/iPad/.test(t)?"iPad":/iPod/.test(t)?"iPod":/Macintosh/.test(t)?"MacIntel":/Windows NT/.test(t)?/Win64|WOW64/i.test(t)?"Win64":"Win32":/CrOS/.test(t)?"Linux x86_64":/Android/.test(t)?/aarch64|arm64/i.test(t)?"Linux aarch64":"Linux armv8l":/Linux/.test(t)?/x86_64/i.test(t)?"Linux x86_64":/aarch64|arm64/i.test(t)?"Linux aarch64":"Linux":"unknown"}function ue(t){return t.replace(/_/g,"-").split("-").map((r,n)=>n===0?r.toLowerCase():r.length===4?r[0].toUpperCase()+r.slice(1).toLowerCase():r.toUpperCase()).join("-")}function ye(t){let e=/\bLanguage\/([a-zA-Z]{2,3}(?:[-_][a-zA-Z]{2,4}){1,2})\b/i.exec(t);if(e)return ue(e[1]);let r=/[;(]\s*([a-z]{2,3}(?:[-_][A-Za-z]{2,4})+)\s*[;)]/g,n;for(;(n=r.exec(t))!==null;)if(n[1].replace(/_/g,"-").split("-").length>=2)return ue(n[1]);return "unknown"}function _(t,e={}){var L,F,I,G,H,U,j,Q,z,K,X,Y,q,Z,J,$;let r=(L=e.ctx)!=null?L:e.nav,n=(I=(F=e.ctx)==null?void 0:F.windowsVersion)!=null?I:e.windowsVersion,{browser:o,version:i}=N(t),{os:d,osVersion:c}=ae(t,n),l=d,p=c,g=de(t,r),b=pe(t,(G=e.ctx)!=null?G:r),a=r,{isBot:w,botName:S}=ce(t,e.customBotDefs),A=le(t),O=e.language||(a!=null&&a.language||a!=null&&a.browserLanguage?W(a):"")||ye(t),C=(a==null?void 0:a.platform)||ve(t),m=o,f=i;if((H=e.ctx)!=null&&H.hasBrave&&(m="Brave"),a){let s=typeof chrome!="undefined"?chrome:void 0,y=/Chrome\/([\d]+)/.exec(t),h=y?parseInt(y[1],10):0;if(s)if(s.adblock2345||s.common2345)m="2345Explorer",f="unknown";else {let u=false;if(x(a,"application/360softmgrplugin")||x(a,"application/mozilla-npqihooquicklogin")||h>36&&typeof showModalDialog!="undefined"?u=true:h>45&&(u=x(a,"application/vnd.chromium.remoting-viewer"),!u&&h>=69&&(u=x(a,"application/hwepass2001.installepass2001")||x(a,"application/asx"))),u){let v=((U=a.connection)==null?void 0:U.saveData)===true;x(a,"application/gameplugin")||!v?m="360SE":m="360EE",f="unknown";}}}if(m==="Baidu"&&/(Opera|OPR|OPT)/.test(t)){m="Opera";let s=(Q=(j=/OPR\/([\d.]+)/.exec(t))!=null?j:/OPT\/([\d.]+)/.exec(t))!=null?Q:/Opera\/([\d.]+)/.exec(t);f=(z=s==null?void 0:s[1])!=null?z:"unknown";}if(m==="Chrome"&&/\S+Browser\//.test(t)){let s=/(\S+Browser)\/([\d.]+)/.exec(t);s&&(m=s[1],f=s[2]);}if(m==="Firefox"&&a)try{(typeof clientInformation!="undefined"||typeof u2f=="undefined")&&(m="Firefox Nightly");}catch(s){}if(l==="iOS"&&m==="Safari"){let s=/Version\/([\d.]+)/.exec(t);s&&parseInt(s[1],10)>parseInt(p,10)&&(p=s[1]);}if(l==="MacOS"&&m==="Safari"){let s=/Version\/([\d.]+)/.exec(t);s&&parseInt(s[1],10)>=26&&(p=s[1]);}if(e.ctx){let s=xe(e.ctx);if(s!==null&&(s!==d&&(l=s,p="unknown"),l!=="Windows")){let h=(K=e.ctx.highEntropyData)==null?void 0:K.platformVersion;if(h&&h!=="0.0.0"){let u=h.split(".").map(Number);for(;u.length>1&&u[u.length-1]===0;)u.pop();u[0]&&(p=u.join("."));}}let y=(X=e.ctx.highEntropyData)==null?void 0:X.fullVersionList;if(y)for(let[h,u]of we){let v=y.find(ge=>ge.brand===h);if(v!=null&&v.version){m=u,f=v.version;break}}}let T=oe(t,m,f),D=parseInt((Y=f.split(".")[0])!=null?Y:"0",10)||0,M=($=(J=(Z=(q=e.ctx)!=null?q:e.nav)==null?void 0:Z.connection)==null?void 0:J.effectiveType)!=null?$:"unknown";return {browser:m,version:f,versionMajor:D,engine:T,os:l,osVersion:p,device:g,arch:b,isWebview:R(t),isHeadless:A,isBot:w,botName:S,language:O,platform:C,connectionType:M}}var Pe=[".AppleSystemUIFont","Segoe UI","Noto Color Emoji","Ubuntu","HarmonyOS Sans"];function Be(){try{let e=document.createElement("canvas").getContext("2d");if(!e)return {};let r="mmmmmmmmmmlli";e.font="72px monospace";let n=e.measureText(r).width,o={};for(let i of Pe)e.font=`72px '${i}', monospace`,o[i]=e.measureText(r).width!==n;return o}catch(t){return {}}}function Ee(){var t,e;try{let r=document.createElement("canvas"),n=(t=r.getContext("webgl"))!=null?t:r.getContext("experimental-webgl");if(!n)return {};let o=n.getExtension("WEBGL_debug_renderer_info"),i={maxTextureSize:n.getParameter(n.MAX_TEXTURE_SIZE),fragPrecision:(e=n.getShaderPrecisionFormat(n.FRAGMENT_SHADER,n.HIGH_FLOAT))==null?void 0:e.rangeMax,compressedFormats:{s3tc:!!n.getExtension("WEBGL_compressed_texture_s3tc"),pvrtc:!!n.getExtension("WEBGL_compressed_texture_pvrtc"),etc2:!!n.getExtension("WEBGL_compressed_texture_etc"),astc:!!n.getExtension("WEBGL_compressed_texture_astc_ldr")}};return o&&(i.renderer=n.getParameter(o.UNMASKED_RENDERER_WEBGL),i.vendor=n.getParameter(o.UNMASKED_VENDOR_WEBGL)),i}catch(r){return {}}}function Se(){try{let t=document.createElement("div");t.style.cssText="position:fixed;top:env(safe-area-inset-top,0px);visibility:hidden;pointer-events:none",document.body.appendChild(t);let e=parseFloat(getComputedStyle(t).top);return document.body.removeChild(t),isNaN(e)?0:e}catch(t){return 0}}function Ae(){var t;try{let e=(t=window.AudioContext)!=null?t:window.webkitAudioContext;if(!e)return;let r=new e,n=r.sampleRate;return r.close(),n}catch(e){return}}function Oe(){try{if(window.matchMedia("(pointer: coarse)").matches)return "coarse";if(window.matchMedia("(pointer: fine)").matches)return "fine";if(window.matchMedia("(pointer: none)").matches)return "none"}catch(t){}}function Ce(){try{return window.matchMedia("(hover: hover)").matches}catch(t){return}}function Te(t){var r;if(!t)return null;let e=parseInt((r=t.split(".")[0])!=null?r:"0",10);return isNaN(e)?null:e>=13?"11":"10"}async function fe(){var r,n,o,i,d;let t=B(),e={userAgent:t.userAgent,platform:t.platform,language:t.language,maxTouchPoints:t.maxTouchPoints};if(t.browserLanguage!==void 0&&(e.browserLanguage=t.browserLanguage),t.mimeTypes!==void 0&&(e.mimeTypes=t.mimeTypes),t.connection!==void 0&&(e.connection=t.connection),t.userAgentData!==void 0&&(e.userAgentData=t.userAgentData),typeof navigator!="undefined"&&(e.hardwareConcurrency=navigator.hardwareConcurrency,e.deviceMemory=navigator.deviceMemory),typeof window!="undefined"){e.devicePixelRatio=window.devicePixelRatio,e.screenWidth=(r=window.screen)==null?void 0:r.width,e.screenHeight=(n=window.screen)==null?void 0:n.height,e.safeAreaInsetTop=Se(),e.pointerType=Oe(),e.hoverCapability=Ce(),e.fontProbes=Be(),e.audioSampleRate=Ae(),e.hasVibration="vibrate"in navigator,e.hasDeviceMotion="DeviceMotionEvent"in window;try{e.hasBrave=(d=await((i=(o=navigator.brave)==null?void 0:o.isBrave)==null?void 0:i.call(o)))!=null?d:!1;}catch(a){e.hasBrave=false;}let{renderer:c,vendor:l,maxTextureSize:p,fragPrecision:g,compressedFormats:b}=Ee();c!==void 0&&(e.webglRenderer=c),l!==void 0&&(e.webglVendor=l),p!==void 0&&(e.webglMaxTextureSize=p),g!==void 0&&(e.webglFragPrecision=g),b!==void 0&&(e.webglCompressedFormats=b);}if(t.userAgentData)try{let c=await t.userAgentData.getHighEntropyValues(["architecture","bitness","model","platformVersion","fullVersionList"]);e.highEntropyData={architecture:c.architecture,bitness:c.bitness,model:c.model,platformVersion:c.platformVersion,fullVersionList:c.fullVersionList},t.userAgentData.platform==="Windows"&&(e.windowsVersion=Te(c.platformVersion));}catch(c){}return e}var{version:De}=ee;function E(){let t=B();return _(t.userAgent,{nav:t})}E.detect=async t=>{let e=await fe();return _(t!=null?t:e.userAgent,{ctx:e})};E.isWebview=R;E.getLanguage=()=>W(B());E.VERSION=De;var Me=E;
|
|
2
|
+
return Me;})();//# sourceMappingURL=index.min.js.map
|
|
3
3
|
//# sourceMappingURL=index.min.js.map
|