mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-11-15 14:42:16 +03:00
Compare commits
91 Commits
2.0.3-pro-
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a5b321347 | ||
|
|
e9f78ceb80 | ||
|
|
38301f8803 | ||
|
|
e5648826b9 | ||
|
|
a558cc1a5b | ||
|
|
cb9b50a81a | ||
|
|
042c57cc10 | ||
|
|
232fb321f1 | ||
|
|
a3a7a5e377 | ||
|
|
2d8c8fa142 | ||
|
|
d84ba1888b | ||
|
|
061cf0e90f | ||
|
|
2882014f0e | ||
|
|
3eea0643c5 | ||
|
|
5f1ed83225 | ||
|
|
5349bb52ed | ||
|
|
9ba4d2b207 | ||
|
|
4c935c0139 | ||
|
|
ae7b5e15e5 | ||
|
|
44165a6e01 | ||
|
|
fc5125042c | ||
|
|
4e6259ad7f | ||
|
|
b3bc89c463 | ||
|
|
5749302c47 | ||
|
|
6565d24567 | ||
|
|
b3281b7c12 | ||
|
|
bd6bb216bd | ||
|
|
e7e7aaad4c | ||
|
|
95d2b151a3 | ||
|
|
737cdd4d40 | ||
|
|
74064b0cac | ||
|
|
3ea5721e86 | ||
|
|
a4342b01d4 | ||
|
|
31bf36c36d | ||
|
|
9bef871e41 | ||
|
|
b1d9dcafcd | ||
|
|
146f182533 | ||
|
|
ce242a362f | ||
|
|
2078b1ec92 | ||
|
|
7dcbb8def3 | ||
|
|
f810a6d1d9 | ||
|
|
0e05332609 | ||
|
|
48a1f34c28 | ||
|
|
fb1ed5cf6b | ||
|
|
3e65196b57 | ||
|
|
4e421e72fe | ||
|
|
98cf19c8c5 | ||
|
|
c9badeb345 | ||
|
|
9003fe5724 | ||
|
|
975c4860f4 | ||
|
|
647b6232bd | ||
|
|
95485f7b5d | ||
|
|
74ef71cf63 | ||
|
|
9e6dff6dc3 | ||
|
|
bf5155ec8a | ||
|
|
ecbc0336b6 | ||
|
|
ab299a23b7 | ||
|
|
3fe137e533 | ||
|
|
0bb6e24837 | ||
|
|
a19977ce4c | ||
|
|
088383b9bd | ||
|
|
c9d008e97a | ||
|
|
86b3cd37e2 | ||
|
|
a9378427ed | ||
|
|
f9836f1981 | ||
|
|
f300478bdc | ||
|
|
ee88f16620 | ||
|
|
d28d74fea7 | ||
|
|
1282175bac | ||
|
|
e312298283 | ||
|
|
5e7d0b25a3 | ||
|
|
5f1e498bec | ||
|
|
72d0c2acb3 | ||
|
|
a3549efc22 | ||
|
|
29677bcd3d | ||
|
|
64a933bae8 | ||
|
|
f51ed79118 | ||
|
|
72c59b5351 | ||
|
|
466a8b26be | ||
|
|
3d6e326f49 | ||
|
|
be16c04a33 | ||
|
|
6a2a3a61b6 | ||
|
|
14a51039aa | ||
|
|
944c1fb260 | ||
|
|
b9a710978e | ||
|
|
e069133f51 | ||
|
|
848cd1d1e4 | ||
|
|
e1216ff36b | ||
|
|
598c51c69c | ||
|
|
8ae88b6aa5 | ||
|
|
cd3bef7405 |
82
CHANGELOG.md
82
CHANGELOG.md
@@ -23,8 +23,12 @@
|
|||||||
- **Support for Custom/Predefined Extensions:**
|
- **Support for Custom/Predefined Extensions:**
|
||||||
- Pass custom regexes or predefined extensions as a list to `UAParser()`
|
- Pass custom regexes or predefined extensions as a list to `UAParser()`
|
||||||
|
|
||||||
- **Support for CLI Parsing:**
|
- **Support for CLI Processing:**
|
||||||
- Parse a user-agent directly from the command line using `npx ua-parser-js "[User-Agent]"`
|
- Directly parse user-agent strings from the command line:
|
||||||
|
`npx ua-parser-js "<User-Agent>"`
|
||||||
|
- Process batch data from files:
|
||||||
|
`npx ua-parser-js --input-file=log.txt >> result.json` or
|
||||||
|
`npx ua-parser-js --input-file=log.txt --output-file=result.json`
|
||||||
|
|
||||||
- **Enhanced Detection with Client Hints:**
|
- **Enhanced Detection with Client Hints:**
|
||||||
- `withClientHints()`: Improves detection accuracy by leveraging client hints
|
- `withClientHints()`: Improves detection accuracy by leveraging client hints
|
||||||
@@ -65,6 +69,70 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Version 2.0.6
|
||||||
|
- Add new CLI feature: processing batch user-agent data from file and output as JSON
|
||||||
|
- Fix `setUA()`: trim leading space from user-agent string input
|
||||||
|
- Replace `undici` dependency with node's internal `Headers`
|
||||||
|
- Add new browser: Bing, Qwant
|
||||||
|
- Add new device vendor: Hisense, Wiko
|
||||||
|
- Improve browser detection: Mozilla, Pale Moon
|
||||||
|
- Improve CPU detection: 68k
|
||||||
|
- Improve device detection: Apple, BlackBerry, Huawei, Nokia, Xiaomi
|
||||||
|
- Improve OS detection: iOS 26
|
||||||
|
- `extensions` submodule:
|
||||||
|
- Add new fetcher: Discordbot, KeybaseBot, Slackbot, Slackbot-LinkExpanding, Slack-ImgProxy, Twitterbot
|
||||||
|
- Add new crawler: Qwantbot-news, SurdotlyBot, SwiftBot
|
||||||
|
|
||||||
|
## Version 2.0.5
|
||||||
|
|
||||||
|
- Add new browser: Zalo
|
||||||
|
- Add new CPU arch: alpha
|
||||||
|
- Add new device vendor: Philips
|
||||||
|
- Improve device detection: Pico
|
||||||
|
- Fix parsing error on pages with modified Array prototypes
|
||||||
|
- Improve type declarations:
|
||||||
|
- Replace `node-fetch` dependency with `undici`
|
||||||
|
- Replace hardcoded string values with enum from `enum` submodule
|
||||||
|
- `enums` submodule:
|
||||||
|
- Add `Extension` enum for `extensions` submodule
|
||||||
|
- Type declaration file now automatically generated using build script
|
||||||
|
- Naming adjustments:
|
||||||
|
- `Browser` => `BrowserName`
|
||||||
|
- `CPU` => `CPUArch`
|
||||||
|
- `Device` => `DeviceType`
|
||||||
|
- `Vendor` => `DeviceVendor`
|
||||||
|
- `Engine` => `EngineName`
|
||||||
|
- `OS` => `OSName`
|
||||||
|
- `extensions` submodule:
|
||||||
|
- Add new crawlers:
|
||||||
|
APIs-Google, Algolia Crawler, Algolia Crawler Renderscript, Baidu-ADS, BLEXBot, botify, Bravebot, Claude-Web, cohere-training-data-crawler, contxbot, Cotoyogi, Coveobot, CriteoBot, DeepSeekBot, DuckDuckGo-Favicons-Bot, Elastic, FirecrawlAgent, Freespoke, Google-CloudVertexBot, HuggingFace-Bot, Kagibot, Kangaroo Bot, marginalia, msnbot, OnCrawl, Replicate-Bot, RunPod-Bot, SBIntuitionsBot, SeekportBot, Siteimprove, Sogou Pic Spider, TikTokSpider, TwinAgent, v0bot, webzio, Webzio-Extended, xAI-Bot, YandexAccessibilityBot, YandexAdditionalBot, YandexAdNet, YandexBot MirrorDetector, YandexBlogs, YandexComBot, YandexFavicons, YandexImageResizer, YandexImages, YandexMarket, YandexMetrika, YandexMedia, YandexMobileBot, YandexMobileScreenShotBot, YandexNews, YandexOntoDB, YandexOntoDBAPI, YandexPartner, YandexRCA, YandexRenderResourcesBot, YandexScreenshotBot, YandexSpravBot, YandexTracker, YandexVertis, YandexVerticals, YandexVideo, YandexVideoParser, YandexWebmaster, YepBot, ZumBot
|
||||||
|
- Add new fetchers:
|
||||||
|
Asana, bitlybot, Blueno, BufferLinkPreviewBot, Chrome-Lighthouse, Gemini-Deep-Research, HubSpot Page Fetcher, kakaotalk-scrap, vercel-favicon-bot, vercel-screenshot-bot, vercelflags, verceltracing, YaDirectFetcher, YandexCalendar, YandexDirect, YandexDirectDyn, YandexForDomain, YandexPagechecker, YandexSearchShop, YandexSitelinks, YandexUserproxy
|
||||||
|
- `helpers` submodule:
|
||||||
|
- Add some crawler to `isAIBot()`:
|
||||||
|
Bravebot, cohere-training-data-crawler, FirecrawlAgent, HuggingFace-Bot, Kangaroo Bot, PanguBot, Replicate-Bot, RunPod-Bot, TikTokSpider, Together-Bot, v0bot, xAI-Bot
|
||||||
|
|
||||||
|
## Version 2.0.4
|
||||||
|
|
||||||
|
- Add new browser: Edge WebView, Edge WebView2
|
||||||
|
- Add new device vendor: Lava, Retroid, Vizio
|
||||||
|
- Add new OS: ArcaOS, Knoppix, Xubuntu, Windows CE, Windows RT
|
||||||
|
- Improve device detection: Google Pixel & Pixelbook Series, HMD, Infinix, LG WebOS TV, Motorola, Nothing, OnePlus, Sony, Tecno
|
||||||
|
- Improve OS detection: AIX, Arch, Fuchsia, Haiku, HarmonyOS, Mint, MorphOS, Solaris, Windows
|
||||||
|
- Improve `withClientHints()` browser naming adjustments: `Microsoft Edge WebView2` => `Edge WebView2`
|
||||||
|
- Identify device that uses Firefox Reality / Wolvic as `xr`
|
||||||
|
- Identify device with large screen as `smarttv`
|
||||||
|
- Identify Windows CE & Windows RT as distinct OS variants
|
||||||
|
- `extensions` submodule:
|
||||||
|
- Remove lookbehind assertion to ensure regex compatibility
|
||||||
|
- Add new crawlers: ChatGLM, Daum, iAskBot, Onespot, Qwantbot, Startpage
|
||||||
|
- Add new emails: Apple's Mail, DaumMail, Polymail, ProtonMail, SparkDesktop, Zimbra, ZohoMail-Desktop
|
||||||
|
- Add new fetchers: Iframely, MistralAI-User, Perplexity-User
|
||||||
|
- Add new inApps: Discord, Evernote, Figma, Flipboard, Mattermost, Notion, Postman, Rambox, Rocket.Chat, Microsoft Teams, TikTok Lite, VS Code
|
||||||
|
- Add new libraries: AdobeAIR, aiohttp, nutch, httpx, urllib3
|
||||||
|
- `enum` submodule:
|
||||||
|
- Fix mistakenly placed `BLU` categorized as browser name instead of device vendor
|
||||||
|
|
||||||
## Version 2.0.3
|
## Version 2.0.3
|
||||||
|
|
||||||
- Add new browser: Dooble, Ecosia, LG Browser, Otter, qutebrowser, Surf
|
- Add new browser: Dooble, Ecosia, LG Browser, Otter, qutebrowser, Surf
|
||||||
@@ -219,6 +287,16 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Version 0.7.41 / 1.0.41
|
||||||
|
- Add new browser: Daum, Ladybird
|
||||||
|
- Add new device vendor: HMD
|
||||||
|
- Add new engine: LibWeb
|
||||||
|
- Add new os: Windows IoT, Ubuntu Touch
|
||||||
|
- Improve cpu detection: ARM, x86
|
||||||
|
- Improve device vendor detection: Apple, Archos, Generic, Google, Honor, Huawei, Infinix, Nvidia, Lenovo, Nokia, OnePlus, Xiaomi
|
||||||
|
- Improve device type detection: smarttv, wearables
|
||||||
|
- Improve os detection: Linux, Symbian
|
||||||
|
|
||||||
## Version 0.7.40 / 1.0.40
|
## Version 0.7.40 / 1.0.40
|
||||||
- Add new browser: 115, LibreWolf, Slimboat, Slimjet
|
- Add new browser: 115, LibreWolf, Slimboat, Slimjet
|
||||||
- Add new device: Advan, Cat, Energizer, IMO, Micromax, Smartfren
|
- Add new device: Advan, Cat, Energizer, IMO, Micromax, Smartfren
|
||||||
|
|||||||
99
README.md
99
README.md
@@ -1,5 +1,11 @@
|
|||||||
|
#### Featured Sponsors
|
||||||
|
|
||||||
|
[](https://ref.wisprflow.ai/Rxj3n8H)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
[](https://uaparser.dev)
|
[](https://uaparser.dev)
|
||||||
[](https://uaparser.dev)
|
[](https://uaparser.dev)
|
||||||
[](https://uaparser.dev)
|
[](https://uaparser.dev)
|
||||||
[](https://uaparser.dev)
|
[](https://uaparser.dev)
|
||||||
|
|
||||||
@@ -12,13 +18,12 @@
|
|||||||
<a href="https://www.npmjs.com/package/ua-parser-js"><img src="https://img.shields.io/npm/v/ua-parser-js.svg?logo=npm&color=red&style=for-the-badge"></a>
|
<a href="https://www.npmjs.com/package/ua-parser-js"><img src="https://img.shields.io/npm/v/ua-parser-js.svg?logo=npm&color=red&style=for-the-badge"></a>
|
||||||
<a href="https://cdnjs.com/libraries/UAParser.js"><img src="https://img.shields.io/cdnjs/v/UAParser.js.svg?color=orange&style=for-the-badge"></a>
|
<a href="https://cdnjs.com/libraries/UAParser.js"><img src="https://img.shields.io/cdnjs/v/UAParser.js.svg?color=orange&style=for-the-badge"></a>
|
||||||
<img src="https://img.shields.io/ossf-scorecard/github.com/faisalman/ua-parser-js?label=openssf%20scorecard&style=for-the-badge">
|
<img src="https://img.shields.io/ossf-scorecard/github.com/faisalman/ua-parser-js?label=openssf%20scorecard&style=for-the-badge">
|
||||||
|
<a target="_blank" href="https://discord.com/channels/1406959509087453236/1406959509930381375"><img alt="Discord invite" src="https://dcbadge.limes.pink/api/server/https://discord.com/channels/1406959509087453236/1406959509930381375"></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
# UAParser.js
|
# UAParser.js
|
||||||
|
|
||||||
The most comprehensive, compact, & up-to-date isomorphic JavaScript library to detect
|
The most comprehensive, compact, and up-to-date JavaScript library to detect user's browser, OS, CPU, and device type/model. Also detect bots, apps, and more. Runs seamlessly in the browser (client-side) or Node.js (server-side).
|
||||||
user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
|
|
||||||
(client-side) or node.js (server-side).
|
|
||||||
|
|
||||||
# Demo
|
# Demo
|
||||||
|
|
||||||
@@ -33,7 +38,7 @@ user's Browser, Engine, OS, CPU, and Device type/model. Runs either in browser
|
|||||||
Before upgrading from `v0.7` / `v1.0`, please read [CHANGELOG](CHANGELOG.md) to
|
Before upgrading from `v0.7` / `v1.0`, please read [CHANGELOG](CHANGELOG.md) to
|
||||||
see what's new & breaking.
|
see what's new & breaking.
|
||||||
|
|
||||||
# License Options
|
# Package & Pricing
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
@@ -46,14 +51,14 @@ see what's new & breaking.
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>License options</td>
|
<td>License options</td>
|
||||||
<td>MIT (v0.7~v1.0)</td>
|
<td>MIT (v1.x)</td>
|
||||||
<td>AGPL (>=v2.0)</td>
|
<td>AGPL (v2.x)</td>
|
||||||
<td>PRO Personal</td>
|
<td>PRO Personal</td>
|
||||||
<td>PRO Business</td>
|
<td>PRO Business</td>
|
||||||
<td>PRO Enterprise</td>
|
<td>PRO Enterprise</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Browser detection</td>
|
<td>Browser Detection</td>
|
||||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -61,7 +66,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>CPU detection</td>
|
<td>CPU Detection</td>
|
||||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -69,7 +74,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Device detection</td>
|
<td>Device Detection</td>
|
||||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -77,7 +82,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Engine detection</td>
|
<td>Rendering Engine Detection</td>
|
||||||
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
<td><a href="#demo" title="Basic detection">⚠️</a></td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -93,7 +98,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Bot detection</td>
|
<td>Enhanced+ Accuracy</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -101,7 +106,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>AI Bot detection</td>
|
<td>Bot Detection</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -109,7 +114,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Extras (Apps, Libs, Emails, Media Players, etc) detection</td>
|
<td>AI Detection</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -117,7 +122,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Enhanced detection result</td>
|
<td>Extra Detections (Apps, Libs, Emails, Media Players, Crawlers, and more)</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -125,7 +130,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Client Hints support</td>
|
<td>Client Hints Support</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -133,7 +138,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>CommonJS support</td>
|
<td>CommonJS Support</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -141,7 +146,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>ES modules support</td>
|
<td>ESM Support</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -149,7 +154,15 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>npm module</td>
|
<td>TypeScript Definitions</td>
|
||||||
|
<td><a href="#demo" title="Community version">✅</a></td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>npm Module Available</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -157,15 +170,15 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>TypeScript declarations</td>
|
<td>Direct Downloads Available</td>
|
||||||
<td><a href="#demo" title="Community version">⚠️</a></td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Allows commercial use</td>
|
<td>Commercial Use Allowed</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
@@ -173,7 +186,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Permissive (non-copyleft) license</td>
|
<td>Permissive (non-Copyleft) License</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td><strong title="Copyleft license">❌</strong></td>
|
<td><strong title="Copyleft license">❌</strong></td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -181,15 +194,31 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Unlimited use per 1 license</td>
|
<td>No Open-Source Obligations</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td><strong title="Copyleft license">❌</strong></td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td><strong title="1 project per 1 license">❌</strong></td>
|
|
||||||
<td>✅</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>1-year product support</td>
|
<td>Unlimited End-Products</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td><strong title="1 end-product per license">❌</strong></td>
|
||||||
|
<td>✅</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Unlimited Deployments</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td>✅</td>
|
||||||
|
<td><strong title="1 TLD or deliverable per license">❌</strong></td>
|
||||||
|
<td>✅</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>1-year Product Support</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>❌</td>
|
<td>❌</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -197,7 +226,7 @@ see what's new & breaking.
|
|||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Lifetime updates</td>
|
<td>Lifetime Updates</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
<td>✅</td>
|
<td>✅</td>
|
||||||
@@ -206,8 +235,8 @@ see what's new & breaking.
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Price</td>
|
<td>Price</td>
|
||||||
<td><strong title="Pay as you want">FREE (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/1.0.x/license.md">License</a>)</strong></td>
|
<td><strong title="Pay as you want">FREE<sup>*</sup> (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/1.0.x/license.md">License</a>)</strong></td>
|
||||||
<td><strong title="Pay as you want">FREE (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/master/LICENSE.md">License</a>)</strong></td>
|
<td><strong title="Pay as you want">FREE<sup>*</sup> (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/master/LICENSE.md">License</a>)</strong></td>
|
||||||
<td><strong title="$14 (one-time fee)">$14 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-personal/LICENSE.md">License</a>)</strong></td>
|
<td><strong title="$14 (one-time fee)">$14 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-personal/LICENSE.md">License</a>)</strong></td>
|
||||||
<td><strong title="$29 (one-time fee)">$29 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-business/LICENSE.md">License</a>)</strong></td>
|
<td><strong title="$29 (one-time fee)">$29 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-business/LICENSE.md">License</a>)</strong></td>
|
||||||
<td><strong title="$599 (one-time fee)">$599 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-enterprise/LICENSE.md">License</a>)</strong></td>
|
<td><strong title="$599 (one-time fee)">$599 (<a target="_blank" href="https://raw.githubusercontent.com/faisalman/ua-parser-js/pro-enterprise/LICENSE.md">License</a>)</strong></td>
|
||||||
@@ -236,10 +265,7 @@ Made with [contributors-img](https://contrib.rocks).
|
|||||||
|
|
||||||
## Backers & Sponsors
|
## Backers & Sponsors
|
||||||
|
|
||||||
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/organizations.svg?avatarHeight=64"></a>
|
Support the **open-source editions** of UAParser.js through one of the following options:
|
||||||
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/individuals.svg?avatarHeight=64"></a>
|
|
||||||
|
|
||||||
You can support the open-source editions of UAParser.js through one of the following options:
|
|
||||||
|
|
||||||
[](https://opencollective.com/ua-parser-js)
|
)](https://opencollective.com/ua-parser-js)
|
||||||
@@ -248,4 +274,7 @@ You can support the open-source editions of UAParser.js through one of the follo
|
|||||||
[](https://paypal.me/faisalman)
|
)](https://paypal.me/faisalman)
|
||||||
[](https://store.faisalman.com/buy/3d71f2f3-cf4d-473c-892a-9d4497c890be)
|
)](https://store.faisalman.com/buy/3d71f2f3-cf4d-473c-892a-9d4497c890be)
|
||||||
|
|
||||||
|
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/organizations.svg?avatarHeight=64"></a>
|
||||||
|
<a href="https://opencollective.com/ua-parser-js"><img src="https://opencollective.com/ua-parser-js/individuals.svg?avatarHeight=64"></a>
|
||||||
|
|||||||
4
dist/ua-parser.min.js
vendored
4
dist/ua-parser.min.js
vendored
File diff suppressed because one or more lines are too long
4
dist/ua-parser.min.mjs
vendored
4
dist/ua-parser.min.mjs
vendored
File diff suppressed because one or more lines are too long
4
dist/ua-parser.pack.js
vendored
4
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
4
dist/ua-parser.pack.mjs
vendored
4
dist/ua-parser.pack.mjs
vendored
File diff suppressed because one or more lines are too long
122
package-lock.json
generated
122
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "2.0.3",
|
"version": "2.0.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "2.0.3",
|
"version": "2.0.6",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@@ -23,10 +23,8 @@
|
|||||||
],
|
],
|
||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node-fetch": "^2.6.12",
|
|
||||||
"detect-europe-js": "^0.1.2",
|
"detect-europe-js": "^0.1.2",
|
||||||
"is-standalone-pwa": "^0.1.1",
|
"is-standalone-pwa": "^0.1.1",
|
||||||
"node-fetch": "^2.7.0",
|
|
||||||
"ua-is-frozen": "^0.1.2"
|
"ua-is-frozen": "^0.1.2"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@@ -402,23 +400,6 @@
|
|||||||
"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
|
"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
|
||||||
"version": "22.13.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
|
|
||||||
"integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
|
|
||||||
"dependencies": {
|
|
||||||
"undici-types": "~6.20.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/node-fetch": {
|
|
||||||
"version": "2.6.12",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz",
|
|
||||||
"integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==",
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*",
|
|
||||||
"form-data": "^4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/normalize-package-data": {
|
"node_modules/@types/normalize-package-data": {
|
||||||
"version": "2.4.4",
|
"version": "2.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
|
||||||
@@ -519,11 +500,6 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/asynckit": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
|
||||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
|
||||||
},
|
|
||||||
"node_modules/balanced-match": {
|
"node_modules/balanced-match": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||||
@@ -664,17 +640,6 @@
|
|||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/combined-stream": {
|
|
||||||
"version": "1.0.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
|
||||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
|
||||||
"dependencies": {
|
|
||||||
"delayed-stream": "~1.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/concat-map": {
|
"node_modules/concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||||
@@ -753,14 +718,6 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/delayed-stream": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/detect-europe-js": {
|
"node_modules/detect-europe-js": {
|
||||||
"version": "0.1.2",
|
"version": "0.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/detect-europe-js/-/detect-europe-js-0.1.2.tgz",
|
||||||
@@ -1011,19 +968,6 @@
|
|||||||
"flat": "cli.js"
|
"flat": "cli.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/form-data": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
|
|
||||||
"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
|
|
||||||
"dependencies": {
|
|
||||||
"asynckit": "^0.4.0",
|
|
||||||
"combined-stream": "^1.0.8",
|
|
||||||
"mime-types": "^2.1.12"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/fs.realpath": {
|
"node_modules/fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
@@ -1591,25 +1535,6 @@
|
|||||||
"node": ">=8.6"
|
"node": ">=8.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mime-db": {
|
|
||||||
"version": "1.52.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
||||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/mime-types": {
|
|
||||||
"version": "2.1.35",
|
|
||||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
|
||||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
|
||||||
"dependencies": {
|
|
||||||
"mime-db": "1.52.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/min-indent": {
|
"node_modules/min-indent": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
|
||||||
@@ -1963,25 +1888,6 @@
|
|||||||
"node": "^10 || ^12 || >=13.7"
|
"node": "^10 || ^12 || >=13.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/node-fetch": {
|
|
||||||
"version": "2.7.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
|
||||||
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
|
||||||
"dependencies": {
|
|
||||||
"whatwg-url": "^5.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": "4.x || >=6.0.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"encoding": "^0.1.0"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"encoding": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/normalize-package-data": {
|
"node_modules/normalize-package-data": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
|
||||||
@@ -2713,11 +2619,6 @@
|
|||||||
"node": ">=8.0"
|
"node": ">=8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tr46": {
|
|
||||||
"version": "0.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
|
||||||
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
|
||||||
},
|
|
||||||
"node_modules/trim-newlines": {
|
"node_modules/trim-newlines": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
|
||||||
@@ -2791,11 +2692,6 @@
|
|||||||
"node": ">=0.8.0"
|
"node": ">=0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici-types": {
|
|
||||||
"version": "6.20.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
|
|
||||||
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
|
|
||||||
},
|
|
||||||
"node_modules/validate-npm-package-license": {
|
"node_modules/validate-npm-package-license": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
|
||||||
@@ -2806,20 +2702,6 @@
|
|||||||
"spdx-expression-parse": "^3.0.0"
|
"spdx-expression-parse": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/webidl-conversions": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
|
||||||
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
|
||||||
},
|
|
||||||
"node_modules/whatwg-url": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
|
||||||
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
|
||||||
"dependencies": {
|
|
||||||
"tr46": "~0.0.3",
|
|
||||||
"webidl-conversions": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/which": {
|
"node_modules/which": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
|
|||||||
31
package.json
31
package.json
@@ -1,25 +1,25 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js",
|
"title": "UAParser.js",
|
||||||
"name": "ua-parser-js",
|
"name": "ua-parser-js",
|
||||||
"version": "2.0.3",
|
"version": "2.0.6",
|
||||||
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
"author": "Faisal Salman <f@faisalman.com> (http://faisalman.com)",
|
||||||
"description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment",
|
"description": "Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent & Client Hints data. Supports browser & node.js environment",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"user-agent",
|
"user-agent",
|
||||||
"client-hints",
|
"client-hints",
|
||||||
"parser",
|
|
||||||
"browser",
|
"browser",
|
||||||
"engine",
|
"engine",
|
||||||
"os",
|
"os",
|
||||||
"device",
|
"device",
|
||||||
"cpu",
|
"cpu",
|
||||||
"jquery-plugin",
|
|
||||||
"ecosystem:jquery",
|
|
||||||
"ua-parser-js",
|
"ua-parser-js",
|
||||||
"browser-detection",
|
"browser-detection",
|
||||||
"device-detection",
|
"device-detection",
|
||||||
"os-detection",
|
"os-detection",
|
||||||
"bot-detection"
|
"bot-detection",
|
||||||
|
"ai-detection",
|
||||||
|
"app-detection",
|
||||||
|
"crawler-detection"
|
||||||
],
|
],
|
||||||
"homepage": "https://uaparser.dev",
|
"homepage": "https://uaparser.dev",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
@@ -190,6 +190,21 @@
|
|||||||
"import": "./src/main/ua-parser.mjs",
|
"import": "./src/main/ua-parser.mjs",
|
||||||
"types": "./src/main/ua-parser.d.ts"
|
"types": "./src/main/ua-parser.d.ts"
|
||||||
},
|
},
|
||||||
|
"./bot-detection": {
|
||||||
|
"require": "./src/bot-detection/bot-detection.js",
|
||||||
|
"import": "./src/bot-detection/bot-detection.mjs",
|
||||||
|
"types": "./src/bot-detection/bot-detection.d.ts"
|
||||||
|
},
|
||||||
|
"./browser-detection": {
|
||||||
|
"require": "./src/browser-detection/browser-detection.js",
|
||||||
|
"import": "./src/browser-detection/browser-detection.mjs",
|
||||||
|
"types": "./src/browser-detection/browser-detection.d.ts"
|
||||||
|
},
|
||||||
|
"./device-detection": {
|
||||||
|
"require": "./src/device-detection/device-detection.js",
|
||||||
|
"import": "./src/device-detection/device-detection.mjs",
|
||||||
|
"types": "./src/device-detection/device-detection.d.ts"
|
||||||
|
},
|
||||||
"./enums": {
|
"./enums": {
|
||||||
"require": "./src/enums/ua-parser-enums.js",
|
"require": "./src/enums/ua-parser-enums.js",
|
||||||
"import": "./src/enums/ua-parser-enums.mjs",
|
"import": "./src/enums/ua-parser-enums.mjs",
|
||||||
@@ -220,15 +235,13 @@
|
|||||||
"test:eslint": "eslint src && eslint script",
|
"test:eslint": "eslint src && eslint script",
|
||||||
"test:jshint": "jshint src/main",
|
"test:jshint": "jshint src/main",
|
||||||
"test:lockfile-lint": "npx lockfile-lint -p package-lock.json",
|
"test:lockfile-lint": "npx lockfile-lint -p package-lock.json",
|
||||||
"test:mocha": "mocha test/unit",
|
"test:mocha": "mocha --recursive test/unit",
|
||||||
"test:playwright": "npx playwright install && playwright test test/e2e --browser all"
|
"test:playwright": "npx playwright install && playwright test test/e2e --browser all"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"detect-europe-js": "^0.1.2",
|
"detect-europe-js": "^0.1.2",
|
||||||
"is-standalone-pwa": "^0.1.1",
|
"is-standalone-pwa": "^0.1.1",
|
||||||
"ua-is-frozen": "^0.1.2",
|
"ua-is-frozen": "^0.1.2"
|
||||||
"node-fetch": "^2.7.0",
|
|
||||||
"@types/node-fetch": "^2.6.12"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/parser": "7.15.8",
|
"@babel/parser": "7.15.8",
|
||||||
|
|||||||
@@ -2,15 +2,18 @@
|
|||||||
/* jshint esversion: 6 */
|
/* jshint esversion: 6 */
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
const generateMJS = (module) => {
|
const defaultReplacements = {
|
||||||
let { src, dest, title, replacements } = module;
|
mjs: [
|
||||||
let text = fs.readFileSync(src, 'utf-8');
|
|
||||||
|
|
||||||
replacements.push(
|
|
||||||
[/const (.+?)\s*=\s*require\(\'\.(.+)\'\)/ig, 'import $1 from \'\.$2.mjs\''],
|
[/const (.+?)\s*=\s*require\(\'\.(.+)\'\)/ig, 'import $1 from \'\.$2.mjs\''],
|
||||||
[/const (.+?)\s*=\s*require\(\'(.+)\'\)/ig, 'import $1 from \'$2\''],
|
[/const (.+?)\s*=\s*require\(\'(.+)\'\)/ig, 'import $1 from \'$2\''],
|
||||||
[/module\.exports =/ig, 'export']
|
[/module\.exports =/ig, 'export']
|
||||||
);
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const generateFile = (module) => {
|
||||||
|
let { src, dest, title, replacements } = module;
|
||||||
|
let text = fs.readFileSync(src, 'utf-8');
|
||||||
|
|
||||||
replacements.forEach(rep => {
|
replacements.forEach(rep => {
|
||||||
text = text.replace(rep[0], rep[1]);
|
text = text.replace(rep[0], rep[1]);
|
||||||
});
|
});
|
||||||
@@ -18,42 +21,72 @@ const generateMJS = (module) => {
|
|||||||
console.log(`Generate ${dest}`);
|
console.log(`Generate ${dest}`);
|
||||||
|
|
||||||
fs.writeFileSync(dest,
|
fs.writeFileSync(dest,
|
||||||
`// Generated ESM version of ${title}
|
`// ${title}
|
||||||
// DO NOT EDIT THIS FILE!
|
// DO NOT EDIT THIS FILE!
|
||||||
// Source: /${src}
|
// Source: /${src}
|
||||||
|
|
||||||
${text}`, 'utf-8');
|
${text}`, 'utf-8');
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const modules = [
|
const files = [
|
||||||
{
|
{
|
||||||
src : 'src/main/ua-parser.js',
|
src : 'src/main/ua-parser.js',
|
||||||
dest : 'src/main/ua-parser.mjs',
|
dest : 'src/main/ua-parser.mjs',
|
||||||
title : 'ua-parser-js',
|
title : 'Generated ESM version of ua-parser-js',
|
||||||
replacements : [
|
replacements : [
|
||||||
[/\(func[\s\S]+strict\';/ig, ''],
|
[/\(func[\s\S]+strict\';/ig, ''],
|
||||||
[/esversion\: 3/ig, 'esversion: 6'],
|
[/esversion\: 3/ig, 'esversion: 6'],
|
||||||
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};']
|
[/\/[\/\s]+export[\s\S]+/ig,'export {UAParser};'],
|
||||||
|
...defaultReplacements.mjs
|
||||||
]
|
]
|
||||||
},{
|
},
|
||||||
|
{
|
||||||
|
src : 'src/bot-detection/bot-detection.js',
|
||||||
|
dest :'src/bot-detection/bot-detection.mjs',
|
||||||
|
title : 'Generated ESM version of ua-parser-js/bot-detection',
|
||||||
|
replacements : [...defaultReplacements.mjs]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src : 'src/browser-detection/browser-detection.js',
|
||||||
|
dest :'src/browser-detection/browser-detection.mjs',
|
||||||
|
title : 'Generated ESM version of ua-parser-js/browser-detection',
|
||||||
|
replacements : [...defaultReplacements.mjs]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src : 'src/device-detection/device-detection.js',
|
||||||
|
dest :'src/device-detection/device-detection.mjs',
|
||||||
|
title : 'Generated ESM version of ua-parser-js/device-detection',
|
||||||
|
replacements : [...defaultReplacements.mjs]
|
||||||
|
},
|
||||||
|
{
|
||||||
src : 'src/enums/ua-parser-enums.js',
|
src : 'src/enums/ua-parser-enums.js',
|
||||||
dest :'src/enums/ua-parser-enums.mjs',
|
dest :'src/enums/ua-parser-enums.mjs',
|
||||||
title : 'ua-parser-js/enums',
|
title : 'Generated ESM version of ua-parser-js/enums',
|
||||||
replacements : []
|
replacements : [...defaultReplacements.mjs]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src : 'src/enums/ua-parser-enums.js',
|
||||||
|
dest :'src/enums/ua-parser-enums.d.ts',
|
||||||
|
title : 'Generated type declarations of ua-parser-js/enums',
|
||||||
|
replacements : [
|
||||||
|
[/(const .+) = object\.freeze\(/ig, 'export $1: Readonly<'],
|
||||||
|
[/(const .+) =( .+;)/ig, 'export $1: typeof$2'],
|
||||||
|
[/}\);/ig, '}>;'],
|
||||||
|
[/module\.exports =.+/igs, '']
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src : 'src/extensions/ua-parser-extensions.js',
|
src : 'src/extensions/ua-parser-extensions.js',
|
||||||
dest : 'src/extensions/ua-parser-extensions.mjs',
|
dest : 'src/extensions/ua-parser-extensions.mjs',
|
||||||
title : 'ua-parser-js/extensions',
|
title : 'Generated ESM version of ua-parser-js/extensions',
|
||||||
replacements : []
|
replacements : [...defaultReplacements.mjs]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
src : 'src/helpers/ua-parser-helpers.js',
|
src : 'src/helpers/ua-parser-helpers.js',
|
||||||
dest : 'src/helpers/ua-parser-helpers.mjs',
|
dest : 'src/helpers/ua-parser-helpers.mjs',
|
||||||
title : 'ua-parser-js/helpers',
|
title : 'Generated ESM version of ua-parser-js/helpers',
|
||||||
replacements : []
|
replacements : [...defaultReplacements.mjs]
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
modules.forEach(module => generateMJS(module));
|
files.forEach(module => generateFile(module));
|
||||||
@@ -1,4 +1,94 @@
|
|||||||
#!/usr/bin/env node
|
#!/usr/bin/env node
|
||||||
|
|
||||||
const UAParser = require('ua-parser-js');
|
try {
|
||||||
console.log(JSON.stringify(process.argv.slice(2).map(ua => UAParser(ua)), null, 4));
|
const fs = require('node:fs');
|
||||||
|
const path = require('node:path');
|
||||||
|
const { performance } = require('node:perf_hooks');
|
||||||
|
const readline = require('node:readline');
|
||||||
|
const { parseArgs } = require('node:util');
|
||||||
|
const UAParser = require('../src/main/ua-parser');
|
||||||
|
const { Bots, Emails, ExtraDevices, InApps, Vehicles } = require('../src/extensions/ua-parser-extensions');
|
||||||
|
|
||||||
|
if (!process.argv[2].startsWith('-')) {
|
||||||
|
|
||||||
|
const results = process.argv.slice(2).map(ua => UAParser(ua, [Bots, Emails, ExtraDevices, InApps, Vehicles]));
|
||||||
|
console.log(JSON.stringify(results, null, 4));
|
||||||
|
process.exit(0);
|
||||||
|
|
||||||
|
} else if (['-h', '--help'].includes(process.argv[2])) {
|
||||||
|
|
||||||
|
console.log('Usage: npx ua-parser-js <string>');
|
||||||
|
console.log(' or npx ua-parser-js --input-file <filepath> [--output-file <filepath>]');
|
||||||
|
console.log('-i, --input-file');
|
||||||
|
console.log('-o, --output-file');
|
||||||
|
process.exit(0);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
const startPerf = performance.now();
|
||||||
|
const {
|
||||||
|
values: {
|
||||||
|
'input-file': inputFile,
|
||||||
|
'output-file': outputFile
|
||||||
|
},
|
||||||
|
} = parseArgs({
|
||||||
|
options: {
|
||||||
|
'input-file': { type: 'string', short: 'i' },
|
||||||
|
'output-file': { type: 'string', short: 'o' }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!inputFile) {
|
||||||
|
console.error('Input file must be present');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const inputPath = path.resolve(__dirname, inputFile);
|
||||||
|
const outputPath = outputFile ? path.resolve(__dirname, outputFile) : null;
|
||||||
|
|
||||||
|
if (!fs.existsSync(inputPath)) {
|
||||||
|
console.error(`Input file not found: ${inputPath}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const inputStream = fs.createReadStream(inputPath, 'utf8');
|
||||||
|
const rl = readline.createInterface({
|
||||||
|
input: inputStream,
|
||||||
|
crlfDelay: Infinity
|
||||||
|
});
|
||||||
|
|
||||||
|
const outputStream = outputPath ? fs.createWriteStream(outputPath, { encoding : 'utf8' }) : process.stdout;
|
||||||
|
|
||||||
|
const uap = new UAParser([Bots, Emails, ExtraDevices, InApps, Vehicles]);
|
||||||
|
let lineNumber = 0;
|
||||||
|
|
||||||
|
outputStream.write('[\n');
|
||||||
|
|
||||||
|
rl.on('line', line => {
|
||||||
|
const result = uap.setUA(line).getResult();
|
||||||
|
const json = JSON.stringify(result, null, 4);
|
||||||
|
if (lineNumber > 0) outputStream.write(',\n');
|
||||||
|
outputStream.write(json);
|
||||||
|
lineNumber++;
|
||||||
|
});
|
||||||
|
|
||||||
|
rl.on('close', () => {
|
||||||
|
outputStream.write('\n]');
|
||||||
|
if (outputPath) {
|
||||||
|
outputStream.end(() => {
|
||||||
|
const finishPerf = performance.now();
|
||||||
|
console.log(`Done!`);
|
||||||
|
console.log(`Number of lines found: ${lineNumber}`);
|
||||||
|
console.log(`Task finished in: ${(finishPerf - startPerf).toFixed(3)}ms`);
|
||||||
|
console.log(`Output written to: ${outputPath}`);
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
7
src/bot-detection/bot-detection.d.ts
vendored
Normal file
7
src/bot-detection/bot-detection.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// Type definitions for bot-detection submodule of UAParser.js v2.0.7
|
||||||
|
// Project: https://github.com/faisalman/ua-parser-js
|
||||||
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||||
|
|
||||||
|
export function isAIAssistant(ua: string): boolean;
|
||||||
|
export function isAICrawler(ua: string): boolean;
|
||||||
|
export function isBot(ua: string): boolean;
|
||||||
188
src/bot-detection/bot-detection.js
Normal file
188
src/bot-detection/bot-detection.js
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
//////////////////////////////////////////////////
|
||||||
|
/* bot-detection submodule of UAParser.js v2.0.7
|
||||||
|
https://github.com/faisalman/ua-parser-js
|
||||||
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
|
AGPLv3 License */
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
|
const { UAParser } = require('../main/ua-parser');
|
||||||
|
const { Bots, Crawlers, Fetchers } = require('../extensions/ua-parser-extensions');
|
||||||
|
const { BrowserType, Extension } = require('../enums/ua-parser-enums');
|
||||||
|
const { Crawler, Fetcher } = Extension.BrowserName;
|
||||||
|
|
||||||
|
class BotList {
|
||||||
|
constructor(ext, prop, list) {
|
||||||
|
this.ext = ext;
|
||||||
|
this.prop = prop;
|
||||||
|
this.list = list.map(x => x.toLowerCase());
|
||||||
|
}
|
||||||
|
includes(ua) {
|
||||||
|
return this.list.includes(
|
||||||
|
(typeof ua === 'string' ?
|
||||||
|
new UAParser(ua, this.ext).getBrowser() :
|
||||||
|
ua.browser
|
||||||
|
)[this.prop]?.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const BotTypes = new BotList(Bots, 'type', [
|
||||||
|
BrowserType.CLI,
|
||||||
|
BrowserType.CRAWLER,
|
||||||
|
BrowserType.FETCHER,
|
||||||
|
BrowserType.LIBRARY
|
||||||
|
]);
|
||||||
|
|
||||||
|
const AIAssistants = new BotList(Fetchers, 'name', [
|
||||||
|
|
||||||
|
// Amazon
|
||||||
|
Fetcher.AMAZON_NOVA_ACT,
|
||||||
|
|
||||||
|
// Anthropic
|
||||||
|
Fetcher.ANTHROPIC_CLAUDE_USER,
|
||||||
|
|
||||||
|
// Cohere
|
||||||
|
Fetcher.COHERE_AI,
|
||||||
|
|
||||||
|
// DuckDuckGo
|
||||||
|
Fetcher.DUCKDUCKGO_ASSISTBOT,
|
||||||
|
|
||||||
|
// Google
|
||||||
|
Fetcher.GOOGLE_GEMINI_DEEP_RESEARCH,
|
||||||
|
|
||||||
|
// Mistral AI
|
||||||
|
Fetcher.MISTRALAI_USER,
|
||||||
|
|
||||||
|
// OpenAI
|
||||||
|
Fetcher.OPENAI_CHATGPT_USER,
|
||||||
|
|
||||||
|
// Perplexity
|
||||||
|
Fetcher.PERPLEXITY_USER
|
||||||
|
]);
|
||||||
|
|
||||||
|
const AICrawlers = new BotList(Crawlers, 'name', [
|
||||||
|
|
||||||
|
// AI2
|
||||||
|
Crawler.AI2_BOT,
|
||||||
|
|
||||||
|
// Amazon
|
||||||
|
Crawler.AMAZON_BOT,
|
||||||
|
|
||||||
|
// Anthropic
|
||||||
|
Crawler.ANTHROPIC_AI,
|
||||||
|
Crawler.ANTHROPIC_CLAUDE_BOT,
|
||||||
|
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
|
||||||
|
Crawler.ANTHROPIC_CLAUDE_WEB,
|
||||||
|
|
||||||
|
// Apple
|
||||||
|
Crawler.APPLE_BOT,
|
||||||
|
Crawler.APPLE_BOT_EXTENDED,
|
||||||
|
|
||||||
|
// Brave
|
||||||
|
Crawler.BRAVE_BOT,
|
||||||
|
|
||||||
|
// ByteDance
|
||||||
|
Crawler.BYTEDANCE_BYTESPIDER,
|
||||||
|
Crawler.BYTEDANCE_TIKTOKSPIDER,
|
||||||
|
|
||||||
|
// Cohere
|
||||||
|
Crawler.COHERE_TRAINING_DATA_CRAWLER,
|
||||||
|
|
||||||
|
// Common Crawl
|
||||||
|
Crawler.COMMON_CRAWL_CCBOT,
|
||||||
|
|
||||||
|
// Coveo
|
||||||
|
Crawler.COVEO_BOT,
|
||||||
|
|
||||||
|
// DataForSeo
|
||||||
|
Crawler.DATAFORSEO_BOT,
|
||||||
|
|
||||||
|
// DeepSeek
|
||||||
|
Crawler.DEEPSEEK_BOT,
|
||||||
|
|
||||||
|
// Diffbot
|
||||||
|
Crawler.DIFFBOT,
|
||||||
|
|
||||||
|
// Google
|
||||||
|
Crawler.GOOGLE_EXTENDED,
|
||||||
|
Crawler.GOOGLE_OTHER,
|
||||||
|
Crawler.GOOGLE_OTHER_IMAGE,
|
||||||
|
Crawler.GOOGLE_OTHER_VIDEO,
|
||||||
|
Crawler.GOOGLE_CLOUDVERTEXBOT,
|
||||||
|
|
||||||
|
// Hive AI
|
||||||
|
Crawler.HIVE_IMAGESIFTBOT,
|
||||||
|
|
||||||
|
// Huawei
|
||||||
|
Crawler.HUAWEI_PETALBOT,
|
||||||
|
Crawler.HUAWEI_PANGUBOT,
|
||||||
|
|
||||||
|
// Hugging Face
|
||||||
|
Crawler.HUGGINGFACE_BOT,
|
||||||
|
|
||||||
|
// Kangaroo
|
||||||
|
Crawler.KANGAROO_BOT,
|
||||||
|
|
||||||
|
// Mendable.ai
|
||||||
|
Crawler.FIRECRAWL_AGENT,
|
||||||
|
|
||||||
|
// Meta
|
||||||
|
Crawler.META_FACEBOOKBOT,
|
||||||
|
Crawler.META_EXTERNALAGENT,
|
||||||
|
|
||||||
|
// OpenAI
|
||||||
|
Crawler.OPENAI_GPTBOT,
|
||||||
|
Crawler.OPENAI_SEARCH_BOT,
|
||||||
|
|
||||||
|
// Perplexity
|
||||||
|
Crawler.PERPLEXITY_BOT,
|
||||||
|
|
||||||
|
// Replicate
|
||||||
|
Crawler.REPLICATE_BOT,
|
||||||
|
|
||||||
|
// Runpod
|
||||||
|
Crawler.RUNPOD_BOT,
|
||||||
|
|
||||||
|
// SB Intuitions
|
||||||
|
Crawler.SB_INTUITIONS_BOT,
|
||||||
|
|
||||||
|
// Semrush
|
||||||
|
Crawler.SEMRUSH_BOT_CONTENTSHAKE,
|
||||||
|
|
||||||
|
// Timpi
|
||||||
|
Crawler.TIMPI_BOT,
|
||||||
|
|
||||||
|
// Together AI
|
||||||
|
Crawler.TOGETHER_BOT,
|
||||||
|
|
||||||
|
// Velen.io
|
||||||
|
Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
|
||||||
|
|
||||||
|
// Vercel
|
||||||
|
Crawler.VERCEL_V0BOT,
|
||||||
|
|
||||||
|
// Webz.io
|
||||||
|
Crawler.WEBZIO_OMGILI,
|
||||||
|
Crawler.WEBZIO_OMGILI_BOT,
|
||||||
|
Crawler.WEBZIO_EXTENDED,
|
||||||
|
|
||||||
|
// X
|
||||||
|
Crawler.XAI_BOT,
|
||||||
|
|
||||||
|
// You.com
|
||||||
|
Crawler.YOU_BOT,
|
||||||
|
|
||||||
|
// Zhipu AI
|
||||||
|
Crawler.ZHIPU_CHATGLM_SPIDER
|
||||||
|
]);
|
||||||
|
|
||||||
|
const isBot = ua => BotTypes.includes(ua);
|
||||||
|
const isAIAssistant = ua => AIAssistants.includes(ua);
|
||||||
|
const isAICrawler = ua => AICrawlers.includes(ua);
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
isAIAssistant,
|
||||||
|
isAICrawler,
|
||||||
|
isBot
|
||||||
|
}
|
||||||
189
src/bot-detection/bot-detection.mjs
Normal file
189
src/bot-detection/bot-detection.mjs
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
// Generated ESM version of ua-parser-js/bot-detection
|
||||||
|
// DO NOT EDIT THIS FILE!
|
||||||
|
// Source: /src/bot-detection/bot-detection.js
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
/* bot-detection submodule of UAParser.js v2.0.7
|
||||||
|
https://github.com/faisalman/ua-parser-js
|
||||||
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
|
AGPLv3 License */
|
||||||
|
/////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
|
import { UAParser } from '../main/ua-parser.mjs';
|
||||||
|
import { Extension, BrowserType } from '../enums/ua-parser-enums.mjs';
|
||||||
|
import { Bots, Crawlers, Fetchers } from '../extensions/ua-parser-extensions.mjs';
|
||||||
|
const { Crawler, Fetcher } = Extension.BrowserName;
|
||||||
|
|
||||||
|
class BotList {
|
||||||
|
constructor(ext, prop, list) {
|
||||||
|
this.ext = ext;
|
||||||
|
this.prop = prop;
|
||||||
|
this.list = list.map(x => x.toLowerCase());
|
||||||
|
}
|
||||||
|
includes(ua) {
|
||||||
|
return this.list.includes(
|
||||||
|
(typeof ua === 'string' ?
|
||||||
|
new UAParser(ua, this.ext).getBrowser() :
|
||||||
|
ua.browser
|
||||||
|
)[this.prop]?.toLowerCase());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const BotTypes = new BotList(Bots, 'type', [
|
||||||
|
BrowserType.CLI,
|
||||||
|
BrowserType.CRAWLER,
|
||||||
|
BrowserType.FETCHER,
|
||||||
|
BrowserType.LIBRARY
|
||||||
|
]);
|
||||||
|
|
||||||
|
const AIAssistants = new BotList(Fetchers, 'name', [
|
||||||
|
|
||||||
|
// Anthropic
|
||||||
|
Fetcher.ANTHROPIC_CLAUDE_USER,
|
||||||
|
|
||||||
|
// Cohere
|
||||||
|
Fetcher.COHERE_AI,
|
||||||
|
|
||||||
|
// DuckDuckGo
|
||||||
|
Fetcher.DUCKDUCKGO_ASSISTBOT,
|
||||||
|
|
||||||
|
// Google
|
||||||
|
Fetcher.GOOGLE_GEMINI_DEEP_RESEARCH,
|
||||||
|
|
||||||
|
// Mistral AI
|
||||||
|
Fetcher.MISTRALAI_USER,
|
||||||
|
|
||||||
|
// OpenAI
|
||||||
|
Fetcher.OPENAI_CHATGPT_USER,
|
||||||
|
|
||||||
|
// Perplexity
|
||||||
|
Fetcher.PERPLEXITY_USER
|
||||||
|
]);
|
||||||
|
|
||||||
|
const AICrawlers = new BotList(Crawlers, 'name', [
|
||||||
|
|
||||||
|
// AI2
|
||||||
|
Crawler.AI2_BOT,
|
||||||
|
|
||||||
|
// Amazon
|
||||||
|
Crawler.AMAZON_BOT,
|
||||||
|
|
||||||
|
// Anthropic
|
||||||
|
Crawler.ANTHROPIC_AI,
|
||||||
|
Crawler.ANTHROPIC_CLAUDE_BOT,
|
||||||
|
Crawler.ANTHROPIC_CLAUDE_SEARCHBOT,
|
||||||
|
Crawler.ANTHROPIC_CLAUDE_WEB,
|
||||||
|
|
||||||
|
// Apple
|
||||||
|
Crawler.APPLE_BOT,
|
||||||
|
Crawler.APPLE_BOT_EXTENDED,
|
||||||
|
|
||||||
|
// Brave
|
||||||
|
Crawler.BRAVE_BOT,
|
||||||
|
|
||||||
|
// ByteDance
|
||||||
|
Crawler.BYTEDANCE_BYTESPIDER,
|
||||||
|
Crawler.BYTEDANCE_TIKTOKSPIDER,
|
||||||
|
|
||||||
|
// Cohere
|
||||||
|
Crawler.COHERE_TRAINING_DATA_CRAWLER,
|
||||||
|
|
||||||
|
// Common Crawl
|
||||||
|
Crawler.COMMON_CRAWL_CCBOT,
|
||||||
|
|
||||||
|
// Coveo
|
||||||
|
Crawler.COVEO_BOT,
|
||||||
|
|
||||||
|
// DataForSeo
|
||||||
|
Crawler.DATAFORSEO_BOT,
|
||||||
|
|
||||||
|
// DeepSeek
|
||||||
|
Crawler.DEEPSEEK_BOT,
|
||||||
|
|
||||||
|
// Diffbot
|
||||||
|
Crawler.DIFFBOT,
|
||||||
|
|
||||||
|
// Google
|
||||||
|
Crawler.GOOGLE_EXTENDED,
|
||||||
|
Crawler.GOOGLE_OTHER,
|
||||||
|
Crawler.GOOGLE_OTHER_IMAGE,
|
||||||
|
Crawler.GOOGLE_OTHER_VIDEO,
|
||||||
|
Crawler.GOOGLE_CLOUDVERTEXBOT,
|
||||||
|
|
||||||
|
// Hive AI
|
||||||
|
Crawler.HIVE_IMAGESIFTBOT,
|
||||||
|
|
||||||
|
// Huawei
|
||||||
|
Crawler.HUAWEI_PETALBOT,
|
||||||
|
Crawler.HUAWEI_PANGUBOT,
|
||||||
|
|
||||||
|
// Hugging Face
|
||||||
|
Crawler.HUGGINGFACE_BOT,
|
||||||
|
|
||||||
|
// Kangaroo
|
||||||
|
Crawler.KANGAROO_BOT,
|
||||||
|
|
||||||
|
// Mendable.ai
|
||||||
|
Crawler.FIRECRAWL_AGENT,
|
||||||
|
|
||||||
|
// Meta
|
||||||
|
Crawler.META_FACEBOOKBOT,
|
||||||
|
Crawler.META_EXTERNALAGENT,
|
||||||
|
|
||||||
|
// OpenAI
|
||||||
|
Crawler.OPENAI_GPTBOT,
|
||||||
|
Crawler.OPENAI_SEARCH_BOT,
|
||||||
|
|
||||||
|
// Perplexity
|
||||||
|
Crawler.PERPLEXITY_BOT,
|
||||||
|
|
||||||
|
// Replicate
|
||||||
|
Crawler.REPLICATE_BOT,
|
||||||
|
|
||||||
|
// Runpod
|
||||||
|
Crawler.RUNPOD_BOT,
|
||||||
|
|
||||||
|
// SB Intuitions
|
||||||
|
Crawler.SB_INTUITIONS_BOT,
|
||||||
|
|
||||||
|
// Semrush
|
||||||
|
Crawler.SEMRUSH_BOT_CONTENTSHAKE,
|
||||||
|
|
||||||
|
// Timpi
|
||||||
|
Crawler.TIMPI_BOT,
|
||||||
|
|
||||||
|
// Together AI
|
||||||
|
Crawler.TOGETHER_BOT,
|
||||||
|
|
||||||
|
// Velen.io
|
||||||
|
Crawler.HUNTER_VELENPUBLICWEBCRAWLER,
|
||||||
|
|
||||||
|
// Vercel
|
||||||
|
Crawler.VERCEL_V0BOT,
|
||||||
|
|
||||||
|
// Webz.io
|
||||||
|
Crawler.WEBZIO_OMGILI,
|
||||||
|
Crawler.WEBZIO_OMGILI_BOT,
|
||||||
|
Crawler.WEBZIO_EXTENDED,
|
||||||
|
|
||||||
|
// X
|
||||||
|
Crawler.XAI_BOT,
|
||||||
|
|
||||||
|
// You.com
|
||||||
|
Crawler.YOU_BOT,
|
||||||
|
|
||||||
|
// Zhipu AI
|
||||||
|
Crawler.ZHIPU_CHATGLM_SPIDER
|
||||||
|
]);
|
||||||
|
|
||||||
|
const isBot = ua => BotTypes.includes(ua);
|
||||||
|
const isAIAssistant = ua => AIAssistants.includes(ua);
|
||||||
|
const isAICrawler = ua => AICrawlers.includes(ua);
|
||||||
|
|
||||||
|
export {
|
||||||
|
isAIAssistant,
|
||||||
|
isAICrawler,
|
||||||
|
isBot
|
||||||
|
}
|
||||||
10
src/browser-detection/browser-detection.d.ts
vendored
Normal file
10
src/browser-detection/browser-detection.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// Type definitions for browser-detection submodule of UAParser.js v2.0.7
|
||||||
|
// Project: https://github.com/faisalman/ua-parser-js
|
||||||
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||||
|
|
||||||
|
import type { IResult } from "../main/ua-parser";
|
||||||
|
|
||||||
|
export function isChromeFamily(resultOrUA: IResult | string): boolean;
|
||||||
|
export function isElectron(): boolean;
|
||||||
|
export function isFromEU(): boolean;
|
||||||
|
export function isStandalonePWA(): boolean;
|
||||||
30
src/browser-detection/browser-detection.js
Normal file
30
src/browser-detection/browser-detection.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//////////////////////////////////////////////////////
|
||||||
|
/* browser-detection submodule of UAParser.js v2.0.7
|
||||||
|
https://github.com/faisalman/ua-parser-js
|
||||||
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
|
AGPLv3 License */
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
|
const { UAParser } = require('../main/ua-parser');
|
||||||
|
const { EngineName } = require('../enums/ua-parser-enums');
|
||||||
|
const { isStandalonePWA } = require('is-standalone-pwa');
|
||||||
|
const { isFromEU } = require('detect-europe-js');
|
||||||
|
|
||||||
|
const isChromeFamily = val => !!(
|
||||||
|
(typeof val === 'string' ?
|
||||||
|
new UAParser(val).getEngine() :
|
||||||
|
val.engine
|
||||||
|
)?.is(EngineName.BLINK));
|
||||||
|
|
||||||
|
const isElectron = () => !!(
|
||||||
|
process?.versions?.hasOwnProperty('electron') || // node.js
|
||||||
|
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
isChromeFamily,
|
||||||
|
isElectron,
|
||||||
|
isFromEU,
|
||||||
|
isStandalonePWA
|
||||||
|
}
|
||||||
30
src/browser-detection/browser-detection.mjs
Normal file
30
src/browser-detection/browser-detection.mjs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// Generated ESM version of ua-parser-js/browser-detection
|
||||||
|
// DO NOT EDIT THIS FILE!
|
||||||
|
// Source: /src/browser-detection/browser-detection.js
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////
|
||||||
|
/* browser-detection submodule of UAParser.js v2.0.7
|
||||||
|
https://github.com/faisalman/ua-parser-js
|
||||||
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
|
AGPLv3 License */
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
|
import { UAParser } from '../main/ua-parser.mjs';
|
||||||
|
import { isStandalonePWA } from 'is-standalone-pwa';
|
||||||
|
|
||||||
|
const isChromeFamily = val => !!(
|
||||||
|
(typeof val === 'string' ?
|
||||||
|
new UAParser(val).getEngine() :
|
||||||
|
val.engine
|
||||||
|
)?.is(EngineName.BLINK));
|
||||||
|
|
||||||
|
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
||||||
|
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||||
|
|
||||||
|
export {
|
||||||
|
isChromeFamily,
|
||||||
|
isElectron,
|
||||||
|
isStandalonePWA
|
||||||
|
}
|
||||||
8
src/device-detection/device-detection.d.ts
vendored
Normal file
8
src/device-detection/device-detection.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// Type definitions for device-detection submodule of UAParser.js v2.0.7
|
||||||
|
// Project: https://github.com/faisalman/ua-parser-js
|
||||||
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||||
|
|
||||||
|
import type { IResult } from "../main/ua-parser";
|
||||||
|
|
||||||
|
export function getDeviceVendor(model: string): string | undefined;
|
||||||
|
export function isAppleSilicon(resultOrUA: IResult | string): boolean;
|
||||||
43
src/device-detection/device-detection.js
Normal file
43
src/device-detection/device-detection.js
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/* device-detection submodule of UAParser.js v2.0.7
|
||||||
|
https://github.com/faisalman/ua-parser-js
|
||||||
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
|
AGPLv3 License */
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
|
const { UAParser } = require('../main/ua-parser');
|
||||||
|
const { CPUArch, OSName } = require('../enums/ua-parser-enums');
|
||||||
|
|
||||||
|
const getDeviceVendor = (model) => new UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).getDevice().vendor;
|
||||||
|
|
||||||
|
const isAppleSilicon = (val) => {
|
||||||
|
const { os, cpu } = typeof val !== 'string' ? val : {
|
||||||
|
os: new UAParser(val).getOS(),
|
||||||
|
cpu: new UAParser(val).getCPU()
|
||||||
|
};
|
||||||
|
if (os.is(OSName.MACOS)) {
|
||||||
|
if (cpu.is(CPUArch.ARM)) {
|
||||||
|
return true;
|
||||||
|
} else if (typeof window !== 'undefined') {
|
||||||
|
try {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
const webgl = canvas.getContext('webgl2') ||
|
||||||
|
canvas.getContext('webgl') ||
|
||||||
|
canvas.getContext('experimental-webgl');
|
||||||
|
return webgl
|
||||||
|
.getParameter(webgl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL)
|
||||||
|
.match(/apple m\d/i);
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getDeviceVendor,
|
||||||
|
isAppleSilicon
|
||||||
|
}
|
||||||
47
src/device-detection/device-detection.mjs
Normal file
47
src/device-detection/device-detection.mjs
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
// Generated ESM version of ua-parser-js/device-detection
|
||||||
|
// DO NOT EDIT THIS FILE!
|
||||||
|
// Source: /src/device-detection/device-detection.js
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/* device-detection submodule of UAParser.js v2.0.7
|
||||||
|
https://github.com/faisalman/ua-parser-js
|
||||||
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
|
AGPLv3 License */
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
|
import { UAParser } from '../main/ua-parser.mjs';
|
||||||
|
import { CPUArch, OSName } from '../enums/ua-parser-enums.mjs';
|
||||||
|
|
||||||
|
const getDeviceVendor = (model) => new UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).getDevice().vendor;
|
||||||
|
|
||||||
|
const isAppleSilicon = (val) => {
|
||||||
|
const { os, cpu } = typeof val !== 'string' ? val : {
|
||||||
|
os: new UAParser(val).getOS(),
|
||||||
|
cpu: new UAParser(val).getCPU()
|
||||||
|
};
|
||||||
|
if (os.is(OSName.MACOS)) {
|
||||||
|
if (cpu.is(CPUArch.ARM)) {
|
||||||
|
return true;
|
||||||
|
} else if (typeof window !== 'undefined') {
|
||||||
|
try {
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
const webgl = canvas.getContext('webgl2') ||
|
||||||
|
canvas.getContext('webgl') ||
|
||||||
|
canvas.getContext('experimental-webgl');
|
||||||
|
return webgl
|
||||||
|
.getParameter(webgl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL)
|
||||||
|
.match(/apple m\d/i);
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
getDeviceVendor,
|
||||||
|
isAppleSilicon
|
||||||
|
}
|
||||||
1098
src/enums/ua-parser-enums.d.ts
vendored
1098
src/enums/ua-parser-enums.d.ts
vendored
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Enums for UAParser.js v2.0.3
|
/* Enums for UAParser.js v2.0.6
|
||||||
https://github.com/faisalman/ua-parser-js
|
https://github.com/faisalman/ua-parser-js
|
||||||
Author: Faisal Salman <f@faisalman.com>
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
AGPLv3 License */
|
AGPLv3 License */
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
/*jshint esversion: 6 */
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
const Browser = Object.freeze({
|
const BrowserName = Object.freeze({
|
||||||
'115': '115',
|
'115': '115',
|
||||||
'2345': '2345',
|
'2345': '2345',
|
||||||
'360': '360',
|
'360': '360',
|
||||||
@@ -15,13 +15,14 @@ const Browser = Object.freeze({
|
|||||||
AMAYA: 'Amaya',
|
AMAYA: 'Amaya',
|
||||||
ANDROID: 'Android Browser',
|
ANDROID: 'Android Browser',
|
||||||
ARORA: 'Arora',
|
ARORA: 'Arora',
|
||||||
|
ATLAS: 'Atlas',
|
||||||
AVANT: 'Avant',
|
AVANT: 'Avant',
|
||||||
AVAST: 'Avast Secure Browser',
|
AVAST: 'Avast Secure Browser',
|
||||||
AVG: 'AVG Secure Browser',
|
AVG: 'AVG Secure Browser',
|
||||||
BAIDU: 'Baidu Browser',
|
BAIDU: 'Baidu Browser',
|
||||||
BASILISK: 'Basilisk',
|
BASILISK: 'Basilisk',
|
||||||
|
BING: 'Bing',
|
||||||
BLAZER: 'Blazer',
|
BLAZER: 'Blazer',
|
||||||
BLU: 'BLU',
|
|
||||||
BOLT: 'Bolt',
|
BOLT: 'Bolt',
|
||||||
BOWSER: 'Bowser',
|
BOWSER: 'Bowser',
|
||||||
BRAVE: 'Brave',
|
BRAVE: 'Brave',
|
||||||
@@ -44,6 +45,8 @@ const Browser = Object.freeze({
|
|||||||
DUCKDUCKGO: 'DuckDuckGo',
|
DUCKDUCKGO: 'DuckDuckGo',
|
||||||
ECOSIA: 'Ecosia',
|
ECOSIA: 'Ecosia',
|
||||||
EDGE: 'Edge',
|
EDGE: 'Edge',
|
||||||
|
EDGE_WEBVIEW: 'Edge WebView',
|
||||||
|
EDGE_WEBVIEW2: 'Edge WebView2',
|
||||||
EPIPHANY: 'Epiphany',
|
EPIPHANY: 'Epiphany',
|
||||||
FACEBOOK: 'Facebook',
|
FACEBOOK: 'Facebook',
|
||||||
FALKON: 'Falkon',
|
FALKON: 'Falkon',
|
||||||
@@ -124,6 +127,7 @@ const Browser = Object.freeze({
|
|||||||
QUARK: 'Quark',
|
QUARK: 'Quark',
|
||||||
QUPZILLA: 'QupZilla',
|
QUPZILLA: 'QupZilla',
|
||||||
QUTEBROWSER: 'qutebrowser',
|
QUTEBROWSER: 'qutebrowser',
|
||||||
|
QWANT: 'Qwant',
|
||||||
REKONQ: 'rekonq',
|
REKONQ: 'rekonq',
|
||||||
ROCKMELT: 'Rockmelt',
|
ROCKMELT: 'Rockmelt',
|
||||||
SAFARI: 'Safari',
|
SAFARI: 'Safari',
|
||||||
@@ -157,10 +161,15 @@ const Browser = Object.freeze({
|
|||||||
WEIBO: 'Weibo',
|
WEIBO: 'Weibo',
|
||||||
WHALE: 'Whale',
|
WHALE: 'Whale',
|
||||||
WOLVIC: 'Wolvic',
|
WOLVIC: 'Wolvic',
|
||||||
YANDEX: 'Yandex'
|
YANDEX: 'Yandex',
|
||||||
|
ZALO: 'Zalo'
|
||||||
|
|
||||||
// TODO : test!
|
// TODO : test!
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `BrowserName` instead
|
||||||
|
*/
|
||||||
|
const Browser = BrowserName;
|
||||||
|
|
||||||
const BrowserType = Object.freeze({
|
const BrowserType = Object.freeze({
|
||||||
CRAWLER: 'crawler',
|
CRAWLER: 'crawler',
|
||||||
@@ -172,8 +181,9 @@ const BrowserType = Object.freeze({
|
|||||||
LIBRARY: 'library'
|
LIBRARY: 'library'
|
||||||
});
|
});
|
||||||
|
|
||||||
const CPU = Object.freeze({
|
const CPUArch = Object.freeze({
|
||||||
'68K': '68k',
|
'68K': '68k',
|
||||||
|
ALPHA: 'alpha',
|
||||||
ARM : 'arm',
|
ARM : 'arm',
|
||||||
ARM_64: 'arm64',
|
ARM_64: 'arm64',
|
||||||
ARM_HF: 'armhf',
|
ARM_HF: 'armhf',
|
||||||
@@ -191,8 +201,12 @@ const CPU = Object.freeze({
|
|||||||
X86: 'ia32',
|
X86: 'ia32',
|
||||||
X86_64: 'amd64'
|
X86_64: 'amd64'
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `CPUArch` instead
|
||||||
|
*/
|
||||||
|
const CPU = CPUArch;
|
||||||
|
|
||||||
const Device = Object.freeze({
|
const DeviceType = Object.freeze({
|
||||||
CONSOLE: 'console',
|
CONSOLE: 'console',
|
||||||
DESKTOP: 'desktop',
|
DESKTOP: 'desktop',
|
||||||
EMBEDDED: 'embedded',
|
EMBEDDED: 'embedded',
|
||||||
@@ -202,18 +216,24 @@ const Device = Object.freeze({
|
|||||||
WEARABLE: 'wearable',
|
WEARABLE: 'wearable',
|
||||||
XR: 'xr'
|
XR: 'xr'
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `DeviceType` instead
|
||||||
|
*/
|
||||||
|
const Device = DeviceType;
|
||||||
|
|
||||||
const Vendor = Object.freeze({
|
const DeviceVendor = Object.freeze({
|
||||||
ACER: 'Acer',
|
ACER: 'Acer',
|
||||||
ADVAN: 'Advan',
|
ADVAN: 'Advan',
|
||||||
ALCATEL: 'Alcatel',
|
ALCATEL: 'Alcatel',
|
||||||
APPLE: 'Apple',
|
|
||||||
AMAZON: 'Amazon',
|
AMAZON: 'Amazon',
|
||||||
|
ANBERNIC: 'Anbernic',
|
||||||
|
APPLE: 'Apple',
|
||||||
ARCHOS: 'Archos',
|
ARCHOS: 'Archos',
|
||||||
ASUS: 'ASUS',
|
ASUS: 'ASUS',
|
||||||
ATT: 'AT&T',
|
ATT: 'AT&T',
|
||||||
BENQ: 'BenQ',
|
BENQ: 'BenQ',
|
||||||
BLACKBERRY: 'BlackBerry',
|
BLACKBERRY: 'BlackBerry',
|
||||||
|
BLU: 'BLU',
|
||||||
CAT: 'Cat',
|
CAT: 'Cat',
|
||||||
DELL: 'Dell',
|
DELL: 'Dell',
|
||||||
ENERGIZER: 'Energizer',
|
ENERGIZER: 'Energizer',
|
||||||
@@ -223,6 +243,7 @@ const Vendor = Object.freeze({
|
|||||||
GEEKSPHONE: 'GeeksPhone',
|
GEEKSPHONE: 'GeeksPhone',
|
||||||
GENERIC: 'Generic',
|
GENERIC: 'Generic',
|
||||||
GOOGLE: 'Google',
|
GOOGLE: 'Google',
|
||||||
|
HISENSE: 'Hisense',
|
||||||
HMD: 'HMD',
|
HMD: 'HMD',
|
||||||
HP: 'HP',
|
HP: 'HP',
|
||||||
HTC: 'HTC',
|
HTC: 'HTC',
|
||||||
@@ -232,8 +253,10 @@ const Vendor = Object.freeze({
|
|||||||
ITEL: 'itel',
|
ITEL: 'itel',
|
||||||
JOLLA: 'Jolla',
|
JOLLA: 'Jolla',
|
||||||
KOBO: 'Kobo',
|
KOBO: 'Kobo',
|
||||||
|
LAVA: 'Lava',
|
||||||
LENOVO: 'Lenovo',
|
LENOVO: 'Lenovo',
|
||||||
LG: 'LG',
|
LG: 'LG',
|
||||||
|
LOGITECH: 'Logitech',
|
||||||
MEIZU: 'Meizu',
|
MEIZU: 'Meizu',
|
||||||
MICROMAX: 'Micromax',
|
MICROMAX: 'Micromax',
|
||||||
MICROSOFT: 'Microsoft',
|
MICROSOFT: 'Microsoft',
|
||||||
@@ -249,9 +272,11 @@ const Vendor = Object.freeze({
|
|||||||
PALM: 'Palm',
|
PALM: 'Palm',
|
||||||
PANASONIC: 'Panasonic',
|
PANASONIC: 'Panasonic',
|
||||||
PEBBLE: 'Pebble',
|
PEBBLE: 'Pebble',
|
||||||
|
PHILIPS: 'Philips',
|
||||||
PICO: 'Pico',
|
PICO: 'Pico',
|
||||||
POLYTRON: 'Polytron',
|
POLYTRON: 'Polytron',
|
||||||
REALME: 'Realme',
|
REALME: 'Realme',
|
||||||
|
RETROID: 'Retroid',
|
||||||
RIM: 'RIM',
|
RIM: 'RIM',
|
||||||
ROKU: 'Roku',
|
ROKU: 'Roku',
|
||||||
SAMSUNG: 'Samsung',
|
SAMSUNG: 'Samsung',
|
||||||
@@ -262,11 +287,13 @@ const Vendor = Object.freeze({
|
|||||||
SPRINT: 'Sprint',
|
SPRINT: 'Sprint',
|
||||||
TCL: 'TCL',
|
TCL: 'TCL',
|
||||||
TECHNISAT: 'TechniSAT',
|
TECHNISAT: 'TechniSAT',
|
||||||
TECNO: 'Tecno',
|
TECNO: 'TECNO',
|
||||||
TESLA: 'Tesla',
|
TESLA: 'Tesla',
|
||||||
ULEFONE: 'Ulefone',
|
ULEFONE: 'Ulefone',
|
||||||
VIVO: 'Vivo',
|
VIVO: 'Vivo',
|
||||||
|
VIZIO: 'Vizio',
|
||||||
VODAFONE: 'Vodafone',
|
VODAFONE: 'Vodafone',
|
||||||
|
WIKO: 'Wiko',
|
||||||
XBOX: 'Xbox',
|
XBOX: 'Xbox',
|
||||||
XIAOMI: 'Xiaomi',
|
XIAOMI: 'Xiaomi',
|
||||||
ZEBRA: 'Zebra',
|
ZEBRA: 'Zebra',
|
||||||
@@ -274,8 +301,12 @@ const Vendor = Object.freeze({
|
|||||||
|
|
||||||
// TODO : test!
|
// TODO : test!
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `DeviceVendor` instead
|
||||||
|
*/
|
||||||
|
const Vendor = DeviceVendor;
|
||||||
|
|
||||||
const Engine = Object.freeze({
|
const EngineName = Object.freeze({
|
||||||
AMAYA: 'Amaya',
|
AMAYA: 'Amaya',
|
||||||
ARKWEB: 'ArkWeb',
|
ARKWEB: 'ArkWeb',
|
||||||
BLINK: 'Blink',
|
BLINK: 'Blink',
|
||||||
@@ -297,12 +328,17 @@ const Engine = Object.freeze({
|
|||||||
W3M: 'w3m',
|
W3M: 'w3m',
|
||||||
WEBKIT: 'WebKit'
|
WEBKIT: 'WebKit'
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `EngineName` instead
|
||||||
|
*/
|
||||||
|
const Engine = EngineName;
|
||||||
|
|
||||||
const OS = Object.freeze({
|
const OSName = Object.freeze({
|
||||||
AIX: 'AIX',
|
AIX: 'AIX',
|
||||||
AMIGA_OS: 'Amiga OS',
|
AMIGA_OS: 'Amiga OS',
|
||||||
ANDROID: 'Android',
|
ANDROID: 'Android',
|
||||||
ANDROID_X86: 'Android-x86',
|
ANDROID_X86: 'Android-x86',
|
||||||
|
ARCAOS: 'ArcaOS',
|
||||||
ARCH: 'Arch',
|
ARCH: 'Arch',
|
||||||
BADA: 'Bada',
|
BADA: 'Bada',
|
||||||
BEOS: 'BeOS',
|
BEOS: 'BeOS',
|
||||||
@@ -333,6 +369,7 @@ const OS = Object.freeze({
|
|||||||
IOS: 'iOS',
|
IOS: 'iOS',
|
||||||
JOLI: 'Joli',
|
JOLI: 'Joli',
|
||||||
KAIOS: 'KaiOS',
|
KAIOS: 'KaiOS',
|
||||||
|
KNOPPIX: 'Knoppix',
|
||||||
KUBUNTU: 'Kubuntu',
|
KUBUNTU: 'Kubuntu',
|
||||||
LINPUS: 'Linpus',
|
LINPUS: 'Linpus',
|
||||||
LINSPIRE: 'Linspire',
|
LINSPIRE: 'Linspire',
|
||||||
@@ -381,21 +418,350 @@ const OS = Object.freeze({
|
|||||||
WATCHOS: 'watchOS',
|
WATCHOS: 'watchOS',
|
||||||
WEBOS: 'WebOS',
|
WEBOS: 'WebOS',
|
||||||
WINDOWS: 'Windows',
|
WINDOWS: 'Windows',
|
||||||
|
WINDOWS_CE: 'Windows CE',
|
||||||
WINDOWS_IOT: 'Windows IoT',
|
WINDOWS_IOT: 'Windows IoT',
|
||||||
WINDOWS_MOBILE: 'Windows Mobile',
|
WINDOWS_MOBILE: 'Windows Mobile',
|
||||||
WINDOWS_PHONE: 'Windows Phone',
|
WINDOWS_PHONE: 'Windows Phone',
|
||||||
|
WINDOWS_RT: 'Windows RT',
|
||||||
XBOX: 'Xbox',
|
XBOX: 'Xbox',
|
||||||
|
XUBUNTU: 'Xubuntu',
|
||||||
ZENWALK: 'Zenwalk'
|
ZENWALK: 'Zenwalk'
|
||||||
|
|
||||||
// TODO : test!
|
// TODO : test!
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `OSName` instead
|
||||||
|
*/
|
||||||
|
const OS = OSName;
|
||||||
|
|
||||||
|
/*////////////////////////////////
|
||||||
|
* Enums for Extensions submodule
|
||||||
|
*///////////////////////////////
|
||||||
|
|
||||||
|
const Extension = Object.freeze({
|
||||||
|
BrowserName: {
|
||||||
|
CLI: {
|
||||||
|
CURL: 'curl',
|
||||||
|
ELINKS: 'ELinks',
|
||||||
|
HTTPIE: 'HTTPie',
|
||||||
|
LYNX: 'Lynx',
|
||||||
|
WGET: 'Wget'
|
||||||
|
},
|
||||||
|
Crawler: {
|
||||||
|
AHREFS_BOT: 'AhrefsBot',
|
||||||
|
AI2_BOT: 'AI2Bot',
|
||||||
|
AIHIT_BOT: 'aiHitBot',
|
||||||
|
ALGOLIA_CRAWLER: 'Algolia Crawler',
|
||||||
|
APPLE_BOT: 'Applebot',
|
||||||
|
APPLE_BOT_EXTENDED: 'Applebot-Extended',
|
||||||
|
ASK_TEOMA: 'Teoma',
|
||||||
|
AMAZON_BOT: 'Amazonbot',
|
||||||
|
AMAZON_CONTXBOT: 'contxbot',
|
||||||
|
ANTHROPIC_AI: 'anthropic-ai',
|
||||||
|
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
|
||||||
|
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
|
||||||
|
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
|
||||||
|
ARCHIVEORG_BOT: 'archive.org_bot',
|
||||||
|
BAIDU_ADS: 'Baidu-ADS',
|
||||||
|
BAIDU_SPIDER: 'Baiduspider',
|
||||||
|
BAIDU_SPIDER_ADS: 'Baiduspider-ads',
|
||||||
|
BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',
|
||||||
|
BAIDU_SPIDER_FAVO: 'Baiduspider-favo',
|
||||||
|
BAIDU_SPIDER_IMAGE: 'Baiduspider-image',
|
||||||
|
BAIDU_SPIDER_NEWS: 'Baiduspider-news',
|
||||||
|
BAIDU_SPIDER_RENDER: 'Baiduspider-render',
|
||||||
|
BAIDU_SPIDER_VIDEO: 'Baiduspider-video',
|
||||||
|
BLEX_BOT: 'BLEXBot',
|
||||||
|
BOTIFY: 'botify',
|
||||||
|
BRAVE_BOT: 'Bravebot',
|
||||||
|
BYTEDANCE_BYTESPIDER: 'Bytespider',
|
||||||
|
BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',
|
||||||
|
COMMON_CRAWL_CCBOT: 'CCBot',
|
||||||
|
COCCOC_BOT_WEB: 'coccocbot-web',
|
||||||
|
COCCOC_BOT_IMAGE: 'coccocbot-image',
|
||||||
|
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
|
||||||
|
COTOYOGI: 'Cotoyogi',
|
||||||
|
COVEO_BOT: 'Coveobot',
|
||||||
|
CRITEO_BOT: 'CriteoBot',
|
||||||
|
DATAFORSEO_BOT: 'DataForSeoBot',
|
||||||
|
DAUM: 'Daum',
|
||||||
|
DAUM_DAUMOA: 'Daumoa',
|
||||||
|
DAUM_DAUMOA_IMAGE: 'Daumoa-image',
|
||||||
|
DEEPSEEK_BOT: 'DeepSeekBot',
|
||||||
|
DIFFBOT: 'Diffbot',
|
||||||
|
DUCKDUCKGO_BOT: 'DuckDuckBot',
|
||||||
|
DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',
|
||||||
|
ELASTIC: 'Elastic',
|
||||||
|
ELASTIC_SWIFTYPE_BOT: 'Swiftbot',
|
||||||
|
EXALEAD_EXABOT: 'Exabot',
|
||||||
|
FIRECRAWL_AGENT: 'FirecrawlAgent',
|
||||||
|
FREESPOKE: 'Freespoke',
|
||||||
|
GOOGLE_ADSBOT: 'AdsBot-Google',
|
||||||
|
GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',
|
||||||
|
GOOGLE_ADSENSE: 'AdSense',
|
||||||
|
GOOGLE_APIS: 'APIs-Google',
|
||||||
|
GOOGLE_BOT: 'Googlebot',
|
||||||
|
GOOGLE_BOT_IMAGE: 'Googlebot-Image',
|
||||||
|
GOOGLE_BOT_NEWS: 'Googlebot-News',
|
||||||
|
GOOGLE_BOT_VIDEO: 'Googlebot-Video',
|
||||||
|
GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',
|
||||||
|
GOOGLE_EXTENDED: 'Google-Extended',
|
||||||
|
GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',
|
||||||
|
GOOGLE_OTHER: 'GoogleOther',
|
||||||
|
GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',
|
||||||
|
GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',
|
||||||
|
GOOGLE_SAFETY: 'Google-Safety',
|
||||||
|
GOOGLE_STOREBOT: 'Storebot-Google',
|
||||||
|
HIVE_IMAGESIFTBOT: 'ImagesiftBot',
|
||||||
|
HUAWEI_PANGUBOT: 'PanguBot',
|
||||||
|
HUAWEI_PETALBOT: 'PetalBot',
|
||||||
|
HUGGINGFACE_BOT: 'HuggingFace-Bot',
|
||||||
|
HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',
|
||||||
|
IA_ARCHIVER: 'ia_archiver',
|
||||||
|
IASK_BOT: 'iAskBot',
|
||||||
|
KAGI_BOT: 'Kagibot',
|
||||||
|
KANGAROO_BOT: 'Kangaroo Bot',
|
||||||
|
LINE_SPIDER: 'Linespider',
|
||||||
|
LINKEDIN_BOT: 'LinkedInBot',
|
||||||
|
MAGPIE_CRAWLER: 'magpie-crawler',
|
||||||
|
MARGINALIA: 'marginalia',
|
||||||
|
META_EXTERNALAGENT: 'meta-externalagent',
|
||||||
|
META_FACEBOOKBOT: 'FacebookBot',
|
||||||
|
META_FACEBOOKCATALOG: 'facebookcatalog',
|
||||||
|
META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',
|
||||||
|
MAJESTIC_MJ12BOT: 'MJ12bot',
|
||||||
|
MICROSOFT_BINGBOT: 'Bingbot',
|
||||||
|
MICROSOFT_MSNBOT: 'msnbot',
|
||||||
|
MICROSOFT_ADIDXBOT: 'adidxbot',
|
||||||
|
MOJEEK_BOT: 'MojeekBot',
|
||||||
|
MOZ_DOTBOT: 'DotBot',
|
||||||
|
ONCRAWL: 'OnCrawl',
|
||||||
|
ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',
|
||||||
|
OPENAI_GPTBOT: 'GPTBot',
|
||||||
|
OPENAI_SEARCH_BOT: 'OAI-SearchBot',
|
||||||
|
PERPLEXITY_BOT: 'PerplexityBot',
|
||||||
|
QIHOO_360_SPIDER: '360Spider',
|
||||||
|
QWANT_BOT: 'Qwantbot',
|
||||||
|
QWANT_BOT_NEWS: 'Qwantbot-news',
|
||||||
|
REPLICATE_BOT: 'Replicate-Bot',
|
||||||
|
RUNPOD_BOT: 'RunPod-Bot',
|
||||||
|
SB_INTUITIONS_BOT: 'SBIntuitionsBot',
|
||||||
|
SEEKPORT_BOT: 'SeekportBot',
|
||||||
|
SEMRUSH_BOT: 'SemrushBot',
|
||||||
|
SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',
|
||||||
|
SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',
|
||||||
|
SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',
|
||||||
|
SEZNAM_BOT: 'SeznamBot',
|
||||||
|
SITEIMPROVE: 'Siteimprove',
|
||||||
|
SOGOU_PIC_SPIDER: 'Sogou Pic Spider',
|
||||||
|
SOGOU_WEB_SPIDER: 'Sogou web spider',
|
||||||
|
STARTPAGE: 'Startpage',
|
||||||
|
SURLY_BOT: 'SurdotlyBot',
|
||||||
|
TIMPI_BOT: 'Timpibot',
|
||||||
|
TOGETHER_BOT: 'Together-Bot',
|
||||||
|
TURNITIN_BOT: 'TurnitinBot',
|
||||||
|
TWIN_AGENT: 'TwinAgent',
|
||||||
|
VERCEL_V0BOT: 'v0bot',
|
||||||
|
WEBZIO: 'webzio',
|
||||||
|
WEBZIO_EXTENDED: 'Webzio-Extended',
|
||||||
|
WEBZIO_OMGILI: 'omgili',
|
||||||
|
WEBZIO_OMGILI_BOT: 'omgilibot',
|
||||||
|
XAI_BOT: 'xAI-Bot',
|
||||||
|
YAHOO_JAPAN: 'Y!J-BRW',
|
||||||
|
YAHOO_SLURP: 'Yahoo! Slurp',
|
||||||
|
YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',
|
||||||
|
YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',
|
||||||
|
YANDEX_ADNET: 'YandexAdNet',
|
||||||
|
YANDEX_BLOGS: 'YandexBlogs',
|
||||||
|
YANDEX_BOT: 'YandexBot',
|
||||||
|
YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',
|
||||||
|
YANDEX_COMBOT: 'YandexComBot',
|
||||||
|
YANDEX_FAVICONS: 'YandexFavicons',
|
||||||
|
YANDEX_IMAGE_RESIZER: 'YandexImageResizer',
|
||||||
|
YANDEX_IMAGES: 'YandexImages',
|
||||||
|
YANDEX_MARKET: 'YandexMarket',
|
||||||
|
YANDEX_MEDIA: 'YandexMedia',
|
||||||
|
YANDEX_METRIKA: 'YandexMetrika',
|
||||||
|
YANDEX_MOBILE_BOT: 'YandexMobileBot',
|
||||||
|
YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',
|
||||||
|
YANDEX_NEWS: 'YandexNews',
|
||||||
|
YANDEX_ONTODB: 'YandexOntoDB',
|
||||||
|
YANDEX_ONTODB_API: 'YandexOntoDBAPI',
|
||||||
|
YANDEX_PARTNER: 'YandexPartner',
|
||||||
|
YANDEX_RCA: 'YandexRCA',
|
||||||
|
YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',
|
||||||
|
YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',
|
||||||
|
YANDEX_SPRAV_BOT: 'YandexSpravBot',
|
||||||
|
YANDEX_TRACKER: 'YandexTracker',
|
||||||
|
YANDEX_VERTICALS: 'YandexVerticals',
|
||||||
|
YANDEX_VERTIS: 'YandexVertis',
|
||||||
|
YANDEX_VIDEO: 'YandexVideo',
|
||||||
|
YANDEX_VIDEO_PARSER: 'YandexVideoParser',
|
||||||
|
YANDEX_WEBMASTER: 'YandexWebmaster',
|
||||||
|
YEP_BOT: 'YepBot',
|
||||||
|
YETI: 'Yeti',
|
||||||
|
YISOU_SPIDER: 'YisouSpider',
|
||||||
|
YOU_BOT: 'YouBot',
|
||||||
|
ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',
|
||||||
|
ZUM_BOT: 'ZumBot'
|
||||||
|
},
|
||||||
|
Email: {
|
||||||
|
AIRMAIL: 'Airmail',
|
||||||
|
APPLE_MAIL: 'Mail',
|
||||||
|
BLUEMAIL: 'BlueMail',
|
||||||
|
DAUM_MAIL: 'DaumMail',
|
||||||
|
EVOLUTION: 'Evolution',
|
||||||
|
EM_CLIENT: 'eM Client',
|
||||||
|
FOXMAIL: 'Foxmail',
|
||||||
|
KMAIL: 'KMail',
|
||||||
|
KMAIL2: 'kmail2',
|
||||||
|
KONTACT: 'Kontact',
|
||||||
|
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
|
||||||
|
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
|
||||||
|
NAVER_MAILAPP: 'NaverMailApp',
|
||||||
|
POLYMAIL: 'Polymail',
|
||||||
|
PROTON_MAIL: 'ProtonMail',
|
||||||
|
SPARK_MAIL: 'SparkDesktop',
|
||||||
|
SPARROW: 'Sparrow',
|
||||||
|
THUNDERBIRD: 'Thunderbird',
|
||||||
|
YAHOO_MAIL: 'Yahoo',
|
||||||
|
ZIMBRA: 'Zimbra',
|
||||||
|
ZOHO_MAIL: 'ZohoMail-Desktop'
|
||||||
|
},
|
||||||
|
Fetcher: {
|
||||||
|
AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
|
||||||
|
AMAZON_NOVA_ACT: 'NovaAct',
|
||||||
|
ANTHROPIC_CLAUDE_USER: 'Claude-User',
|
||||||
|
ASANA: 'Asana',
|
||||||
|
BETTER_UPTIME_BOT: 'Better Uptime Bot',
|
||||||
|
BITLY_BOT: 'bitlybot',
|
||||||
|
BLUESKY: 'Bluesky',
|
||||||
|
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
|
||||||
|
COHERE_AI: 'Cohere-AI',
|
||||||
|
DISCORD_BOT: 'Discordbot',
|
||||||
|
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
|
||||||
|
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
|
||||||
|
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
|
||||||
|
GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',
|
||||||
|
GOOGLE_IMAGEPROXY: 'GoogleImageProxy',
|
||||||
|
GOOGLE_PAGERENDERER: 'Google-PageRenderer',
|
||||||
|
GOOGLE_READ_ALOUD: 'Google-Read-Aloud',
|
||||||
|
GOOGLE_PRODUCER: 'GoogleProducer',
|
||||||
|
GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',
|
||||||
|
HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',
|
||||||
|
IFRAMELY: 'Iframely',
|
||||||
|
KAKAOTALK_SCRAP: 'kakaotalk-scrap',
|
||||||
|
KEYBASE_BOT: 'KeybaseBot',
|
||||||
|
META_EXTERNALFETCHER: 'meta-externalfetcher',
|
||||||
|
META_WHATSAPP: 'WhatsApp',
|
||||||
|
MICROSOFT_BINGPREVIEW: 'BingPreview',
|
||||||
|
MICROSOFT_PREVIEW: 'MicrosoftPreview',
|
||||||
|
MISTRALAI_USER: 'MistralAI-User',
|
||||||
|
NAVER_BLUENO: 'Blueno',
|
||||||
|
ONCRAWL_ROGERBOT: 'rogerbot',
|
||||||
|
OPENAI_CHATGPT_USER: 'ChatGPT-User',
|
||||||
|
PERPLEXITY_USER: 'Perplexity-User',
|
||||||
|
PINTEREST_BOT: 'Pinterestbot',
|
||||||
|
SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',
|
||||||
|
SLACK_BOT: 'Slackbot',
|
||||||
|
SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',
|
||||||
|
SLACK_IMGPROXY: 'Slack-ImgProxy',
|
||||||
|
SNAP_URL_PREVIEW: 'Snap URL Preview',
|
||||||
|
SKYPE_URIPREVIEW: 'SkypeUriPreview',
|
||||||
|
TELEGRAM_BOT: 'TelegramBot',
|
||||||
|
UPTIMEROBOT: 'UptimeRobot',
|
||||||
|
VERCEL_FAVICON_BOT: 'vercel-favicon-bot',
|
||||||
|
VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',
|
||||||
|
VERCEL_BOT: 'Vercelbot',
|
||||||
|
VERCEL_FLAGS: 'vercelflags',
|
||||||
|
VERCEL_TRACING: 'verceltracing',
|
||||||
|
X_TWITTERBOT: 'Twitterbot',
|
||||||
|
YANDEX_CALENDAR: 'YandexCalendar',
|
||||||
|
YANDEX_DIRECT: 'YandexDirect',
|
||||||
|
YANDEX_DIRECTDYN: 'YandexDirectDyn',
|
||||||
|
YANDEX_DIRECTFETCHER: 'YaDirectFetcher',
|
||||||
|
YANDEX_FORDOMAIN: 'YandexForDomain',
|
||||||
|
YANDEX_PAGECHECKER: 'YandexPagechecker',
|
||||||
|
YANDEX_SEARCHSHOP: 'YandexSearchShop',
|
||||||
|
YANDEX_SITELINKS: 'YandexSitelinks',
|
||||||
|
YANDEX_USERPROXY: 'YandexUserproxy',
|
||||||
|
ZOOMINFO_BOT: 'Zoombot'
|
||||||
|
},
|
||||||
|
InApp: {
|
||||||
|
DISCORD: 'Discord',
|
||||||
|
EVERNOTE: 'Evernote',
|
||||||
|
FIGMA: 'Figma',
|
||||||
|
FLIPBOARD: 'Flipboard',
|
||||||
|
MATTERMOST: 'Mattermost',
|
||||||
|
TEAMS: 'Teams',
|
||||||
|
NOTION: 'Notion',
|
||||||
|
POSTMAN: 'Postman',
|
||||||
|
RAMBOX: 'Rambox',
|
||||||
|
ROCKETCHAT: 'Rocket.Chat',
|
||||||
|
SLACK: 'Slack',
|
||||||
|
TIKTOK_LITE: 'TikTok Lite',
|
||||||
|
VSCODE: 'VS Code',
|
||||||
|
YAHOO_JAPAN: 'Yahoo! Japan'
|
||||||
|
},
|
||||||
|
Library: {
|
||||||
|
ADOBE_AIR: 'AdobeAIR',
|
||||||
|
AIOHTTP: 'aiohttp',
|
||||||
|
APACHE_HTTPCLIENT: 'Apache-HttpClient',
|
||||||
|
AXIOS: 'axios',
|
||||||
|
BUN: 'Bun',
|
||||||
|
DART: 'Dart',
|
||||||
|
DENO: 'Deno',
|
||||||
|
GO_HTTP_CLIENT: 'go-http-client',
|
||||||
|
GOT: 'got',
|
||||||
|
GUZZLEHTTP: 'GuzzleHttp',
|
||||||
|
HACKNEY: 'hackney',
|
||||||
|
JAVA: 'Java',
|
||||||
|
JAVA_HTTPCLIENT: 'Java-http-client',
|
||||||
|
JSDOM: 'jsdom',
|
||||||
|
LIBWWW_PERL: 'libwww-perl',
|
||||||
|
LUA_RESTY_HTTP: 'lua-resty-http',
|
||||||
|
NEEDLE: 'Needle',
|
||||||
|
NUTCH: 'Nutch',
|
||||||
|
NODE_FETCH: 'node-fetch',
|
||||||
|
NODE_JS: 'Node.js',
|
||||||
|
NODE_SUPERAGENT: 'node-superagent',
|
||||||
|
OKHTTP: 'OkHttp',
|
||||||
|
PHP_SOAP: 'PHP-SOAP',
|
||||||
|
POSTMAN_RUNTIME: 'PostmanRuntime',
|
||||||
|
PYTHON_HTTPX: 'python-httpx',
|
||||||
|
PYTHON_URLLIB: 'python-urllib',
|
||||||
|
PYTHON_URLLIB3: 'python-urllib3',
|
||||||
|
PYTHON_REQUESTS: 'python-requests',
|
||||||
|
REST_CLIENT: 'rest-client',
|
||||||
|
SCRAPY: 'Scrapy',
|
||||||
|
UNDICI: 'undici'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
DeviceVendor: {
|
||||||
|
Vehicle: {
|
||||||
|
BMW: 'BMW',
|
||||||
|
BYD: 'BYD',
|
||||||
|
JEEP: 'Jeep',
|
||||||
|
RIVIAN: 'Rivian',
|
||||||
|
TESLA: 'Tesla',
|
||||||
|
VOLVO: 'Volvo'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
Browser,
|
Browser,// deprecated
|
||||||
|
CPU, // deprecated
|
||||||
|
Device, // deprecated
|
||||||
|
Vendor, // deprecated
|
||||||
|
Engine, // deprecated
|
||||||
|
OS, // deprecated
|
||||||
|
BrowserName,
|
||||||
BrowserType,
|
BrowserType,
|
||||||
CPU,
|
CPUArch,
|
||||||
Device,
|
DeviceType,
|
||||||
Vendor,
|
DeviceVendor,
|
||||||
Engine,
|
EngineName,
|
||||||
OS
|
OSName,
|
||||||
|
Extension
|
||||||
};
|
};
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
// Source: /src/enums/ua-parser-enums.js
|
// Source: /src/enums/ua-parser-enums.js
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Enums for UAParser.js v2.0.3
|
/* Enums for UAParser.js v2.0.6
|
||||||
https://github.com/faisalman/ua-parser-js
|
https://github.com/faisalman/ua-parser-js
|
||||||
Author: Faisal Salman <f@faisalman.com>
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
AGPLv3 License */
|
AGPLv3 License */
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
/*jshint esversion: 6 */
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
const Browser = Object.freeze({
|
const BrowserName = Object.freeze({
|
||||||
'115': '115',
|
'115': '115',
|
||||||
'2345': '2345',
|
'2345': '2345',
|
||||||
'360': '360',
|
'360': '360',
|
||||||
@@ -24,8 +24,8 @@ const Browser = Object.freeze({
|
|||||||
AVG: 'AVG Secure Browser',
|
AVG: 'AVG Secure Browser',
|
||||||
BAIDU: 'Baidu Browser',
|
BAIDU: 'Baidu Browser',
|
||||||
BASILISK: 'Basilisk',
|
BASILISK: 'Basilisk',
|
||||||
|
BING: 'Bing',
|
||||||
BLAZER: 'Blazer',
|
BLAZER: 'Blazer',
|
||||||
BLU: 'BLU',
|
|
||||||
BOLT: 'Bolt',
|
BOLT: 'Bolt',
|
||||||
BOWSER: 'Bowser',
|
BOWSER: 'Bowser',
|
||||||
BRAVE: 'Brave',
|
BRAVE: 'Brave',
|
||||||
@@ -48,6 +48,8 @@ const Browser = Object.freeze({
|
|||||||
DUCKDUCKGO: 'DuckDuckGo',
|
DUCKDUCKGO: 'DuckDuckGo',
|
||||||
ECOSIA: 'Ecosia',
|
ECOSIA: 'Ecosia',
|
||||||
EDGE: 'Edge',
|
EDGE: 'Edge',
|
||||||
|
EDGE_WEBVIEW: 'Edge WebView',
|
||||||
|
EDGE_WEBVIEW2: 'Edge WebView2',
|
||||||
EPIPHANY: 'Epiphany',
|
EPIPHANY: 'Epiphany',
|
||||||
FACEBOOK: 'Facebook',
|
FACEBOOK: 'Facebook',
|
||||||
FALKON: 'Falkon',
|
FALKON: 'Falkon',
|
||||||
@@ -128,6 +130,7 @@ const Browser = Object.freeze({
|
|||||||
QUARK: 'Quark',
|
QUARK: 'Quark',
|
||||||
QUPZILLA: 'QupZilla',
|
QUPZILLA: 'QupZilla',
|
||||||
QUTEBROWSER: 'qutebrowser',
|
QUTEBROWSER: 'qutebrowser',
|
||||||
|
QWANT: 'Qwant',
|
||||||
REKONQ: 'rekonq',
|
REKONQ: 'rekonq',
|
||||||
ROCKMELT: 'Rockmelt',
|
ROCKMELT: 'Rockmelt',
|
||||||
SAFARI: 'Safari',
|
SAFARI: 'Safari',
|
||||||
@@ -161,10 +164,15 @@ const Browser = Object.freeze({
|
|||||||
WEIBO: 'Weibo',
|
WEIBO: 'Weibo',
|
||||||
WHALE: 'Whale',
|
WHALE: 'Whale',
|
||||||
WOLVIC: 'Wolvic',
|
WOLVIC: 'Wolvic',
|
||||||
YANDEX: 'Yandex'
|
YANDEX: 'Yandex',
|
||||||
|
ZALO: 'Zalo'
|
||||||
|
|
||||||
// TODO : test!
|
// TODO : test!
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `BrowserName` instead
|
||||||
|
*/
|
||||||
|
const Browser = BrowserName;
|
||||||
|
|
||||||
const BrowserType = Object.freeze({
|
const BrowserType = Object.freeze({
|
||||||
CRAWLER: 'crawler',
|
CRAWLER: 'crawler',
|
||||||
@@ -176,8 +184,9 @@ const BrowserType = Object.freeze({
|
|||||||
LIBRARY: 'library'
|
LIBRARY: 'library'
|
||||||
});
|
});
|
||||||
|
|
||||||
const CPU = Object.freeze({
|
const CPUArch = Object.freeze({
|
||||||
'68K': '68k',
|
'68K': '68k',
|
||||||
|
ALPHA: 'alpha',
|
||||||
ARM : 'arm',
|
ARM : 'arm',
|
||||||
ARM_64: 'arm64',
|
ARM_64: 'arm64',
|
||||||
ARM_HF: 'armhf',
|
ARM_HF: 'armhf',
|
||||||
@@ -195,8 +204,12 @@ const CPU = Object.freeze({
|
|||||||
X86: 'ia32',
|
X86: 'ia32',
|
||||||
X86_64: 'amd64'
|
X86_64: 'amd64'
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `CPUArch` instead
|
||||||
|
*/
|
||||||
|
const CPU = CPUArch;
|
||||||
|
|
||||||
const Device = Object.freeze({
|
const DeviceType = Object.freeze({
|
||||||
CONSOLE: 'console',
|
CONSOLE: 'console',
|
||||||
DESKTOP: 'desktop',
|
DESKTOP: 'desktop',
|
||||||
EMBEDDED: 'embedded',
|
EMBEDDED: 'embedded',
|
||||||
@@ -206,8 +219,12 @@ const Device = Object.freeze({
|
|||||||
WEARABLE: 'wearable',
|
WEARABLE: 'wearable',
|
||||||
XR: 'xr'
|
XR: 'xr'
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `DeviceType` instead
|
||||||
|
*/
|
||||||
|
const Device = DeviceType;
|
||||||
|
|
||||||
const Vendor = Object.freeze({
|
const DeviceVendor = Object.freeze({
|
||||||
ACER: 'Acer',
|
ACER: 'Acer',
|
||||||
ADVAN: 'Advan',
|
ADVAN: 'Advan',
|
||||||
ALCATEL: 'Alcatel',
|
ALCATEL: 'Alcatel',
|
||||||
@@ -218,6 +235,7 @@ const Vendor = Object.freeze({
|
|||||||
ATT: 'AT&T',
|
ATT: 'AT&T',
|
||||||
BENQ: 'BenQ',
|
BENQ: 'BenQ',
|
||||||
BLACKBERRY: 'BlackBerry',
|
BLACKBERRY: 'BlackBerry',
|
||||||
|
BLU: 'BLU',
|
||||||
CAT: 'Cat',
|
CAT: 'Cat',
|
||||||
DELL: 'Dell',
|
DELL: 'Dell',
|
||||||
ENERGIZER: 'Energizer',
|
ENERGIZER: 'Energizer',
|
||||||
@@ -227,6 +245,7 @@ const Vendor = Object.freeze({
|
|||||||
GEEKSPHONE: 'GeeksPhone',
|
GEEKSPHONE: 'GeeksPhone',
|
||||||
GENERIC: 'Generic',
|
GENERIC: 'Generic',
|
||||||
GOOGLE: 'Google',
|
GOOGLE: 'Google',
|
||||||
|
HISENSE: 'Hisense',
|
||||||
HMD: 'HMD',
|
HMD: 'HMD',
|
||||||
HP: 'HP',
|
HP: 'HP',
|
||||||
HTC: 'HTC',
|
HTC: 'HTC',
|
||||||
@@ -236,6 +255,7 @@ const Vendor = Object.freeze({
|
|||||||
ITEL: 'itel',
|
ITEL: 'itel',
|
||||||
JOLLA: 'Jolla',
|
JOLLA: 'Jolla',
|
||||||
KOBO: 'Kobo',
|
KOBO: 'Kobo',
|
||||||
|
LAVA: 'Lava',
|
||||||
LENOVO: 'Lenovo',
|
LENOVO: 'Lenovo',
|
||||||
LG: 'LG',
|
LG: 'LG',
|
||||||
MEIZU: 'Meizu',
|
MEIZU: 'Meizu',
|
||||||
@@ -253,9 +273,11 @@ const Vendor = Object.freeze({
|
|||||||
PALM: 'Palm',
|
PALM: 'Palm',
|
||||||
PANASONIC: 'Panasonic',
|
PANASONIC: 'Panasonic',
|
||||||
PEBBLE: 'Pebble',
|
PEBBLE: 'Pebble',
|
||||||
|
PHILIPS: 'Philips',
|
||||||
PICO: 'Pico',
|
PICO: 'Pico',
|
||||||
POLYTRON: 'Polytron',
|
POLYTRON: 'Polytron',
|
||||||
REALME: 'Realme',
|
REALME: 'Realme',
|
||||||
|
RETROID: 'Retroid',
|
||||||
RIM: 'RIM',
|
RIM: 'RIM',
|
||||||
ROKU: 'Roku',
|
ROKU: 'Roku',
|
||||||
SAMSUNG: 'Samsung',
|
SAMSUNG: 'Samsung',
|
||||||
@@ -266,11 +288,13 @@ const Vendor = Object.freeze({
|
|||||||
SPRINT: 'Sprint',
|
SPRINT: 'Sprint',
|
||||||
TCL: 'TCL',
|
TCL: 'TCL',
|
||||||
TECHNISAT: 'TechniSAT',
|
TECHNISAT: 'TechniSAT',
|
||||||
TECNO: 'Tecno',
|
TECNO: 'TECNO',
|
||||||
TESLA: 'Tesla',
|
TESLA: 'Tesla',
|
||||||
ULEFONE: 'Ulefone',
|
ULEFONE: 'Ulefone',
|
||||||
VIVO: 'Vivo',
|
VIVO: 'Vivo',
|
||||||
|
VIZIO: 'Vizio',
|
||||||
VODAFONE: 'Vodafone',
|
VODAFONE: 'Vodafone',
|
||||||
|
WIKO: 'Wiko',
|
||||||
XBOX: 'Xbox',
|
XBOX: 'Xbox',
|
||||||
XIAOMI: 'Xiaomi',
|
XIAOMI: 'Xiaomi',
|
||||||
ZEBRA: 'Zebra',
|
ZEBRA: 'Zebra',
|
||||||
@@ -278,8 +302,12 @@ const Vendor = Object.freeze({
|
|||||||
|
|
||||||
// TODO : test!
|
// TODO : test!
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `DeviceVendor` instead
|
||||||
|
*/
|
||||||
|
const Vendor = DeviceVendor;
|
||||||
|
|
||||||
const Engine = Object.freeze({
|
const EngineName = Object.freeze({
|
||||||
AMAYA: 'Amaya',
|
AMAYA: 'Amaya',
|
||||||
ARKWEB: 'ArkWeb',
|
ARKWEB: 'ArkWeb',
|
||||||
BLINK: 'Blink',
|
BLINK: 'Blink',
|
||||||
@@ -301,12 +329,17 @@ const Engine = Object.freeze({
|
|||||||
W3M: 'w3m',
|
W3M: 'w3m',
|
||||||
WEBKIT: 'WebKit'
|
WEBKIT: 'WebKit'
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `EngineName` instead
|
||||||
|
*/
|
||||||
|
const Engine = EngineName;
|
||||||
|
|
||||||
const OS = Object.freeze({
|
const OSName = Object.freeze({
|
||||||
AIX: 'AIX',
|
AIX: 'AIX',
|
||||||
AMIGA_OS: 'Amiga OS',
|
AMIGA_OS: 'Amiga OS',
|
||||||
ANDROID: 'Android',
|
ANDROID: 'Android',
|
||||||
ANDROID_X86: 'Android-x86',
|
ANDROID_X86: 'Android-x86',
|
||||||
|
ARCAOS: 'ArcaOS',
|
||||||
ARCH: 'Arch',
|
ARCH: 'Arch',
|
||||||
BADA: 'Bada',
|
BADA: 'Bada',
|
||||||
BEOS: 'BeOS',
|
BEOS: 'BeOS',
|
||||||
@@ -337,6 +370,7 @@ const OS = Object.freeze({
|
|||||||
IOS: 'iOS',
|
IOS: 'iOS',
|
||||||
JOLI: 'Joli',
|
JOLI: 'Joli',
|
||||||
KAIOS: 'KaiOS',
|
KAIOS: 'KaiOS',
|
||||||
|
KNOPPIX: 'Knoppix',
|
||||||
KUBUNTU: 'Kubuntu',
|
KUBUNTU: 'Kubuntu',
|
||||||
LINPUS: 'Linpus',
|
LINPUS: 'Linpus',
|
||||||
LINSPIRE: 'Linspire',
|
LINSPIRE: 'Linspire',
|
||||||
@@ -385,21 +419,342 @@ const OS = Object.freeze({
|
|||||||
WATCHOS: 'watchOS',
|
WATCHOS: 'watchOS',
|
||||||
WEBOS: 'WebOS',
|
WEBOS: 'WebOS',
|
||||||
WINDOWS: 'Windows',
|
WINDOWS: 'Windows',
|
||||||
|
WINDOWS_CE: 'Windows CE',
|
||||||
WINDOWS_IOT: 'Windows IoT',
|
WINDOWS_IOT: 'Windows IoT',
|
||||||
WINDOWS_MOBILE: 'Windows Mobile',
|
WINDOWS_MOBILE: 'Windows Mobile',
|
||||||
WINDOWS_PHONE: 'Windows Phone',
|
WINDOWS_PHONE: 'Windows Phone',
|
||||||
|
WINDOWS_RT: 'Windows RT',
|
||||||
XBOX: 'Xbox',
|
XBOX: 'Xbox',
|
||||||
|
XUBUNTU: 'Xubuntu',
|
||||||
ZENWALK: 'Zenwalk'
|
ZENWALK: 'Zenwalk'
|
||||||
|
|
||||||
// TODO : test!
|
// TODO : test!
|
||||||
});
|
});
|
||||||
|
/**
|
||||||
|
* @deprecated Use `OSName` instead
|
||||||
|
*/
|
||||||
|
const OS = OSName;
|
||||||
|
|
||||||
|
/*////////////////////////////////
|
||||||
|
* Enums for Extensions submodule
|
||||||
|
*///////////////////////////////
|
||||||
|
|
||||||
|
const Extension = Object.freeze({
|
||||||
|
BrowserName: {
|
||||||
|
CLI: {
|
||||||
|
CURL: 'curl',
|
||||||
|
ELINKS: 'ELinks',
|
||||||
|
HTTPIE: 'HTTPie',
|
||||||
|
LYNX: 'Lynx',
|
||||||
|
WGET: 'Wget'
|
||||||
|
},
|
||||||
|
Crawler: {
|
||||||
|
AHREFS_BOT: 'AhrefsBot',
|
||||||
|
AI2_BOT: 'AI2Bot',
|
||||||
|
AIHIT_BOT: 'aiHitBot',
|
||||||
|
ALGOLIA_CRAWLER: 'Algolia Crawler',
|
||||||
|
APPLE_BOT: 'Applebot',
|
||||||
|
APPLE_BOT_EXTENDED: 'Applebot-Extended',
|
||||||
|
ASK_TEOMA: 'Teoma',
|
||||||
|
AMAZON_BOT: 'Amazonbot',
|
||||||
|
AMAZON_CONTXBOT: 'contxbot',
|
||||||
|
ANTHROPIC_AI: 'anthropic-ai',
|
||||||
|
ANTHROPIC_CLAUDE_BOT: 'ClaudeBot',
|
||||||
|
ANTHROPIC_CLAUDE_SEARCHBOT: 'Claude-SearchBot',
|
||||||
|
ANTHROPIC_CLAUDE_WEB: 'Claude-Web',
|
||||||
|
ARCHIVEORG_BOT: 'archive.org_bot',
|
||||||
|
BAIDU_ADS: 'Baidu-ADS',
|
||||||
|
BAIDU_SPIDER: 'Baiduspider',
|
||||||
|
BAIDU_SPIDER_ADS: 'Baiduspider-ads',
|
||||||
|
BAIDU_SPIDER_CPRO: 'Baiduspider-cpro',
|
||||||
|
BAIDU_SPIDER_FAVO: 'Baiduspider-favo',
|
||||||
|
BAIDU_SPIDER_IMAGE: 'Baiduspider-image',
|
||||||
|
BAIDU_SPIDER_NEWS: 'Baiduspider-news',
|
||||||
|
BAIDU_SPIDER_RENDER: 'Baiduspider-render',
|
||||||
|
BAIDU_SPIDER_VIDEO: 'Baiduspider-video',
|
||||||
|
BLEX_BOT: 'BLEXBot',
|
||||||
|
BOTIFY: 'botify',
|
||||||
|
BRAVE_BOT: 'Bravebot',
|
||||||
|
BYTEDANCE_BYTESPIDER: 'Bytespider',
|
||||||
|
BYTEDANCE_TIKTOKSPIDER: 'TikTokSpider',
|
||||||
|
COMMON_CRAWL_CCBOT: 'CCBot',
|
||||||
|
COCCOC_BOT_WEB: 'coccocbot-web',
|
||||||
|
COCCOC_BOT_IMAGE: 'coccocbot-image',
|
||||||
|
COHERE_TRAINING_DATA_CRAWLER: 'cohere-training-data-crawler',
|
||||||
|
COTOYOGI: 'Cotoyogi',
|
||||||
|
COVEO_BOT: 'Coveobot',
|
||||||
|
CRITEO_BOT: 'CriteoBot',
|
||||||
|
DATAFORSEO_BOT: 'DataForSeoBot',
|
||||||
|
DAUM: 'Daum',
|
||||||
|
DAUM_DAUMOA: 'Daumoa',
|
||||||
|
DAUM_DAUMOA_IMAGE: 'Daumoa-image',
|
||||||
|
DEEPSEEK_BOT: 'DeepSeekBot',
|
||||||
|
DIFFBOT: 'Diffbot',
|
||||||
|
DUCKDUCKGO_BOT: 'DuckDuckBot',
|
||||||
|
DUCKDUCKGO_FAVICONS_BOT: 'DuckDuckGo-Favicons-Bot',
|
||||||
|
ELASTIC: 'Elastic',
|
||||||
|
ELASTIC_SWIFTYPE_BOT: 'Swiftbot',
|
||||||
|
EXALEAD_EXABOT: 'Exabot',
|
||||||
|
FIRECRAWL_AGENT: 'FirecrawlAgent',
|
||||||
|
FREESPOKE: 'Freespoke',
|
||||||
|
GOOGLE_ADSBOT: 'AdsBot-Google',
|
||||||
|
GOOGLE_ADSBOT_MOBILE: 'Adsbot-Google-Mobile',
|
||||||
|
GOOGLE_ADSENSE: 'AdSense',
|
||||||
|
GOOGLE_APIS: 'APIs-Google',
|
||||||
|
GOOGLE_BOT: 'Googlebot',
|
||||||
|
GOOGLE_BOT_IMAGE: 'Googlebot-Image',
|
||||||
|
GOOGLE_BOT_NEWS: 'Googlebot-News',
|
||||||
|
GOOGLE_BOT_VIDEO: 'Googlebot-Video',
|
||||||
|
GOOGLE_CLOUDVERTEXBOT: 'Google-CloudVertexBot',
|
||||||
|
GOOGLE_EXTENDED: 'Google-Extended',
|
||||||
|
GOOGLE_INSPECTIONTOOL: 'Google-InspectionTool',
|
||||||
|
GOOGLE_OTHER: 'GoogleOther',
|
||||||
|
GOOGLE_OTHER_IMAGE: 'GoogleOther-Image',
|
||||||
|
GOOGLE_OTHER_VIDEO: 'GoogleOther-Video',
|
||||||
|
GOOGLE_SAFETY: 'Google-Safety',
|
||||||
|
GOOGLE_STOREBOT: 'Storebot-Google',
|
||||||
|
HIVE_IMAGESIFTBOT: 'ImagesiftBot',
|
||||||
|
HUAWEI_PANGUBOT: 'PanguBot',
|
||||||
|
HUAWEI_PETALBOT: 'PetalBot',
|
||||||
|
HUGGINGFACE_BOT: 'HuggingFace-Bot',
|
||||||
|
HUNTER_VELENPUBLICWEBCRAWLER: 'VelenPublicWebCrawler',
|
||||||
|
IA_ARCHIVER: 'ia_archiver',
|
||||||
|
IASK_BOT: 'iAskBot',
|
||||||
|
KAGI_BOT: 'Kagibot',
|
||||||
|
KANGAROO_BOT: 'Kangaroo Bot',
|
||||||
|
LINE_SPIDER: 'Linespider',
|
||||||
|
LINKEDIN_BOT: 'LinkedInBot',
|
||||||
|
MAGPIE_CRAWLER: 'magpie-crawler',
|
||||||
|
MARGINALIA: 'marginalia',
|
||||||
|
META_EXTERNALAGENT: 'meta-externalagent',
|
||||||
|
META_FACEBOOKBOT: 'FacebookBot',
|
||||||
|
META_FACEBOOKCATALOG: 'facebookcatalog',
|
||||||
|
META_FACEBOOKEXTERNALHIT: 'facebookexternalhit',
|
||||||
|
MAJESTIC_MJ12BOT: 'MJ12bot',
|
||||||
|
MICROSOFT_BINGBOT: 'Bingbot',
|
||||||
|
MICROSOFT_MSNBOT: 'msnbot',
|
||||||
|
MICROSOFT_ADIDXBOT: 'adidxbot',
|
||||||
|
MOJEEK_BOT: 'MojeekBot',
|
||||||
|
MOZ_DOTBOT: 'DotBot',
|
||||||
|
ONCRAWL: 'OnCrawl',
|
||||||
|
ONESPOT_SCRAPERBOT: 'Onespot-ScraperBot',
|
||||||
|
OPENAI_GPTBOT: 'GPTBot',
|
||||||
|
OPENAI_SEARCH_BOT: 'OAI-SearchBot',
|
||||||
|
PERPLEXITY_BOT: 'PerplexityBot',
|
||||||
|
QIHOO_360_SPIDER: '360Spider',
|
||||||
|
QWANT_BOT: 'Qwantbot',
|
||||||
|
QWANT_BOT_NEWS: 'Qwantbot-news',
|
||||||
|
REPLICATE_BOT: 'Replicate-Bot',
|
||||||
|
RUNPOD_BOT: 'RunPod-Bot',
|
||||||
|
SB_INTUITIONS_BOT: 'SBIntuitionsBot',
|
||||||
|
SEEKPORT_BOT: 'SeekportBot',
|
||||||
|
SEMRUSH_BOT: 'SemrushBot',
|
||||||
|
SEMRUSH_BOT_BACKLINK: 'SemrushBot-BA',
|
||||||
|
SEMRUSH_BOT_CONTENTSHAKE: 'SemrushBot-OCOB',
|
||||||
|
SEMRUSH_BOT_SEO_CHECKER: 'SemrushBot-SI',
|
||||||
|
SEZNAM_BOT: 'SeznamBot',
|
||||||
|
SITEIMPROVE: 'Siteimprove',
|
||||||
|
SOGOU_PIC_SPIDER: 'Sogou Pic Spider',
|
||||||
|
SOGOU_WEB_SPIDER: 'Sogou web spider',
|
||||||
|
STARTPAGE: 'Startpage',
|
||||||
|
SURLY_BOT: 'SurdotlyBot',
|
||||||
|
TIMPI_BOT: 'Timpibot',
|
||||||
|
TOGETHER_BOT: 'Together-Bot',
|
||||||
|
TURNITIN_BOT: 'TurnitinBot',
|
||||||
|
TWIN_AGENT: 'TwinAgent',
|
||||||
|
VERCEL_V0BOT: 'v0bot',
|
||||||
|
WEBZIO: 'webzio',
|
||||||
|
WEBZIO_EXTENDED: 'Webzio-Extended',
|
||||||
|
WEBZIO_OMGILI: 'omgili',
|
||||||
|
WEBZIO_OMGILI_BOT: 'omgilibot',
|
||||||
|
XAI_BOT: 'xAI-Bot',
|
||||||
|
YAHOO_JAPAN: 'Y!J-BRW',
|
||||||
|
YAHOO_SLURP: 'Yahoo! Slurp',
|
||||||
|
YANDEX_ACCESSIBILITY_BOT: 'YandexAccessibilityBot',
|
||||||
|
YANDEX_ADDITIONAL_BOT: 'YandexAdditionalBot',
|
||||||
|
YANDEX_ADNET: 'YandexAdNet',
|
||||||
|
YANDEX_BLOGS: 'YandexBlogs',
|
||||||
|
YANDEX_BOT: 'YandexBot',
|
||||||
|
YANDEX_BOT_MIRRORDETECTOR: 'YandexBot MirrorDetector',
|
||||||
|
YANDEX_COMBOT: 'YandexComBot',
|
||||||
|
YANDEX_FAVICONS: 'YandexFavicons',
|
||||||
|
YANDEX_IMAGE_RESIZER: 'YandexImageResizer',
|
||||||
|
YANDEX_IMAGES: 'YandexImages',
|
||||||
|
YANDEX_MARKET: 'YandexMarket',
|
||||||
|
YANDEX_MEDIA: 'YandexMedia',
|
||||||
|
YANDEX_METRIKA: 'YandexMetrika',
|
||||||
|
YANDEX_MOBILE_BOT: 'YandexMobileBot',
|
||||||
|
YANDEX_MOBILE_SCREENSHOT_BOT: 'YandexMobileScreenShotBot',
|
||||||
|
YANDEX_NEWS: 'YandexNews',
|
||||||
|
YANDEX_ONTODB: 'YandexOntoDB',
|
||||||
|
YANDEX_ONTODB_API: 'YandexOntoDBAPI',
|
||||||
|
YANDEX_PARTNER: 'YandexPartner',
|
||||||
|
YANDEX_RCA: 'YandexRCA',
|
||||||
|
YANDEX_RENDERRESOURCES_BOT: 'YandexRenderResourcesBot',
|
||||||
|
YANDEX_SCREENSHOT_BOT: 'YandexScreenshotBot',
|
||||||
|
YANDEX_SPRAV_BOT: 'YandexSpravBot',
|
||||||
|
YANDEX_TRACKER: 'YandexTracker',
|
||||||
|
YANDEX_VERTICALS: 'YandexVerticals',
|
||||||
|
YANDEX_VERTIS: 'YandexVertis',
|
||||||
|
YANDEX_VIDEO: 'YandexVideo',
|
||||||
|
YANDEX_VIDEO_PARSER: 'YandexVideoParser',
|
||||||
|
YANDEX_WEBMASTER: 'YandexWebmaster',
|
||||||
|
YEP_BOT: 'YepBot',
|
||||||
|
YETI: 'Yeti',
|
||||||
|
YISOU_SPIDER: 'YisouSpider',
|
||||||
|
YOU_BOT: 'YouBot',
|
||||||
|
ZHIPU_CHATGLM_SPIDER: 'ChatGLM-Spider',
|
||||||
|
ZUM_BOT: 'ZumBot'
|
||||||
|
},
|
||||||
|
Email: {
|
||||||
|
AIRMAIL: 'Airmail',
|
||||||
|
APPLE_MAIL: 'Mail',
|
||||||
|
BLUEMAIL: 'BlueMail',
|
||||||
|
DAUM_MAIL: 'DaumMail',
|
||||||
|
EVOLUTION: 'Evolution',
|
||||||
|
EM_CLIENT: 'eM Client',
|
||||||
|
FOXMAIL: 'Foxmail',
|
||||||
|
KMAIL: 'KMail',
|
||||||
|
KMAIL2: 'kmail2',
|
||||||
|
KONTACT: 'Kontact',
|
||||||
|
MICROSOFT_OUTLOOK: 'Microsoft Outlook',
|
||||||
|
MICROSOFT_OUTLOOK_MAC: 'MacOutlook',
|
||||||
|
NAVER_MAILAPP: 'NaverMailApp',
|
||||||
|
POLYMAIL: 'Polymail',
|
||||||
|
PROTON_MAIL: 'ProtonMail',
|
||||||
|
SPARK_MAIL: 'SparkDesktop',
|
||||||
|
SPARROW: 'Sparrow',
|
||||||
|
THUNDERBIRD: 'Thunderbird',
|
||||||
|
YAHOO_MAIL: 'Yahoo',
|
||||||
|
ZIMBRA: 'Zimbra',
|
||||||
|
ZOHO_MAIL: 'ZohoMail-Desktop'
|
||||||
|
},
|
||||||
|
Fetcher: {
|
||||||
|
AHREFS_SITEAUDIT: 'AhrefsSiteAudit',
|
||||||
|
ANTHROPIC_CLAUDE_USER: 'Claude-User',
|
||||||
|
ASANA: 'Asana',
|
||||||
|
BETTER_UPTIME_BOT: 'Better Uptime Bot',
|
||||||
|
BITLY_BOT: 'bitlybot',
|
||||||
|
BLUESKY: 'Bluesky',
|
||||||
|
BUFFER_LINKPREVIEWBOT: 'BufferLinkPreviewBot',
|
||||||
|
COHERE_AI: 'Cohere-AI',
|
||||||
|
DISCORD_BOT: 'Discordbot',
|
||||||
|
DUCKDUCKGO_ASSISTBOT: 'DuckAssistBot',
|
||||||
|
GOOGLE_CHROME_LIGHTHOUSE: 'Chrome-Lighthouse',
|
||||||
|
GOOGLE_FEEDFETCHER: 'FeedFetcher-Google',
|
||||||
|
GOOGLE_GEMINI_DEEP_RESEARCH: 'Gemini-Deep-Research',
|
||||||
|
GOOGLE_IMAGEPROXY: 'GoogleImageProxy',
|
||||||
|
GOOGLE_PAGERENDERER: 'Google-PageRenderer',
|
||||||
|
GOOGLE_READ_ALOUD: 'Google-Read-Aloud',
|
||||||
|
GOOGLE_PRODUCER: 'GoogleProducer',
|
||||||
|
GOOGLE_SITE_VERIFICATION: 'Google-Site-Verification',
|
||||||
|
HUBSPOT_PAGE_FETCHER: 'HubSpot Page Fetcher',
|
||||||
|
IFRAMELY: 'Iframely',
|
||||||
|
KAKAOTALK_SCRAP: 'kakaotalk-scrap',
|
||||||
|
KEYBASE_BOT: 'KeybaseBot',
|
||||||
|
META_EXTERNALFETCHER: 'meta-externalfetcher',
|
||||||
|
META_WHATSAPP: 'WhatsApp',
|
||||||
|
MICROSOFT_BINGPREVIEW: 'BingPreview',
|
||||||
|
MICROSOFT_PREVIEW: 'MicrosoftPreview',
|
||||||
|
MISTRALAI_USER: 'MistralAI-User',
|
||||||
|
NAVER_BLUENO: 'Blueno',
|
||||||
|
ONCRAWL_ROGERBOT: 'rogerbot',
|
||||||
|
OPENAI_CHATGPT_USER: 'ChatGPT-User',
|
||||||
|
PERPLEXITY_USER: 'Perplexity-User',
|
||||||
|
PINTEREST_BOT: 'Pinterestbot',
|
||||||
|
SEMRUSH_SITEAUDITBOT: 'SiteAuditBot',
|
||||||
|
SLACK_BOT: 'Slackbot',
|
||||||
|
SLACK_BOT_LINKEXPANDING: 'Slackbot-LinkExpanding',
|
||||||
|
SLACK_IMGPROXY: 'Slack-ImgProxy',
|
||||||
|
SNAP_URL_PREVIEW: 'Snap URL Preview',
|
||||||
|
SKYPE_URIPREVIEW: 'SkypeUriPreview',
|
||||||
|
TELEGRAM_BOT: 'TelegramBot',
|
||||||
|
UPTIMEROBOT: 'UptimeRobot',
|
||||||
|
VERCEL_FAVICON_BOT: 'vercel-favicon-bot',
|
||||||
|
VERCEL_SCREENSHOT_BOT: 'vercel-screenshot-bot',
|
||||||
|
VERCEL_BOT: 'Vercelbot',
|
||||||
|
VERCEL_FLAGS: 'vercelflags',
|
||||||
|
VERCEL_TRACING: 'verceltracing',
|
||||||
|
X_TWITTERBOT: 'Twitterbot',
|
||||||
|
YANDEX_CALENDAR: 'YandexCalendar',
|
||||||
|
YANDEX_DIRECT: 'YandexDirect',
|
||||||
|
YANDEX_DIRECTDYN: 'YandexDirectDyn',
|
||||||
|
YANDEX_DIRECTFETCHER: 'YaDirectFetcher',
|
||||||
|
YANDEX_FORDOMAIN: 'YandexForDomain',
|
||||||
|
YANDEX_PAGECHECKER: 'YandexPagechecker',
|
||||||
|
YANDEX_SEARCHSHOP: 'YandexSearchShop',
|
||||||
|
YANDEX_SITELINKS: 'YandexSitelinks',
|
||||||
|
YANDEX_USERPROXY: 'YandexUserproxy',
|
||||||
|
ZOOMINFO_BOT: 'Zoombot'
|
||||||
|
},
|
||||||
|
InApp: {
|
||||||
|
DISCORD: 'Discord',
|
||||||
|
EVERNOTE: 'Evernote',
|
||||||
|
FIGMA: 'Figma',
|
||||||
|
FLIPBOARD: 'Flipboard',
|
||||||
|
MATTERMOST: 'Mattermost',
|
||||||
|
TEAMS: 'Teams',
|
||||||
|
NOTION: 'Notion',
|
||||||
|
POSTMAN: 'Postman',
|
||||||
|
RAMBOX: 'Rambox',
|
||||||
|
ROCKETCHAT: 'Rocket.Chat',
|
||||||
|
SLACK: 'Slack',
|
||||||
|
TIKTOK_LITE: 'TikTok Lite',
|
||||||
|
VSCODE: 'VS Code',
|
||||||
|
YAHOO_JAPAN: 'Yahoo! Japan'
|
||||||
|
},
|
||||||
|
Library: {
|
||||||
|
ADOBE_AIR: 'AdobeAIR',
|
||||||
|
AIOHTTP: 'aiohttp',
|
||||||
|
APACHE_HTTPCLIENT: 'Apache-HttpClient',
|
||||||
|
AXIOS: 'axios',
|
||||||
|
GO_HTTP_CLIENT: 'go-http-client',
|
||||||
|
GOT: 'got',
|
||||||
|
GUZZLEHTTP: 'GuzzleHttp',
|
||||||
|
JAVA: 'Java',
|
||||||
|
JAVA_HTTPCLIENT: 'Java-http-client',
|
||||||
|
JSDOM: 'jsdom',
|
||||||
|
LIBWWW_PERL: 'libwww-perl',
|
||||||
|
LUA_RESTY_HTTP: 'lua-resty-http',
|
||||||
|
NEEDLE: 'Needle',
|
||||||
|
NUTCH: 'Nutch',
|
||||||
|
OKHTTP: 'OkHttp',
|
||||||
|
NODE_FETCH: 'node-fetch',
|
||||||
|
NODE_SUPERAGENT: 'node-superagent',
|
||||||
|
PHP_SOAP: 'PHP-SOAP',
|
||||||
|
POSTMAN_RUNTIME: 'PostmanRuntime',
|
||||||
|
PYTHON_HTTPX: 'python-httpx',
|
||||||
|
PYTHON_URLLIB: 'python-urllib',
|
||||||
|
PYTHON_URLLIB3: 'python-urllib3',
|
||||||
|
PYTHON_REQUESTS: 'python-requests',
|
||||||
|
SCRAPY: 'Scrapy'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
DeviceVendor: {
|
||||||
|
Vehicle: {
|
||||||
|
BMW: 'BMW',
|
||||||
|
BYD: 'BYD',
|
||||||
|
JEEP: 'Jeep',
|
||||||
|
RIVIAN: 'Rivian',
|
||||||
|
TESLA: 'Tesla',
|
||||||
|
VOLVO: 'Volvo'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
export {
|
export {
|
||||||
Browser,
|
Browser,// deprecated
|
||||||
|
CPU, // deprecated
|
||||||
|
Device, // deprecated
|
||||||
|
Vendor, // deprecated
|
||||||
|
Engine, // deprecated
|
||||||
|
OS, // deprecated
|
||||||
|
BrowserName,
|
||||||
BrowserType,
|
BrowserType,
|
||||||
CPU,
|
CPUArch,
|
||||||
Device,
|
DeviceType,
|
||||||
Vendor,
|
DeviceVendor,
|
||||||
Engine,
|
EngineName,
|
||||||
OS
|
OSName,
|
||||||
|
Extension
|
||||||
};
|
};
|
||||||
2
src/extensions/ua-parser-extensions.d.ts
vendored
2
src/extensions/ua-parser-extensions.d.ts
vendored
@@ -1,4 +1,4 @@
|
|||||||
// Type definitions for Helpers submodule of UAParser.js v2.0.3
|
// Type definitions for Helpers submodule of UAParser.js v2.0.5
|
||||||
// Project: https://github.com/faisalman/ua-parser-js
|
// Project: https://github.com/faisalman/ua-parser-js
|
||||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Extensions for UAParser.js v2.0.3
|
/* Extensions for UAParser.js v2.0.6
|
||||||
https://github.com/faisalman/ua-parser-js
|
https://github.com/faisalman/ua-parser-js
|
||||||
Author: Faisal Salman <f@faisalman.com>
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
AGPLv3 License */
|
AGPLv3 License */
|
||||||
@@ -43,18 +43,33 @@ const Crawlers = Object.freeze({
|
|||||||
// AhrefsBot - https://ahrefs.com/robot
|
// AhrefsBot - https://ahrefs.com/robot
|
||||||
// Amazonbot - https://developer.amazon.com/amazonbot
|
// Amazonbot - https://developer.amazon.com/amazonbot
|
||||||
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
||||||
|
// Bravebot - https://search.brave.com/help/brave-search-crawler
|
||||||
// CCBot - https://commoncrawl.org/faq
|
// CCBot - https://commoncrawl.org/faq
|
||||||
|
// contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
|
||||||
|
// Coveobot - https://connect.coveo.com/s/article/19648
|
||||||
|
// CriteoBot - https://www.criteo.com/criteo-crawler/
|
||||||
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
||||||
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
||||||
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
||||||
// GPTBot - https://platform.openai.com/docs/gptbot
|
// GPTBot - https://platform.openai.com/docs/gptbot
|
||||||
|
// iAskBot - https://iask.ai
|
||||||
|
// Kagibot - https://kagi.com/bot
|
||||||
|
// Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
|
||||||
// LinkedInBot - http://www.linkedin.com
|
// LinkedInBot - http://www.linkedin.com
|
||||||
// MJ12bot - https://mj12bot.com/
|
// MJ12bot - https://mj12bot.com/
|
||||||
// MojeekBot - https://www.mojeek.com/bot.html
|
// MojeekBot - https://www.mojeek.com/bot.html
|
||||||
|
// Onespot - https://www.onespot.com/identifying-traffic.html
|
||||||
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
||||||
// PerplexityBot - https://perplexity.ai/perplexitybot
|
// PerplexityBot - https://perplexity.ai/perplexitybot
|
||||||
|
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
|
||||||
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
||||||
/((?:adidx|ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|linkedin|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
|
// SurdotlyBot - http://sur.ly/bot.html
|
||||||
|
// Swiftbot - https://swiftype.com/swiftbot
|
||||||
|
// YepBot - https://yep.com/yepbot/
|
||||||
|
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
|
||||||
|
|
||||||
|
// Algolia Crawler
|
||||||
|
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// Applebot - http://apple.com/go/applebot
|
// Applebot - http://apple.com/go/applebot
|
||||||
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
||||||
@@ -63,11 +78,14 @@ const Crawlers = Object.freeze({
|
|||||||
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// ClaudeBot (Anthropic)
|
// ClaudeBot (Anthropic)
|
||||||
/(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
||||||
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Daum
|
||||||
|
/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
|
||||||
|
|
||||||
// Facebook / Meta
|
// Facebook / Meta
|
||||||
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
||||||
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
||||||
@@ -78,6 +96,12 @@ const Crawlers = Object.freeze({
|
|||||||
// Internet Archive (archive.org)
|
// Internet Archive (archive.org)
|
||||||
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
||||||
|
|
||||||
|
// OnCrawl
|
||||||
|
/(oncrawl) mobile\/([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Qwantbot - https://help.qwant.com/bot
|
||||||
|
/(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// SemrushBot - http://www.semrush.com/bot.html
|
// SemrushBot - http://www.semrush.com/bot.html
|
||||||
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
||||||
|
|
||||||
@@ -88,30 +112,38 @@ const Crawlers = Object.freeze({
|
|||||||
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Yandex Bots - https://yandex.com/bots
|
// Yandex Bots - https://yandex.com/bots
|
||||||
/(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i,
|
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Yeti (Naver)
|
// Yeti (Naver)
|
||||||
/(yeti)\/([\w\.]+)/i,
|
/(yeti)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// aiHitBot / Diffbot / Linespider / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
|
// aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
|
||||||
/((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|openai image downloader|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |line|yisou)spider)\/?([\w\.]*)/i
|
// Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
|
||||||
|
// Freespoke - https://docs.freespoke.com/search/bot/
|
||||||
|
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
|
||||||
],
|
],
|
||||||
|
|
||||||
[NAME, VERSION, [TYPE, CRAWLER]],
|
[NAME, VERSION, [TYPE, CRAWLER]],
|
||||||
|
|
||||||
|
[
|
||||||
|
// YandexBot MirrorDetector
|
||||||
|
/(yandexbot\/([\w\.]+); mirrordetector)/i
|
||||||
|
],
|
||||||
|
[[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],
|
||||||
|
|
||||||
[
|
[
|
||||||
// Google Bots
|
// Google Bots
|
||||||
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
||||||
|
|
||||||
// AI2Bot - https://allenai.org/crawler
|
// AI2Bot - https://allenai.org/crawler
|
||||||
// Bytespider
|
|
||||||
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
||||||
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
||||||
// ImagesiftBot - https://imagesift.com/about
|
// ImagesiftBot - https://imagesift.com/about
|
||||||
// Qihoo 360Spider
|
// Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
|
||||||
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
||||||
|
// v0bot - https://vercel.com/docs/bot-management
|
||||||
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
||||||
/\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|yahoo! slurp)/i
|
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
|
||||||
|
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
|
||||||
],
|
],
|
||||||
[NAME, [TYPE, CRAWLER]]
|
[NAME, [TYPE, CRAWLER]]
|
||||||
]
|
]
|
||||||
@@ -204,9 +236,18 @@ const ExtraDevices = Object.freeze({
|
|||||||
const Emails = Object.freeze({
|
const Emails = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
[
|
[
|
||||||
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
|
||||||
/(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
|
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
|
||||||
], [NAME, VERSION, [TYPE, EMAIL]]
|
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
|
||||||
|
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Apple's Mail
|
||||||
|
/(mail)\/([\w\.]+) cf/i
|
||||||
|
], [NAME, VERSION, [TYPE, EMAIL]], [
|
||||||
|
|
||||||
|
// Zimbra
|
||||||
|
/zdesktop\/([\w\.]+)/i
|
||||||
|
], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -217,31 +258,35 @@ const Emails = Object.freeze({
|
|||||||
const Fetchers = Object.freeze({
|
const Fetchers = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
[
|
[
|
||||||
|
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot / WhatsApp
|
||||||
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
||||||
|
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
|
||||||
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
||||||
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
||||||
// Better Uptime / BingPreview / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
|
|
||||||
// Google Site Verifier / Meta / Yahoo! Japan
|
// Google Site Verifier / Meta / Yahoo! Japan
|
||||||
|
// Iframely - https://iframely.com/docs/about
|
||||||
|
// Perplexity-User - https://docs.perplexity.ai/guides/bots
|
||||||
|
// MistralAI-User - https://docs.mistral.ai/robots/
|
||||||
// Yandex Bots - https://yandex.com/bots
|
// Yandex Bots - https://yandex.com/bots
|
||||||
/(ahrefssiteaudit|(?:bing|microsoft)preview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher|whatsapp)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Bluesky
|
// Bluesky
|
||||||
/(bluesky) cardyb\/([\w\.]+)/i,
|
/(bluesky) cardyb\/([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Nova Act - https://github.com/aws/nova-act
|
||||||
|
/agent-(novaact)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Skype
|
// Skype
|
||||||
/(skypeuripreview) preview\/([\w\.]+)/i,
|
/(skypeuripreview) preview\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Slackbot - https://api.slack.com/robots
|
// Slackbot - https://api.slack.com/robots
|
||||||
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
|
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i
|
||||||
|
|
||||||
// WhatsApp
|
|
||||||
/(whatsapp)\/([\w\.]+)/i
|
|
||||||
],
|
],
|
||||||
[NAME, VERSION, [TYPE, FETCHER]],
|
[NAME, VERSION, [TYPE, FETCHER]],
|
||||||
|
|
||||||
[
|
[
|
||||||
// Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
|
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
|
||||||
/((?:better uptime |telegram|vercel)bot|cohere-ai|feedfetcher-google|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|yandex(?:sitelinks|userproxy))/i
|
/((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
|
||||||
],
|
],
|
||||||
[NAME, [TYPE, FETCHER]],
|
[NAME, [TYPE, FETCHER]],
|
||||||
],
|
],
|
||||||
@@ -257,13 +302,31 @@ const Fetchers = Object.freeze({
|
|||||||
///////////////////
|
///////////////////
|
||||||
|
|
||||||
const InApps = Object.freeze({
|
const InApps = Object.freeze({
|
||||||
browser : [
|
browser : [[
|
||||||
|
// Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
|
||||||
|
/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
|
||||||
|
/(flipboard)\/([\w\.]+)/i
|
||||||
|
], [NAME, VERSION, [TYPE, INAPP]], [
|
||||||
|
|
||||||
|
// Evernote/Teams on mobile
|
||||||
|
/(evernote) win/i,
|
||||||
|
/(teams)mobile-(ios|and)/i
|
||||||
|
], [NAME, [TYPE, INAPP]], [
|
||||||
|
|
||||||
// Slack
|
// Slack
|
||||||
[/(?:slack(?=.+electron|.+ios)|chatlyio)\/([\d\.]+)/i],
|
/chatlyio\/([\d\.]+)/i],
|
||||||
[VERSION, [NAME, 'Slack'], [TYPE, INAPP]],
|
[VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [
|
||||||
|
|
||||||
|
// TikTok Lite
|
||||||
|
/ultralite app_version\/([\w\.]+)/i],
|
||||||
|
[VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [
|
||||||
|
|
||||||
|
// VS Code
|
||||||
|
/\) code\/([\d\.]+).+electron\//i],
|
||||||
|
[VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [
|
||||||
|
|
||||||
// Yahoo! Japan
|
// Yahoo! Japan
|
||||||
[/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],
|
/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],
|
||||||
[VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]
|
[VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
@@ -326,11 +389,15 @@ const MediaPlayers = Object.freeze({
|
|||||||
|
|
||||||
const Libraries = Object.freeze({
|
const Libraries = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
|
|
||||||
[
|
[
|
||||||
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:urllib|requests)|scrapy)\/([\w\.]+)/i,
|
// Apache-HttpClient/Axios/Bun/Dart/go-http-client/got/GuzzleHttp/hackney/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/Node.js/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/rest-client/Scrapy/superagent
|
||||||
/(jsdom|(?<=\()java)\/([\w\.]+)/i
|
/^(apache-httpclient|axios|bun|dart|deno|(?:go|java)-http-client|got|guzzlehttp|hackney|java|libwww-perl|lua-resty-http|needle|node(?:\.js|-fetch|-superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|rest-client|scrapy)\/([\w\.]+)/i,
|
||||||
], [NAME, VERSION, [TYPE, LIBRARY]]
|
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
|
||||||
|
/(nutch)-([\w\.-]+)(\(|$)/i,
|
||||||
|
/\((java)\/([\w\.]+)/i
|
||||||
|
], [NAME, VERSION, [TYPE, LIBRARY]], [
|
||||||
|
/(node-fetch|undici)/i
|
||||||
|
], [NAME, [TYPE, LIBRARY]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -364,8 +431,8 @@ const Vehicles = Object.freeze({
|
|||||||
const Bots = Object.freeze({
|
const Bots = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
...CLIs.browser,
|
...CLIs.browser,
|
||||||
...Crawlers.browser,
|
|
||||||
...Fetchers.browser,
|
...Fetchers.browser,
|
||||||
|
...Crawlers.browser,
|
||||||
...Libraries.browser
|
...Libraries.browser
|
||||||
],
|
],
|
||||||
os : [
|
os : [
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
// Source: /src/extensions/ua-parser-extensions.js
|
// Source: /src/extensions/ua-parser-extensions.js
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Extensions for UAParser.js v2.0.3
|
/* Extensions for UAParser.js v2.0.6
|
||||||
https://github.com/faisalman/ua-parser-js
|
https://github.com/faisalman/ua-parser-js
|
||||||
Author: Faisal Salman <f@faisalman.com>
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
AGPLv3 License */
|
AGPLv3 License */
|
||||||
@@ -47,18 +47,33 @@ const Crawlers = Object.freeze({
|
|||||||
// AhrefsBot - https://ahrefs.com/robot
|
// AhrefsBot - https://ahrefs.com/robot
|
||||||
// Amazonbot - https://developer.amazon.com/amazonbot
|
// Amazonbot - https://developer.amazon.com/amazonbot
|
||||||
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
||||||
|
// Bravebot - https://search.brave.com/help/brave-search-crawler
|
||||||
// CCBot - https://commoncrawl.org/faq
|
// CCBot - https://commoncrawl.org/faq
|
||||||
|
// contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
|
||||||
|
// Coveobot - https://connect.coveo.com/s/article/19648
|
||||||
|
// CriteoBot - https://www.criteo.com/criteo-crawler/
|
||||||
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
||||||
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
||||||
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
||||||
// GPTBot - https://platform.openai.com/docs/gptbot
|
// GPTBot - https://platform.openai.com/docs/gptbot
|
||||||
|
// iAskBot - https://iask.ai
|
||||||
|
// Kagibot - https://kagi.com/bot
|
||||||
|
// Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
|
||||||
// LinkedInBot - http://www.linkedin.com
|
// LinkedInBot - http://www.linkedin.com
|
||||||
// MJ12bot - https://mj12bot.com/
|
// MJ12bot - https://mj12bot.com/
|
||||||
// MojeekBot - https://www.mojeek.com/bot.html
|
// MojeekBot - https://www.mojeek.com/bot.html
|
||||||
|
// Onespot - https://www.onespot.com/identifying-traffic.html
|
||||||
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
||||||
// PerplexityBot - https://perplexity.ai/perplexitybot
|
// PerplexityBot - https://perplexity.ai/perplexitybot
|
||||||
|
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
|
||||||
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
||||||
/((?:adidx|ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|linkedin|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
|
// SurdotlyBot - http://sur.ly/bot.html
|
||||||
|
// Swiftbot - https://swiftype.com/swiftbot
|
||||||
|
// YepBot - https://yep.com/yepbot/
|
||||||
|
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
|
||||||
|
|
||||||
|
// Algolia Crawler
|
||||||
|
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// Applebot - http://apple.com/go/applebot
|
// Applebot - http://apple.com/go/applebot
|
||||||
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
||||||
@@ -67,11 +82,14 @@ const Crawlers = Object.freeze({
|
|||||||
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// ClaudeBot (Anthropic)
|
// ClaudeBot (Anthropic)
|
||||||
/(claude(?:bot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
||||||
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Daum
|
||||||
|
/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
|
||||||
|
|
||||||
// Facebook / Meta
|
// Facebook / Meta
|
||||||
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
||||||
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
||||||
@@ -82,6 +100,12 @@ const Crawlers = Object.freeze({
|
|||||||
// Internet Archive (archive.org)
|
// Internet Archive (archive.org)
|
||||||
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
||||||
|
|
||||||
|
// OnCrawl
|
||||||
|
/(oncrawl) mobile\/([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Qwantbot - https://help.qwant.com/bot
|
||||||
|
/(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
|
||||||
|
|
||||||
// SemrushBot - http://www.semrush.com/bot.html
|
// SemrushBot - http://www.semrush.com/bot.html
|
||||||
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
||||||
|
|
||||||
@@ -92,30 +116,38 @@ const Crawlers = Object.freeze({
|
|||||||
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Yandex Bots - https://yandex.com/bots
|
// Yandex Bots - https://yandex.com/bots
|
||||||
/(yandex(?:(?:mobile)?(?:accessibility|additional|renderresources|screenshot|sprav)?bot|image(?:s|resizer)|video(?:parser)?|blogs|adnet|favicons|fordomain|market|media|metrika|news|ontodb(?:api)?|pagechecker|partner|rca|tracker|turbo|vertis|webmaster|antivirus))\/([\w\.]+)/i,
|
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Yeti (Naver)
|
// Yeti (Naver)
|
||||||
/(yeti)\/([\w\.]+)/i,
|
/(yeti)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// aiHitBot / Diffbot / Linespider / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
|
// aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
|
||||||
/((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|openai image downloader|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |line|yisou)spider)\/?([\w\.]*)/i
|
// Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
|
||||||
|
// Freespoke - https://docs.freespoke.com/search/bot/
|
||||||
|
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
|
||||||
],
|
],
|
||||||
|
|
||||||
[NAME, VERSION, [TYPE, CRAWLER]],
|
[NAME, VERSION, [TYPE, CRAWLER]],
|
||||||
|
|
||||||
|
[
|
||||||
|
// YandexBot MirrorDetector
|
||||||
|
/(yandexbot\/([\w\.]+); mirrordetector)/i
|
||||||
|
],
|
||||||
|
[[NAME, /\/.+;/ig, ''], VERSION, [TYPE, CRAWLER]],
|
||||||
|
|
||||||
[
|
[
|
||||||
// Google Bots
|
// Google Bots
|
||||||
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
||||||
|
|
||||||
// AI2Bot - https://allenai.org/crawler
|
// AI2Bot - https://allenai.org/crawler
|
||||||
// Bytespider
|
|
||||||
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
||||||
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
||||||
// ImagesiftBot - https://imagesift.com/about
|
// ImagesiftBot - https://imagesift.com/about
|
||||||
// Qihoo 360Spider
|
// Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
|
||||||
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
||||||
|
// v0bot - https://vercel.com/docs/bot-management
|
||||||
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
||||||
/\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|yahoo! slurp)/i
|
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
|
||||||
|
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
|
||||||
],
|
],
|
||||||
[NAME, [TYPE, CRAWLER]]
|
[NAME, [TYPE, CRAWLER]]
|
||||||
]
|
]
|
||||||
@@ -208,9 +240,18 @@ const ExtraDevices = Object.freeze({
|
|||||||
const Emails = Object.freeze({
|
const Emails = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
[
|
[
|
||||||
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
|
||||||
/(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
|
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
|
||||||
], [NAME, VERSION, [TYPE, EMAIL]]
|
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
|
||||||
|
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
|
||||||
|
|
||||||
|
// Apple's Mail
|
||||||
|
/(mail)\/([\w\.]+) cf/i
|
||||||
|
], [NAME, VERSION, [TYPE, EMAIL]], [
|
||||||
|
|
||||||
|
// Zimbra
|
||||||
|
/zdesktop\/([\w\.]+)/i
|
||||||
|
], [VERSION, [NAME, 'Zimbra'], [TYPE, EMAIL]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -221,13 +262,17 @@ const Emails = Object.freeze({
|
|||||||
const Fetchers = Object.freeze({
|
const Fetchers = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
[
|
[
|
||||||
|
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
|
||||||
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
||||||
|
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
|
||||||
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
||||||
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
||||||
// Better Uptime / BingPreview / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
|
|
||||||
// Google Site Verifier / Meta / Yahoo! Japan
|
// Google Site Verifier / Meta / Yahoo! Japan
|
||||||
|
// Iframely - https://iframely.com/docs/about
|
||||||
|
// Perplexity-User - https://docs.perplexity.ai/guides/bots
|
||||||
|
// MistralAI-User - https://docs.mistral.ai/robots/
|
||||||
// Yandex Bots - https://yandex.com/bots
|
// Yandex Bots - https://yandex.com/bots
|
||||||
/(ahrefssiteaudit|(?:bing|microsoft)preview|chatgpt-user|mastodon|(?:discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero)bot|google-site-verification|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Bluesky
|
// Bluesky
|
||||||
/(bluesky) cardyb\/([\w\.]+)/i,
|
/(bluesky) cardyb\/([\w\.]+)/i,
|
||||||
@@ -244,8 +289,8 @@ const Fetchers = Object.freeze({
|
|||||||
[NAME, VERSION, [TYPE, FETCHER]],
|
[NAME, VERSION, [TYPE, FETCHER]],
|
||||||
|
|
||||||
[
|
[
|
||||||
// Google Bots / Cohere / Snapchat / Vercelbot / Yandex Bots
|
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
|
||||||
/((?:better uptime |telegram|vercel)bot|cohere-ai|feedfetcher-google|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|yandex(?:sitelinks|userproxy))/i
|
/((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
|
||||||
],
|
],
|
||||||
[NAME, [TYPE, FETCHER]],
|
[NAME, [TYPE, FETCHER]],
|
||||||
],
|
],
|
||||||
@@ -261,13 +306,31 @@ const Fetchers = Object.freeze({
|
|||||||
///////////////////
|
///////////////////
|
||||||
|
|
||||||
const InApps = Object.freeze({
|
const InApps = Object.freeze({
|
||||||
browser : [
|
browser : [[
|
||||||
|
// Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
|
||||||
|
/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
|
||||||
|
/(flipboard)\/([\w\.]+)/i
|
||||||
|
], [NAME, VERSION, [TYPE, INAPP]], [
|
||||||
|
|
||||||
|
// Evernote/Teams on mobile
|
||||||
|
/(evernote) win/i,
|
||||||
|
/(teams)mobile-(ios|and)/i
|
||||||
|
], [NAME, [TYPE, INAPP]], [
|
||||||
|
|
||||||
// Slack
|
// Slack
|
||||||
[/(?:slack(?=.+electron|.+ios)|chatlyio)\/([\d\.]+)/i],
|
/chatlyio\/([\d\.]+)/i],
|
||||||
[VERSION, [NAME, 'Slack'], [TYPE, INAPP]],
|
[VERSION, [NAME, 'Slack'], [TYPE, INAPP]], [
|
||||||
|
|
||||||
|
// TikTok Lite
|
||||||
|
/ultralite app_version\/([\w\.]+)/i],
|
||||||
|
[VERSION, [NAME, 'TikTok Lite'], [TYPE, INAPP]], [
|
||||||
|
|
||||||
|
// VS Code
|
||||||
|
/\) code\/([\d\.]+).+electron\//i],
|
||||||
|
[VERSION, [NAME, 'VS Code'], [TYPE, INAPP]], [
|
||||||
|
|
||||||
// Yahoo! Japan
|
// Yahoo! Japan
|
||||||
[/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],
|
/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i],
|
||||||
[VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]
|
[VERSION, [NAME, 'Yahoo! Japan'], [TYPE, INAPP]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
@@ -332,8 +395,10 @@ const Libraries = Object.freeze({
|
|||||||
browser : [
|
browser : [
|
||||||
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
|
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
|
||||||
[
|
[
|
||||||
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:urllib|requests)|scrapy)\/([\w\.]+)/i,
|
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
|
||||||
/(jsdom|(?<=\()java)\/([\w\.]+)/i
|
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
|
||||||
|
/(nutch)-([\w\.-]+)(\(|$)/i,
|
||||||
|
/\((java)\/([\w\.]+)/i
|
||||||
], [NAME, VERSION, [TYPE, LIBRARY]]
|
], [NAME, VERSION, [TYPE, LIBRARY]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
@@ -368,8 +433,8 @@ const Vehicles = Object.freeze({
|
|||||||
const Bots = Object.freeze({
|
const Bots = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
...CLIs.browser,
|
...CLIs.browser,
|
||||||
...Crawlers.browser,
|
|
||||||
...Fetchers.browser,
|
...Fetchers.browser,
|
||||||
|
...Crawlers.browser,
|
||||||
...Libraries.browser
|
...Libraries.browser
|
||||||
],
|
],
|
||||||
os : [
|
os : [
|
||||||
|
|||||||
55
src/helpers/ua-parser-helpers.d.ts
vendored
55
src/helpers/ua-parser-helpers.d.ts
vendored
@@ -1,27 +1,40 @@
|
|||||||
// Type definitions for Helpers submodule of UAParser.js v2.0.3
|
// Type definitions for Helpers submodule of UAParser.js v2.0.5
|
||||||
// Project: https://github.com/faisalman/ua-parser-js
|
// Project: https://github.com/faisalman/ua-parser-js
|
||||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||||
|
|
||||||
import type { IResult } from "../main/ua-parser";
|
import type { IResult } from "../main/ua-parser";
|
||||||
|
|
||||||
declare function getDeviceVendor(model: string): string | undefined;
|
export function isFrozenUA(ua: string): boolean;
|
||||||
declare function isAppleSilicon(resultOrUA: IResult | string): boolean;
|
|
||||||
declare function isAIBot(resultOrUA: IResult | string): boolean;
|
|
||||||
declare function isBot(resultOrUA: IResult | string): boolean;
|
|
||||||
declare function isChromeFamily(resultOrUA: IResult | string): boolean;
|
|
||||||
declare function isElectron(): boolean;
|
|
||||||
declare function isFromEU(): boolean;
|
|
||||||
declare function isFrozenUA(ua: string): boolean;
|
|
||||||
declare function isStandalonePWA(): boolean;
|
|
||||||
|
|
||||||
export {
|
/**
|
||||||
getDeviceVendor,
|
* @deprecated Moved to `device-detection` submodule
|
||||||
isAppleSilicon,
|
*/
|
||||||
isAIBot,
|
export function getDeviceVendor(model: string): string | undefined;
|
||||||
isBot,
|
/**
|
||||||
isChromeFamily,
|
* @deprecated Moved to `device-detection` submodule
|
||||||
isElectron,
|
*/
|
||||||
isFromEU,
|
export function isAppleSilicon(resultOrUA: IResult | string): boolean;
|
||||||
isFrozenUA,
|
/**
|
||||||
isStandalonePWA
|
* @deprecated Moved to `bot-detection` submodule
|
||||||
}
|
*/
|
||||||
|
export function isAIBot(resultOrUA: IResult | string): boolean;
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `bot-detection` submodule
|
||||||
|
*/
|
||||||
|
export function isBot(resultOrUA: IResult | string): boolean;
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
|
export function isChromeFamily(resultOrUA: IResult | string): boolean;
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
|
export function isElectron(): boolean;
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
|
export function isFromEU(): boolean;
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
|
export function isStandalonePWA(): boolean;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Helpers for UAParser.js v2.0.3
|
/* Helpers for UAParser.js v2.0.6
|
||||||
https://github.com/faisalman/ua-parser-js
|
https://github.com/faisalman/ua-parser-js
|
||||||
Author: Faisal Salman <f@faisalman.com>
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
AGPLv3 License */
|
AGPLv3 License */
|
||||||
@@ -8,125 +8,54 @@
|
|||||||
/*jshint esversion: 6 */
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
const { UAParser } = require('../main/ua-parser');
|
const { UAParser } = require('../main/ua-parser');
|
||||||
const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
|
const { EngineName } = require('../enums/ua-parser-enums');
|
||||||
const { Bots } = require('../extensions/ua-parser-extensions');
|
const { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } = require('../device-detection/device-detection');
|
||||||
const { isFromEU } = require('detect-europe-js');
|
const { isBot: _isBot, isAICrawler } = require('../bot-detection/bot-detection');
|
||||||
|
const { isStandalonePWA: _isStandalonePWA } = require('../browser-detection/browser-detection');
|
||||||
|
const { isFromEU: _isFromEU } = require('../browser-detection/browser-detection');
|
||||||
const { isFrozenUA } = require('ua-is-frozen');
|
const { isFrozenUA } = require('ua-is-frozen');
|
||||||
const { isStandalonePWA } = require('is-standalone-pwa');
|
|
||||||
|
|
||||||
const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
|
/**
|
||||||
|
* @deprecated Moved to `device-detection` submodule
|
||||||
|
*/
|
||||||
|
const getDeviceVendor = _getDeviceVendor;
|
||||||
|
|
||||||
const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
|
/**
|
||||||
|
* @deprecated Moved to `device-detection` submodule
|
||||||
|
*/
|
||||||
|
const isAppleSilicon = _isAppleSilicon;
|
||||||
|
|
||||||
const isAppleSilicon = (resultOrUA) => {
|
/**
|
||||||
const res = toResult(resultOrUA);
|
* @deprecated Moved to `bot-detection` submodule
|
||||||
if (res.os.is(OS.MACOS)) {
|
*/
|
||||||
if (res.cpu.is(CPU.ARM)) {
|
const isAIBot = isAICrawler;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
|
|
||||||
try {
|
|
||||||
const canvas = document.createElement('canvas');
|
|
||||||
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
|
||||||
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
|
||||||
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
|
||||||
if (renderer.match(/apple m\d/i)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const isAIBot = (resultOrUA) => [
|
/**
|
||||||
|
* @deprecated Moved to `bot-detection` submodule
|
||||||
|
*/
|
||||||
|
const isBot = _isBot;
|
||||||
|
|
||||||
// AI2
|
/**
|
||||||
'ai2bot',
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
// Amazon
|
const isChromeFamily = val => !!((typeof val === 'string' ? new UAParser(val).getEngine() : val.engine)?.is(EngineName.BLINK));
|
||||||
'amazonbot',
|
|
||||||
|
|
||||||
// Anthropic
|
|
||||||
'anthropic-ai',
|
|
||||||
'claude-web',
|
|
||||||
'claudebot',
|
|
||||||
|
|
||||||
// Apple
|
|
||||||
'applebot',
|
|
||||||
'applebot-extended',
|
|
||||||
|
|
||||||
// ByteDance
|
|
||||||
'bytespider',
|
|
||||||
|
|
||||||
// Common Crawl
|
|
||||||
'ccbot',
|
|
||||||
|
|
||||||
// DataForSeo
|
|
||||||
'dataforseobot',
|
|
||||||
|
|
||||||
// Diffbot
|
|
||||||
'diffbot',
|
|
||||||
|
|
||||||
// Google
|
|
||||||
'googleother',
|
|
||||||
'googleother-image',
|
|
||||||
'googleother-video',
|
|
||||||
'google-extended',
|
|
||||||
|
|
||||||
// Hive AI
|
|
||||||
'imagesiftbot',
|
|
||||||
|
|
||||||
// Huawei
|
|
||||||
'petalbot',
|
|
||||||
|
|
||||||
// Meta
|
|
||||||
'facebookbot',
|
|
||||||
'meta-externalagent',
|
|
||||||
|
|
||||||
// OpenAI
|
|
||||||
'gptbot',
|
|
||||||
'oai-searchbot',
|
|
||||||
|
|
||||||
// Perplexity
|
|
||||||
'perplexitybot',
|
|
||||||
|
|
||||||
// Semrush
|
|
||||||
'semrushbot-ocob',
|
|
||||||
|
|
||||||
// Timpi
|
|
||||||
'timpibot',
|
|
||||||
|
|
||||||
// Velen.io
|
|
||||||
'velenpublicwebcrawler',
|
|
||||||
|
|
||||||
// Webz.io
|
|
||||||
'omgili',
|
|
||||||
'omgilibot',
|
|
||||||
'webzio-extended',
|
|
||||||
|
|
||||||
// You.com
|
|
||||||
'youbot',
|
|
||||||
|
|
||||||
// Zyte
|
|
||||||
'scrapy'
|
|
||||||
|
|
||||||
].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase());
|
|
||||||
|
|
||||||
const isBot = (resultOrUA) => [
|
|
||||||
'cli',
|
|
||||||
'crawler',
|
|
||||||
'fetcher',
|
|
||||||
'library'
|
|
||||||
].includes(toResult(resultOrUA, Bots).browser.type);
|
|
||||||
|
|
||||||
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK);
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
||||||
/ electron\//i.test(navigator?.userAgent)); // browser
|
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
|
const isFromEU = _isFromEU;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated Moved to `browser-detection` submodule
|
||||||
|
*/
|
||||||
|
const isStandalonePWA = _isStandalonePWA;
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getDeviceVendor,
|
getDeviceVendor,
|
||||||
isAppleSilicon,
|
isAppleSilicon,
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
// Source: /src/helpers/ua-parser-helpers.js
|
// Source: /src/helpers/ua-parser-helpers.js
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Helpers for UAParser.js v2.0.3
|
/* Helpers for UAParser.js v2.0.6
|
||||||
https://github.com/faisalman/ua-parser-js
|
https://github.com/faisalman/ua-parser-js
|
||||||
Author: Faisal Salman <f@faisalman.com>
|
Author: Faisal Salman <f@faisalman.com>
|
||||||
AGPLv3 License */
|
AGPLv3 License */
|
||||||
@@ -12,121 +12,34 @@
|
|||||||
/*jshint esversion: 6 */
|
/*jshint esversion: 6 */
|
||||||
|
|
||||||
import { UAParser } from '../main/ua-parser.mjs';
|
import { UAParser } from '../main/ua-parser.mjs';
|
||||||
import { CPU, OS, Engine } from '../enums/ua-parser-enums.mjs';
|
import { EngineName } from '../enums/ua-parser-enums.mjs';
|
||||||
import { Bots } from '../extensions/ua-parser-extensions.mjs';
|
import { getDeviceVendor: _getDeviceVendor, isAppleSilicon: _isAppleSilicon } from '../device-detection/device-detection.mjs';
|
||||||
|
import { isBot: _isBot, isAICrawler } from '../bot-detection/bot-detection.mjs';
|
||||||
import { isFromEU } from 'detect-europe-js';
|
import { isFromEU } from 'detect-europe-js';
|
||||||
import { isFrozenUA } from 'ua-is-frozen';
|
import { isFrozenUA } from 'ua-is-frozen';
|
||||||
import { isStandalonePWA } from 'is-standalone-pwa';
|
import { isStandalonePWA } from 'is-standalone-pwa';
|
||||||
|
|
||||||
const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
|
/**
|
||||||
|
* @deprecated Moved to `device-detection` submodule
|
||||||
|
*/
|
||||||
|
const getDeviceVendor = _getDeviceVendor;
|
||||||
|
|
||||||
const getDeviceVendor = (model) => UAParser(`Mozilla/5.0 (Linux; Android 10; ${model}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36`).device.vendor;
|
/**
|
||||||
|
* @deprecated Moved to `device-detection` submodule
|
||||||
|
*/
|
||||||
|
const isAppleSilicon = _isAppleSilicon;
|
||||||
|
|
||||||
const isAppleSilicon = (resultOrUA) => {
|
/**
|
||||||
const res = toResult(resultOrUA);
|
* @deprecated Moved to `bot-detection` submodule
|
||||||
if (res.os.is(OS.MACOS)) {
|
*/
|
||||||
if (res.cpu.is(CPU.ARM)) {
|
const isAIBot = isAICrawler;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
|
|
||||||
try {
|
|
||||||
const canvas = document.createElement('canvas');
|
|
||||||
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
|
||||||
const debug = webgl.getExtension('WEBGL_debug_renderer_info');
|
|
||||||
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
|
||||||
if (renderer.match(/apple m\d/i)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const isAIBot = (resultOrUA) => [
|
/**
|
||||||
|
* @deprecated Moved to `bot-detection` submodule
|
||||||
|
*/
|
||||||
|
const isBot = _isBot;
|
||||||
|
|
||||||
// AI2
|
const isChromeFamily = val => !!((typeof val === 'string' ? new UAParser(val).getEngine() : val.engine)?.is(EngineName.BLINK));
|
||||||
'ai2bot',
|
|
||||||
|
|
||||||
// Amazon
|
|
||||||
'amazonbot',
|
|
||||||
|
|
||||||
// Anthropic
|
|
||||||
'anthropic-ai',
|
|
||||||
'claude-web',
|
|
||||||
'claudebot',
|
|
||||||
|
|
||||||
// Apple
|
|
||||||
'applebot',
|
|
||||||
'applebot-extended',
|
|
||||||
|
|
||||||
// ByteDance
|
|
||||||
'bytespider',
|
|
||||||
|
|
||||||
// Common Crawl
|
|
||||||
'ccbot',
|
|
||||||
|
|
||||||
// DataForSeo
|
|
||||||
'dataforseobot',
|
|
||||||
|
|
||||||
// Diffbot
|
|
||||||
'diffbot',
|
|
||||||
|
|
||||||
// Google
|
|
||||||
'googleother',
|
|
||||||
'googleother-image',
|
|
||||||
'googleother-video',
|
|
||||||
'google-extended',
|
|
||||||
|
|
||||||
// Hive AI
|
|
||||||
'imagesiftbot',
|
|
||||||
|
|
||||||
// Huawei
|
|
||||||
'petalbot',
|
|
||||||
|
|
||||||
// Meta
|
|
||||||
'facebookbot',
|
|
||||||
'meta-externalagent',
|
|
||||||
|
|
||||||
// OpenAI
|
|
||||||
'gptbot',
|
|
||||||
'oai-searchbot',
|
|
||||||
|
|
||||||
// Perplexity
|
|
||||||
'perplexitybot',
|
|
||||||
|
|
||||||
// Semrush
|
|
||||||
'semrushbot-ocob',
|
|
||||||
|
|
||||||
// Timpi
|
|
||||||
'timpibot',
|
|
||||||
|
|
||||||
// Velen.io
|
|
||||||
'velenpublicwebcrawler',
|
|
||||||
|
|
||||||
// Webz.io
|
|
||||||
'omgili',
|
|
||||||
'omgilibot',
|
|
||||||
'webzio-extended',
|
|
||||||
|
|
||||||
// You.com
|
|
||||||
'youbot',
|
|
||||||
|
|
||||||
// Zyte
|
|
||||||
'scrapy'
|
|
||||||
|
|
||||||
].includes(String(toResult(resultOrUA, Bots).browser.name).toLowerCase());
|
|
||||||
|
|
||||||
const isBot = (resultOrUA) => [
|
|
||||||
'cli',
|
|
||||||
'crawler',
|
|
||||||
'fetcher',
|
|
||||||
'library'
|
|
||||||
].includes(toResult(resultOrUA, Bots).browser.type);
|
|
||||||
|
|
||||||
const isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(Engine.BLINK);
|
|
||||||
|
|
||||||
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
|
||||||
/ electron\//i.test(navigator?.userAgent)); // browser
|
/ electron\//i.test(navigator?.userAgent)); // browser
|
||||||
|
|||||||
15
src/main/ua-parser.d.ts
vendored
15
src/main/ua-parser.d.ts
vendored
@@ -1,9 +1,8 @@
|
|||||||
// Type definitions for UAParser.js v2.0.3
|
// Type definitions for UAParser.js v2.0.6
|
||||||
// Project: https://github.com/faisalman/ua-parser-js
|
// Project: https://github.com/faisalman/ua-parser-js
|
||||||
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
// Definitions by: Faisal Salman <https://github.com/faisalman>
|
||||||
|
|
||||||
import type { IncomingHttpHeaders } from 'http';
|
import { BrowserType, CPUArch, DeviceType, EngineName } from "../enums/ua-parser-enums";
|
||||||
import type { Headers as FetchAPIHeaders } from 'node-fetch';
|
|
||||||
|
|
||||||
declare namespace UAParser {
|
declare namespace UAParser {
|
||||||
|
|
||||||
@@ -18,21 +17,21 @@ declare namespace UAParser {
|
|||||||
name?: string;
|
name?: string;
|
||||||
version?: string;
|
version?: string;
|
||||||
major?: string;
|
major?: string;
|
||||||
type?: 'crawler' | 'cli' | 'email' | 'fetcher' | 'inapp' | 'mediaplayer' | 'library';
|
type?: typeof BrowserType[keyof typeof BrowserType];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ICPU extends IData<ICPU> {
|
interface ICPU extends IData<ICPU> {
|
||||||
architecture?: 'ia32' | 'ia64' | 'amd64' | 'arm' | 'arm64' | 'armhf' | 'avr' | 'avr32' | 'irix' | 'irix64' | 'mips' | 'mips64' | '68k' | 'pa-risc' | 'ppc' | 'sparc' | 'sparc64';
|
architecture?: typeof CPUArch[keyof typeof CPUArch];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IDevice extends IData<IDevice> {
|
interface IDevice extends IData<IDevice> {
|
||||||
type?: 'mobile' | 'tablet' | 'console' | 'smarttv' | 'wearable' | 'xr' | 'embedded';
|
type?: typeof DeviceType[keyof typeof DeviceType];
|
||||||
vendor?: string;
|
vendor?: string;
|
||||||
model?: string;
|
model?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IEngine extends IData<IEngine> {
|
interface IEngine extends IData<IEngine> {
|
||||||
name?: 'Amaya' | 'ArkWeb' | 'Blink' | 'EdgeHTML' | 'Flow' | 'Gecko' | 'Goanna' | 'iCab' | 'KHTML' | 'LibWeb' | 'Links' | 'Lynx' | 'NetFront' | 'NetSurf' | 'Presto' | 'Servo' | 'Tasman' | 'Trident' | 'w3m' | 'WebKit';
|
name?: typeof EngineName[keyof typeof EngineName];
|
||||||
version?: string;
|
version?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +52,7 @@ declare namespace UAParser {
|
|||||||
type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[];
|
type RegexMap = ((RegExp | string | (string | RegExp | Function)[])[])[];
|
||||||
type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os';
|
type UAParserProps = 'browser' | 'cpu' | 'device' | 'engine' | 'os';
|
||||||
type UAParserExt = Partial<Record<UAParserProps, RegexMap>> | Partial<Record<UAParserProps, RegexMap>>[];
|
type UAParserExt = Partial<Record<UAParserProps, RegexMap>> | Partial<Record<UAParserProps, RegexMap>>[];
|
||||||
type UAParserHeaders = Record<string, string> | IncomingHttpHeaders | FetchAPIHeaders;
|
export type UAParserHeaders = Record<string, string | string[] | undefined> | Headers;
|
||||||
|
|
||||||
export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: UAParserHeaders): IResult;
|
export function UAParser(uastring?: string, extensions?: UAParserExt, headers?: UAParserHeaders): IResult;
|
||||||
export function UAParser(uastring?: string, headers?: UAParserHeaders): IResult;
|
export function UAParser(uastring?: string, headers?: UAParserHeaders): IResult;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
242
test/data/ua-ch/headers.js
Normal file
242
test/data/ua-ch/headers.js
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
const UACHTests = [
|
||||||
|
{
|
||||||
|
desc: 'Avast Secure Browser',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Avast Secure Browser";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Avast Secure Browser',
|
||||||
|
version : '131',
|
||||||
|
major : '131',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Brave',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Brave',
|
||||||
|
version : '132',
|
||||||
|
major : '132',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Chrome',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Chrome',
|
||||||
|
version : '111',
|
||||||
|
major : '111',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Chrome Headless',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Chromium";v="124", "HeadlessChrome";v="124", "Not-A.Brand";v="99"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Chrome Headless',
|
||||||
|
version : '124',
|
||||||
|
major : '124',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Chrome WebView',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Android WebView";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Chrome WebView',
|
||||||
|
version : '123',
|
||||||
|
major : '123',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'DuckDuckGo',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"DuckDuckGo";v="131", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||||
|
},
|
||||||
|
expect : {
|
||||||
|
browser : {
|
||||||
|
name : 'DuckDuckGo',
|
||||||
|
version : '131',
|
||||||
|
major : '131',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Edge',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Edge',
|
||||||
|
version : '120',
|
||||||
|
major : '120',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Edge WebView2',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103", "Microsoft Edge WebView2";v="104"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Edge WebView2',
|
||||||
|
version : '104',
|
||||||
|
major : '104',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Huawei Browser',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "HuaweiBrowser";v="114"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Huawei Browser',
|
||||||
|
version : '114',
|
||||||
|
major : '114',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'MIUI Browser',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Miui Browser";v="123", "Not:A-Brand";v="8", "Chromium";v="123"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'MIUI Browser',
|
||||||
|
version : '123',
|
||||||
|
major : '123',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Oculus Browser',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Chromium";v="130", "Oculus Browser";v="36", "Not?A_Brand";v="99"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Oculus Browser',
|
||||||
|
version : '36',
|
||||||
|
major : '36',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Opera',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Opera";v="116", "Chromium";v="131", "Not_A Brand";v="24"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Opera',
|
||||||
|
version : '116',
|
||||||
|
major : '116',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Opera GX',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Opera GX";v="114"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Opera GX',
|
||||||
|
version : '114',
|
||||||
|
major : '114',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Opera Mobi',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"OperaMobile";v="86", ";Not A Brand";v="99", "Opera";v="115", "Chromium";v="130"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Opera Mobi',
|
||||||
|
version : '86',
|
||||||
|
major : '86',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Opera Mobi',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Chromium";v="132", "OperaMobile";v="87", "Opera";v="117", " Not A;Brand";v="99"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Opera Mobi',
|
||||||
|
version : '87',
|
||||||
|
major : '87',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Samsung Internet',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Chromium";v="125", "Not.A/Brand";v="24", "Samsung Internet";v="27.0"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Samsung Internet',
|
||||||
|
version : '27.0',
|
||||||
|
major : '27',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
desc: 'Yandex',
|
||||||
|
headers : {
|
||||||
|
'sec-ch-ua': '"Chromium";v="130", "YaBrowser";v="24.12", "Not?A_Brand";v="99", "Yowser";v="2.5"'
|
||||||
|
},
|
||||||
|
expect: {
|
||||||
|
browser : {
|
||||||
|
name : 'Yandex',
|
||||||
|
version : '24.12',
|
||||||
|
major : '24',
|
||||||
|
type : undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
module.exports = UACHTests;
|
||||||
@@ -171,6 +171,16 @@
|
|||||||
"major" : "0"
|
"major" : "0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Atlas",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Atlas/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Atlas",
|
||||||
|
"version" : "1.0",
|
||||||
|
"major" : "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Avant",
|
"desc" : "Avant",
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB5; Avant Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
|
"ua" : "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB5; Avant Browser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
|
||||||
@@ -271,6 +281,26 @@
|
|||||||
"major" : "11"
|
"major" : "11"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Bing",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/605.1.15 BingSapphire/31.8.430522001",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Bing",
|
||||||
|
"version" : "31.8.430522001",
|
||||||
|
"major" : "31"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Bing",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 9; MIX 2 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4893.0 Mobile Safari/537.36 BingWeb/6.9.12",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Bing",
|
||||||
|
"version" : "6.9.12",
|
||||||
|
"major" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Blazer",
|
"desc" : "Blazer",
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
|
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
|
||||||
@@ -611,6 +641,16 @@
|
|||||||
"major" : "55"
|
"major" : "55"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "PaleMoon",
|
||||||
|
"ua" : "(Windows NT 6.2; WOW64) KHTML/4.11 Gecko/20130308 Firefox/23.0 (PaleMoon/20.3)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "PaleMoon",
|
||||||
|
"version" : "20.3",
|
||||||
|
"major" : "20"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "PaleMoon",
|
"desc" : "PaleMoon",
|
||||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:52.9) Gecko/20100101 Goanna/3.4 Firefox/52.9 PaleMoon/27.6.1",
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:52.9) Gecko/20100101 Goanna/3.4 Firefox/52.9 PaleMoon/27.6.1",
|
||||||
@@ -1338,6 +1378,16 @@
|
|||||||
"major" : "5"
|
"major" : "5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mozilla",
|
||||||
|
"ua" : "Mozilla/2.02 [fr] (WinNT; I)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mozilla",
|
||||||
|
"version" : "2.02",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "MSIE",
|
"desc" : "MSIE",
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC)",
|
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0b1; Mac_PowerPC)",
|
||||||
@@ -1688,6 +1738,36 @@
|
|||||||
"major" : "2"
|
"major" : "2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qwant",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) QwantMobile/6.7.6 Mobile/15E148 Safari/605.1.15",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Qwant",
|
||||||
|
"version" : "6.7.6",
|
||||||
|
"major" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qwant",
|
||||||
|
"ua" : "QwantMobile/2.0 (Android 8.0.0; Mobile; rv:59.0) Gecko/59.0 Firefox/59.0 QwantBrowser/59.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Qwant",
|
||||||
|
"version" : "59.0",
|
||||||
|
"major" : "59"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qwant",
|
||||||
|
"ua" : "QwantMobile/2.0 (iPad; CPU OS 15_8_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) QwantiOS/2.7.0b1 Mobile/15E148 Safari/605.1.15",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Qwant",
|
||||||
|
"version" : "2.0",
|
||||||
|
"major" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Rekonq 2",
|
"desc" : "Rekonq 2",
|
||||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) rekonq/2.2.1 Safari/537.21",
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) rekonq/2.2.1 Safari/537.21",
|
||||||
@@ -2229,6 +2309,26 @@
|
|||||||
"major" : "74"
|
"major" : "74"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Edge WebView",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows IoT 10.0; Android 6.0.1; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Mobile Safari/537.36 Edge/18.17763",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Edge WebView",
|
||||||
|
"version" : "18.17763",
|
||||||
|
"major" : "18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Edge WebView2",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 11; SM-G991B Build/RP1A.200720.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.120 Mobile Safari/537.36 EdgW/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Edge WebView2",
|
||||||
|
"version" : "91.0.4472.120",
|
||||||
|
"major" : "91"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Iridium",
|
"desc" : "Iridium",
|
||||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Iridium/43.8 Safari/537.36 Chrome/43.0.2357.132",
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Iridium/43.8 Safari/537.36 Chrome/43.0.2357.132",
|
||||||
@@ -2675,5 +2775,27 @@
|
|||||||
"major" : "10",
|
"major" : "10",
|
||||||
"type" : "inapp"
|
"type" : "inapp"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Zalo on iOS",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Zalo/20.05.01 Mobile/15E148",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Zalo",
|
||||||
|
"version" : "20.05.01",
|
||||||
|
"major" : "20",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Zalo on Android",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 10; Vsmart Live Build/QKQ1.190918.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 Mobile Safari/537.36 Zalo/20.04.02.r1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Zalo",
|
||||||
|
"version" : "20.04.02.r1",
|
||||||
|
"major" : "20",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -87,6 +87,22 @@
|
|||||||
"architecture" : "amd64"
|
"architecture" : "amd64"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Alpha",
|
||||||
|
"ua" : "Mozilla/3.01 (WinNT; I) [AXP]",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"architecture" : "alpha"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Alpha",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; OpenBSD alpha; rv:78.0) Gecko/20100101 Firefox/78.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"architecture" : "alpha"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "ARM",
|
"desc" : "ARM",
|
||||||
"ua" : "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
|
"ua" : "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
|
||||||
@@ -273,7 +289,15 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "68k",
|
"desc" : "68k",
|
||||||
"ua" : "'Mozilla/1.1 (Macintosh; U; 68K)'",
|
"ua" : "Mozilla/1.1 (Macintosh; U; 68K)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"architecture" : "68k"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MC680x0",
|
||||||
|
"ua" : "AmigaVoyager/3.2 (AmigaOS/MC680x0)",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"architecture" : "68k"
|
"architecture" : "68k"
|
||||||
|
|||||||
@@ -122,51 +122,6 @@
|
|||||||
"type": "undefined"
|
"type": "undefined"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"desc": "OnePlus 7T Pro",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.57 Mobile Safari/537.36 EdgA/110.0.1587.66",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "undefined",
|
|
||||||
"model": "HD1913",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Philips SmartTV",
|
|
||||||
"ua": "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Philips",
|
|
||||||
"model": "",
|
|
||||||
"type": "smarttv"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Philips 32PFL6606K/02 SmartTV (2011)",
|
|
||||||
"ua": "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Philips",
|
|
||||||
"model": "",
|
|
||||||
"type": "smarttv"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Philips 32PFL6606K/02 SmartTV (2013)",
|
|
||||||
"ua": "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Philips",
|
|
||||||
"model": "",
|
|
||||||
"type": "smarttv"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Philips 32PHS5301/12 SmartTV (2016)",
|
|
||||||
"ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36 OPR/29.0.1803.0 OMI/4.5.23.37.MOT2.13 HbbTV/1.2.1 (;Philips;32PHS5301/12;;_TV_MT5800;) Firmware/TPM161E_012.002.045.001 en",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Philips",
|
|
||||||
"model": "32PHS5301/12",
|
|
||||||
"type": "smarttv"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc": "Samsung SmartTV",
|
"desc": "Samsung SmartTV",
|
||||||
"ua": "Mozilla/5.0 (SMART-TV; X11; Linux armv7l) AppleWebkit/537.42 (KHTML, like Gecko) Safari/537.42",
|
"ua": "Mozilla/5.0 (SMART-TV; X11; Linux armv7l) AppleWebkit/537.42 (KHTML, like Gecko) Safari/537.42",
|
||||||
@@ -281,6 +236,69 @@
|
|||||||
"type": "smarttv"
|
"type": "smarttv"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Unknown TV",
|
||||||
|
"ua": "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Large Screen Safari/533.4 GoogleTV/ 162671",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "undefined",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Unknown TV",
|
||||||
|
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.41 (KHTML, like Gecko) Large Screen WebAppManager Safari/537.41",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "undefined",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Unknown VR Device using Firefox Reality",
|
||||||
|
"ua": "Mozilla/5.0 (Android 10; Mobile VR; rv:123.0) Gecko/123.0 Firefox/123.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "undefined",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "xr"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Unknown VR Device using Wolvic",
|
||||||
|
"ua": "Mozilla/5.0 (Android 14; Mobile VR; rv:128.0) Gecko/128.0 Firefox/128.0 Wolvic/1.8",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "undefined",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "xr"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Smart TV",
|
||||||
|
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 HbbTV/1.6.1 ( DRM; LGE/ATMACA/GRAETZ; GR32S1470; WEBOS22 04.41.53; W22_K8AP; DTV_C22L;) LaTivu_1.0.1_2022",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "GRAETZ",
|
||||||
|
"model": "GR32S1470",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Smart TV",
|
||||||
|
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 HbbTV/1.5.1 (+DRM; LGE/DUALSHINE/SKYTECH; ST-5090; WEBOS5.0 04.50.63; W50_K6LP; DTV_C20P;)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "SKYTECH",
|
||||||
|
"model": "ST-5090",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Smart TV",
|
||||||
|
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 HbbTV/1.6.1 (+DRM; LGE/SILICONPLAYER/Hyundai; 50HYN3205; WEBOS22 04.42.26; W22_K8LP; DTV_C22P;)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Hyundai",
|
||||||
|
"model": "50HYN3205",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "PDA with Windows CE",
|
"desc": "PDA with Windows CE",
|
||||||
"ua": "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
|
"ua": "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
|
||||||
|
|||||||
11
test/data/ua/device/anbernic.json
Normal file
11
test/data/ua/device/anbernic.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Anbernic",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; RGCUBE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Anbernic",
|
||||||
|
"model": "RGCUBE",
|
||||||
|
"type": "console"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -44,6 +44,105 @@
|
|||||||
"type": "tablet"
|
"type": "tablet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using Chrome",
|
||||||
|
"ua": "Mozilla/5.0 (iPad13,10; CPU OS 16_6_2 like Mac OS X) AppleWebKit/602.3 (KHTML, like Gecko) CriOS/97.0.0.5927.72 Mobile/11S296 Safari/602.3",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using DuckDuckGo",
|
||||||
|
"ua": "Mozilla/5.0 (iPad; iPad13,6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) DuckDuckGo/130.0.0.0 Mobile/15E148 Safari/604.1",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using Discord",
|
||||||
|
"ua": "Discord/52.0 (iPad; iOS 14.4; Scale/2.00)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using Firefox",
|
||||||
|
"ua": "Mozilla/5.0 (iPad; iPad14,2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Firefox/120.0 Mobile/15E148 Safari/604.1",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using iTunes",
|
||||||
|
"ua": "itunesstored/1.0 iOS/15.6.1 model/iPad13,8 hwp/t8103 build/19G82 (5; dt:238)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using MS OneNote",
|
||||||
|
"ua": "Microsoft Office OneNote/16.81/240108 (iOS/16.5.1; Tablet; AppStore; Apple/iPad8,3)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using MS Word",
|
||||||
|
"ua": "Microsoft Office Word/2.44.1211 (iOS/13.7; Tablet; es-MX; AppStore; Apple/iPad11,3)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using Quora",
|
||||||
|
"ua": "Quora 8.4.30 rv:3230 env:prod (iPad11,3; iPadOS 17.7; en_GB) AppleWebKit",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using TuneIn Radio",
|
||||||
|
"ua": "TuneIn Radio/27.1.0; iPad6,3; iPadOS/16.6",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using TuneIn Radio Pro",
|
||||||
|
"ua": "TuneIn Radio Pro/21.4.1; iPad8,9; iOS/15.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPad using YouTube",
|
||||||
|
"ua": "com.google.ios.youtube/20.31.6 (iPad13,5; U; CPU iPadOS 18_6 like Mac OS X; en_US)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPad",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "iPod",
|
"desc": "iPod",
|
||||||
"ua": "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
|
"ua": "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
|
||||||
@@ -62,6 +161,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "iPhone using Spotify",
|
||||||
|
"ua": "Spotify/8.7.70 iOS/16.0 (iPhone15,3)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Apple",
|
||||||
|
"model": "iPhone15,3",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "iPhone SE",
|
"desc": "iPhone SE",
|
||||||
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",
|
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPhone8,4;FBMD/iPhone;FBSN/iOS;FBSV/13.3.1;FBSS/2;FBID/phone;FBLC/en_US;FBOP/5;FBCR/]",
|
||||||
|
|||||||
@@ -1,7 +1,25 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc": "BlackBerry 9650",
|
||||||
|
"ua": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9650; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.524 Mobile Safari/534.8+",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "BlackBerry",
|
||||||
|
"model": "9650",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "BlackBerry 9780",
|
||||||
|
"ua": "Mozilla/5.0 (BlackBerry; U; BlackBerry 9780; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "BlackBerry",
|
||||||
|
"model": "9780",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "BlackBerry Priv",
|
"desc": "BlackBerry Priv",
|
||||||
"ua": "User-Agent: Mozilla/5.0 (Linux; Android 5.1.1; STV100-1 Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; STV100-1 Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "BlackBerry",
|
"vendor": "BlackBerry",
|
||||||
"model": "STV100-1",
|
"model": "STV100-1",
|
||||||
@@ -28,7 +46,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc": "BlackBerry Key2 LE",
|
"desc": "BlackBerry Key2 LE",
|
||||||
"ua": "User-Agent: Mozilla/5.0 (Linux; Android 8.1.0; BBE100-1 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; BBE100-1 Build/OPM1.171019.026) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497 Mobile Safari/537.36",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "BlackBerry",
|
"vendor": "BlackBerry",
|
||||||
"model": "BBE100-1",
|
"model": "BBE100-1",
|
||||||
|
|||||||
@@ -71,51 +71,6 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"desc": "Google Pixel Tablet",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel Tablet Build/AP2A.240905.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Google",
|
|
||||||
"model": "Pixel Tablet",
|
|
||||||
"type": "tablet"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Google Pixel Watch",
|
|
||||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Google Pixel Watch Build/TWD4.231005.002)",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Google",
|
|
||||||
"model": "Pixel Watch",
|
|
||||||
"type": "wearable"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Google Pixel Watch 2",
|
|
||||||
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Google Pixel Watch 2 Build/TWD9.240605.001.A1)",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Google",
|
|
||||||
"model": "Pixel Watch 2",
|
|
||||||
"type": "wearable"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Google Pixel XL",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 7.1; Pixel XL Build/NDE63X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Google",
|
|
||||||
"model": "Pixel XL",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Google Pixel XL",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Google",
|
|
||||||
"model": "Pixel XL",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 2",
|
"desc": "Google Pixel 2",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
||||||
@@ -125,6 +80,24 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 2",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 2) AppleWebKit/537.36 (KHTML, like Gecko) Edg/57.0.986.6",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 2",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 2",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 7.1.2; G011A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.88 Safari/537.36 OPR/68.3.3557.64528",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G011A",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 2 XL",
|
"desc": "Google Pixel 2 XL",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; Pixel 2 XL Build/OPM1.171019.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Safari/537.36",
|
||||||
@@ -152,6 +125,24 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 3",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; G013A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G013A",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 3a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; G020E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G020E",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 3 XL",
|
"desc": "Google Pixel 3 XL",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel 3 XL Build/PD1A.180720.030) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36",
|
||||||
@@ -197,6 +188,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 4",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; G020M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G020M",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 4a",
|
"desc": "Google Pixel 4a",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.83 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.83 Mobile Safari/537.36",
|
||||||
@@ -206,6 +206,42 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 4a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; G025J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G025J",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 4a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; GA02099) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GA02099",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 4a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; G025N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G025N",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 4a (5G)",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 4a (5G) Build/UP1A.231105.001.B2; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 EdgA/124.0.2478.64",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 4a (5G)",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 4 XL",
|
"desc": "Google Pixel 4 XL",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; Pixel 4 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
|
||||||
@@ -215,6 +251,33 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 5",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; G5NZ6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G5NZ6",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 5",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; GD1YQ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GD1YQ",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 5",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; GTT9Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GTT9Q",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 5",
|
"desc": "Google Pixel 5",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.120 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.120 Mobile Safari/537.36",
|
||||||
@@ -224,6 +287,51 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 5a 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; G4S1M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G4S1M",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 5a 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; G1F8F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G1F8F",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 6",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; Pixel 6 Build/QP1A.190711.020) AppleWebKit/545.31 (KHTML, like Gecko) Firefox/109.0.2318.118 Mobile Safari/545.22",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 6",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 6 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; Pixel 6 Pro Build/AP4A.241205.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.163 Mobile Safari/537.36 Line/15.0.0/IAB",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 6 Pro",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 6 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; G8VOU) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G8VOU",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Google Pixel 7",
|
"desc": "Google Pixel 7",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||||
@@ -232,5 +340,275 @@
|
|||||||
"model": "Pixel 7",
|
"model": "Pixel 7",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 7 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; Pixel 7 Pro Build/AP4A.250205.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.121 Mobile Safari/537.36 musical_ly_2023808030 BytedanceWebview/d8a21c6",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 7 Pro",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 7 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; GP4BC) AppleWebKit/537.46 (KHTML, like Gecko) Chrome/118.0.5993.80 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GP4BC",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 7 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; GE2AE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.48 Mobile Safari/537.46",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GE2AE",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 7a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 7a Build/AP2A.240905.003; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 EdgA/124.0.2478.64",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 7a",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 8",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 8 Build/UPB2.230407.014) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.2.7822.95 Mobile Safari/537.36 Vivaldi/5.2.9076.131",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 8",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 8",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 8 Pro Build/UPB1.230309.017; Rooted) AppleWebKit/537.36 (KHTML, like Gecko) Puffin/10.9.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 8 Pro",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 8a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Google Pixel 8a) Chrome/121.0.6167 Mobile",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 8a",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 8a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GKV4X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GKV4X",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 8a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; G8HHN) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G8HHN",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 8a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; G576D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G576D",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 14; Pixel 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.119 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 9",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; G2YBB) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G2YBB",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GUR25) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GUR25",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GWVK6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GWVK6",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; G1B60) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "G1B60",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro Build/AD1A.240530.047; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.170 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/506.1.0.74.27;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 9 Pro",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GR83Y) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GR83Y",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GEC77) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GEC77",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro Fold",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro Fold) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 9 Pro Fold",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro Fold",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GC15S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GC15S",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro Fold",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; GGH2X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "GGH2X",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel 9 Pro XL",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 15; Pixel 9 Pro XL Build/AP4A.250105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.89 Mobile Safari/537.36 OPR/88.0.2254.75874",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel 9 Pro XL",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel Fold",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; Pixel Fold Build/AP4A.250105.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.97 Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.40.36;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel Fold",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel Tablet",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; Pixel Tablet Build/AP2A.240905.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel Tablet",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel Watch",
|
||||||
|
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Google Pixel Watch Build/TWD4.231005.002)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel Watch",
|
||||||
|
"type": "wearable"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel Watch 2",
|
||||||
|
"ua": "Dalvik/2.1.0 (Linux; U; Android 13; Google Pixel Watch 2 Build/TWD9.240605.001.A1)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel Watch 2",
|
||||||
|
"type": "wearable"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel XL",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 7.1; Pixel XL Build/NDE63X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.85 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel XL",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixel XL",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Pixel XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixel XL",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixelbook",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Google Pixelbook) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixelbook",
|
||||||
|
"type": "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Google Pixelbook Go",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Google Pixelbook Go) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 OPR/62.3.3146.57763",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Google",
|
||||||
|
"model": "Pixelbook Go",
|
||||||
|
"type": "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
20
test/data/ua/device/hisense.json
Normal file
20
test/data/ua/device/hisense.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Hisense E50 Lite",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; Hisense E50 Lite) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.126 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Hisense",
|
||||||
|
"model": "E50 Lite",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Hisense V40s",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; Hisense V40s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.125 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Hisense",
|
||||||
|
"model": "V40s",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -8,6 +8,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "HMD Fusion",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Fusion) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "HMD",
|
||||||
|
"model": "Fusion",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "HMD Pulse",
|
"desc": "HMD Pulse",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Pulse) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 14; HMD Pulse) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36",
|
||||||
@@ -34,5 +43,23 @@
|
|||||||
"model": "Pulse Pro",
|
"model": "Pulse Pro",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "HMD Skyline",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; arm_64; Android 14; HMD Skyline) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.1804 YaApp_Android/24.120.1 YaSearchBrowser/24.120.1 BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "HMD",
|
||||||
|
"model": "Skyline",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "HMD Vibe",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; N159V Build/UKQ1.231025.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/135.0.7049.111 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.47.36;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "HMD",
|
||||||
|
"model": "N159V",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -701,6 +701,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Huawei P10 Lite",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; WAS-L03T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5199.205 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Huawei",
|
||||||
|
"model": "WAS-L03T",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Huawei P20 Lite",
|
"desc": "Huawei P20 Lite",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; ANE-LX1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 8.0.0; ANE-LX1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.143 Mobile Safari/537.36",
|
||||||
@@ -728,6 +737,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Huawei P30",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; ELE-L04) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.109 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Huawei",
|
||||||
|
"model": "ELE-L04",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Huawei P30",
|
"desc": "Huawei P30",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; ELE-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; ELE-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.90 Mobile Safari/537.36",
|
||||||
@@ -782,6 +800,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Huawei Nova",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 7.0; HUAWEI CAN-L13) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5113.212 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Huawei",
|
||||||
|
"model": "CAN-L13",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Huawei Nova 5T",
|
"desc": "Huawei Nova 5T",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; YAL-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36",
|
||||||
@@ -899,6 +926,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Huawei Y7p",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; ART-L28; HMSCore 6.8.0.311) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4476.0 HuaweiBrowser/12.1.2.312 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Huawei",
|
||||||
|
"model": "ART-L28",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Huawei Y7p",
|
"desc": "Huawei Y7p",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; ART-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.92 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; ART-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.92 Mobile Safari/537.36",
|
||||||
|
|||||||
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc": "Infinix Hot 4",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 7.0; en-us; Infinix HOT 4 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36 PHX/17.9",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Infinix",
|
||||||
|
"model": "HOT 4",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Infinix Hot 4 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 6.0; Infinix_X556_LTE Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/390.0.0.27.105;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Infinix",
|
||||||
|
"model": "X556_LTE",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Infinix Hot 7 Pro",
|
"desc": "Infinix Hot 7 Pro",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; Infinix X625C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; Infinix X625C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||||
@@ -26,6 +44,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Infinix Note 3",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 6.0; Infinix_X601_LTE Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/81.0.4044.111 Mobile Safari/537.36 GSA/11.5.9.21.arm64",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Infinix",
|
||||||
|
"model": "X601_LTE",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Infinix Smart 5",
|
"desc": "Infinix Smart 5",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; Infinix X657C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; Infinix X657C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
|
||||||
|
|||||||
110
test/data/ua/device/lava.json
Normal file
110
test/data/ua/device/lava.json
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Lava Agni 2 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; LAVA LXX504 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.46 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/499.0.0.31.60;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LXX504",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Agni 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; LAVA LXX501 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.119 Mobile Safari/537.36[FBAN/EMA;FBLC/hi_IN;FBAV/396.0.0.9.115;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LXX501",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Blaze",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 12; en-US; LAVA Blaze Build/SP1A.210812.016) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.4.0.1306 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "Blaze",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Blaze 2",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; LAVA LZX409 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.97 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.47.36;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LZX409",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Blaze 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; LAVA LXX503) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LXX503",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Blaze Curve",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; LAVA LXX505 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.105 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/505.0.0.57.45;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LXX505",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Blaze Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; LAVA LZX404 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.50 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/503.0.0.69.76;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LZX404",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Iris 46",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; LAVA LH9950) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/21.0 Chrome/110.0.5481.154 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LH9950",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Iris 54",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 9; LAVA LH9931 Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 OPR/39.1.2254.136708",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LH9931",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava Storm 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; LAVA LXX508 Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/129.0.6668.100 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LXX508",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava V7 Prime",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; LAVA LE9940) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LE9940",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Lava V7s Prime",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 9; LAVA LE9940_W Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 OPR/43.2.2254.140294",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LAVA",
|
||||||
|
"model": "LE9940_W",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -143,6 +143,24 @@
|
|||||||
"type": "smarttv"
|
"type": "smarttv"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "LG Smart TV",
|
||||||
|
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chr0me/53.0.2785.34 Safari/537.36 LG Browser/8.00.00(LGE; 32LM627BPSB; 05.40.45; 1; DTV_W19R); webOS.TV-2019; LG NetCast.TV-2013 Compatible (LGE, 32LM627BPSB, wireless)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LG",
|
||||||
|
"model": "32LM627BPSB",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "LG Smart TV",
|
||||||
|
"ua": "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 HbbTV/1.3.1 ( DRM; LGE; OLED55B7V_Z; WEBOS3.5 06.10.60; W3_M16P; ) FVC/2.0 (LGE; WEBOS3.5 ;)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "LG",
|
||||||
|
"model": "OLED55B7V_Z",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "LG Android TV",
|
"desc": "LG Android TV",
|
||||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; LG Android TV Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
"ua": "Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; LG Android TV Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
|
||||||
|
|||||||
11
test/data/ua/device/logitech.json
Normal file
11
test/data/ua/device/logitech.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Logitech",
|
||||||
|
"ua": "Dalvik/2.1.0 (Linux; U; Android 11; GR0006 Build/SQ02K.00.0018)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Logitech",
|
||||||
|
"model": "GR0006",
|
||||||
|
"type": "console"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,28 +1,10 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"desc": "Motorola Moto X",
|
"desc": "Motorola Defy XT",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; XT1097 Build/KXE21.187-38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; XT555C Build/V1.67D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "Motorola",
|
"vendor": "Motorola",
|
||||||
"model": "XT1097",
|
"model": "XT555C",
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Motorola Moto Z3 Play",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; Moto Z3 Play) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Motorola",
|
|
||||||
"model": "Moto Z3 Play",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc": "Motorola Nexus 6",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "Motorola",
|
|
||||||
"model": "Nexus 6",
|
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -35,6 +17,42 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Edge 30 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; XT2201-1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2201-1",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Edge 30 Ultra",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; motorola edge 30 ultra Build/U1SQS34.52-21-1-13; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/130.0.6723.107 M",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "edge 30 ultra",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Edge 40",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; motorola edge 40 Build/U1TL34.115-16-1-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.104 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "edge 40",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Edge X30",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; XT2201-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.6668.59 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2201-2",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Motorola RAZR 2019",
|
"desc": "Motorola RAZR 2019",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; motorola razr) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; motorola razr) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/11.1 Chrome/75.0.3770.143 Mobile Safari/537.36",
|
||||||
@@ -45,11 +63,65 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc": "Moto X",
|
"desc": "Motorola Moto 360",
|
||||||
"ua": "Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; XT1058 Build/13.9.0Q2.X-70-GHOST-ATT_LE-2) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
"ua": "Mozilla/5.0 (Linux; Android 4.4; Moto 360 Build/KNX01S) AppleWebKit/537.36 (KHTML, like Gecko) WIB/0.9.8 Mobile Safari/537.36",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "Motorola",
|
"vendor": "Motorola",
|
||||||
"model": "XT1058",
|
"model": "Moto 360",
|
||||||
|
"type": "wearable"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto E",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; Moto E (4) Build/NDQS26.69-64-11-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "Moto E (4)",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto E6s",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; MOTOROLA E6S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "E6S",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto E7 Plus",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; moto e(7) plus Build/QPZS30.30-Q3-38-69-12; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.14 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "moto e(7) plus",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto E7 Plus",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; XT2081-1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.171 Mobile Safari/537.36 OPR/102.0.4864.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2081-1",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto G 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; moto g 5G - 2023 Build/U1TPNS34.26-48-2-7; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 EdgA/124.0.2478.64",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "moto g 5G - 2023",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto G 5G (2022)",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; moto g 5G (2022) Build/S1SAS32.47-77-9; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36 [FB_IAB/Orca-Android;FBAV/402.0.0.11.101;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "moto g 5G (2022)",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -72,21 +144,156 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc": "Motorola Moto E",
|
"desc": "Motorola Moto G10",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 7.1.1; Moto E (4) Build/NDQS26.69-64-11-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/56.0.2924.87 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 12; XT2127-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "Motorola",
|
"vendor": "Motorola",
|
||||||
"model": "Moto E (4)",
|
"model": "XT2127-2",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc": "Motorola Moto 360",
|
"desc": "Motorola Moto G24 Power",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 4.4; Moto 360 Build/KNX01S) AppleWebKit/537.36 (KHTML, like Gecko) WIB/0.9.8 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; U; Android 14; moto g24 power Build/UTAS34.82-97-1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/133.0.6943.138 Mobile Safari/537.36 OPR/89.0.2254.76420",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "Motorola",
|
"vendor": "Motorola",
|
||||||
"model": "Moto 360",
|
"model": "moto g24 power",
|
||||||
"type": "wearable"
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto G30",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; XT2129-3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2129-3",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto G54 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; moto g54 5G Build/U1TDS34.94-12-9-10-2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.6834.122 Mobile Safari/537.36 OPX/2",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "moto g54 5G",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto X",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 4.4.4; XT1097 Build/KXE21.187-38) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.109 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT1097",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto X",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 4.2; xx-xx; XT1058 Build/13.9.0Q2.X-70-GHOST-ATT_LE-2) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT1058",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto X Force",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 7.0; XT1580 Build/NPKS25.200-12-9; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 OPR/32.0.2254.123747",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT1580",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto S30",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; XT2243-2 Build/T1SJC33.51-19-7; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 T7/13.30 SP-engine/2.53.0 matrixstyle/0 lite baiduboxapp/6.2.0.10 (Baidu; P1 13) NABar/1.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2243-2",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto X30 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; XT2241-1 Build/T1SQ33.111-12-19) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/16.1.3.1264 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2241-1",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto Z3 Play",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 9; Moto Z3 Play) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "Moto Z3 Play",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Moto Z4",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 10; moto z4 Build/QDF30.130-42-5-17; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/108.0.5359.128 Mobile Safari/537.36 OPR/2.3.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "moto z4",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Nexus 6",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.20 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "Nexus 6",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola One 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; motorola one 5G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "one 5G",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola P30",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 8.1.0; XT1943-1 Build/OPM1.171019.019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/97.0.4692.98 Mobile Safari/537.36 T7/13.50 SP-engine/2.88.0 baiduboxapp/13.50.5.10 (Baidu; P1 8.1.0) NABar/1.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT1943-1",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Razr 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; motorola razr 5G Build/S2PS32.57-23-21; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.97 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/497.0.0.47.36;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "razr 5G",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Razr 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; XT2071-4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "XT2071-4",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Motorola Razr 50 Ultra",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; motorola razr 50 ultra Build/U3UX34.56-29-2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.260 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Motorola",
|
||||||
|
"model": "razr 50 ultra",
|
||||||
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,4 +1,13 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc": "Nokia 1",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; Nokia 1 Build/QP1A.190711.020) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.15 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Nokia",
|
||||||
|
"model": "1",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Nokia3xx",
|
"desc": "Nokia3xx",
|
||||||
"ua": "Nokia303/14.87 CLDC-1.1",
|
"ua": "Nokia303/14.87 CLDC-1.1",
|
||||||
|
|||||||
@@ -17,6 +17,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Nothing 2",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; AIN065 Build/AQ3A.240929.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.90 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/496.0.0.45.65;IABMV/1;] FBNV/500",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Nothing",
|
||||||
|
"model": "AIN065",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Nothing 2a",
|
"desc": "Nothing 2a",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 14; A142 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 14; A142 Build/UP1A.231005.007; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36",
|
||||||
@@ -25,5 +34,32 @@
|
|||||||
"model": "A142",
|
"model": "A142",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Nothing 2a Plus",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; A142P Build/UP1A.231005.007) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.6723.107 Mobile Safari/537.36 OPX/2.6",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Nothing",
|
||||||
|
"model": "A142P",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Nothing 3a",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; A059 Build/AQ3A.241015.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.103 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Nothing",
|
||||||
|
"model": "A059",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Nothing 3a Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; A059P Build/AQ3A.241015.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/136.0.7103.57 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/511.0.0.73.36;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Nothing",
|
||||||
|
"model": "A059P",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -54,11 +54,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc": "OnePlus 8T",
|
"desc": "OnePlus 7T Pro",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 11; KB2005) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.5563.57 Mobile Safari/537.36 EdgA/110.0.1587.66",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "OnePlus",
|
"vendor": "OnePlus",
|
||||||
"model": "KB2005",
|
"model": "HD1913",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 8 Lite",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; OnePlus 8 Lite) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4741.47 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "8 Lite",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -72,11 +81,191 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc": "OnePlus Nord N100",
|
"desc": "OnePlus 8T",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; BE2015 Build/QKQ1.200719.002; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 11; KB2005) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.127 Mobile Safari/537.36",
|
||||||
"expect": {
|
"expect": {
|
||||||
"vendor": "OnePlus",
|
"vendor": "OnePlus",
|
||||||
"model": "BE2015",
|
"model": "KB2005",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 9",
|
||||||
|
"ua": "Mozilla/5.0 (Android 14; SDK 28; OnePlus 9) Gecko/128.0 Firefox/128.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "9",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 9",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; LE2113 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/113.0.5672.162 Mobile Safari/537.36 Flipboard/4.3.14/5377,4.3.14.5377",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "LE2113",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 9 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; LE2123) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.128 Mobile Safari/537.36 OPR/73.0.3832.69371",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "LE2123",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 9R",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; LE2100) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.85 YaApp_Android/21.114.1 YaSearchBrowser/21.114.1 BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "LE2100",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 9RT 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 11; en-in; MT2111 Build/RKQ1.210614.002) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 GSA/13.14.15.23.arm64",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "MT2111",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 10 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; arm_64; Android 12; NE2213) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.148 YaBrowser/22.7.5.90.00 SA/3 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "NE2213",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 10RT",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 13; CPH2413) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "CPH2413",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 11R",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; CPH2487) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "CPH2487",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus 13",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 15; CPH2653 Build/AP3A.240617.008; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/134.0.6998.92 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/504.0.0.69.64;IABMV/1;] FBNV/5",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "CPH2653",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-cn; PGKM10 Build/AP3A.240617.008) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.168 Mobile Safari/537.36 HeyTapBrowser/40.9.6.2",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PGKM10",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 2",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-CN; PHK110 Build/UKQ1.231108.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/17.3.6.1367 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PHK110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 2 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; arm; Android 13; PJA110) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 YaBrowser/23.1.0.284.00 (beta) SA/3 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PJA110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 2V",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-cn; PHP110 Build/AP3A.240617.008) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/121.0.6167.71 MQQBrowser/16.3 Mobile Safari/537.36 COVC/047707",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PHP110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 3",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-CN; PJE110 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/123.0.6312.80 Quark/7.9.7.782 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PJE110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 3 Pro 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-CN; PJX110 Build/UKQ1.231108.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/123.0.6312.80 Quark/7.11.4.814 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PJX110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 3V",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-cn; PJF110 Build/UP1A.231005.007) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.61 Mobile Safari/537.36 HeyTapBrowser/40.8.33.1.2beta",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PJF110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace 5",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 15; zh-cn; PKG110 Build/UKQ1.231108.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/115.0.5790.168 Mobile Safari/537.36 HeyTapBrowser/40.9.9.2",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PKG110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 14; zh-CN; PGP110 Build/UKQ1.230924.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/17.2.9.1360 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PGP110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Ace Racing Edition",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; PGZ110 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/17.3.6.1367 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "PGZ110",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Nord CE 4",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; CPH2613) AppleWebKit/537.36 (KHTML, like Gecko) JioSphere/5.0.4 Chrome/119.0.6045.193 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "CPH2613",
|
||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -89,6 +278,33 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Nord N30 SE 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; CPH2605 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/135.0.7049.92 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/509.0.0.67.28;IABMV/1;]",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "CPH2605",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Nord N100",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; BE2015 Build/QKQ1.200719.002; xx-xx) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "BE2015",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "OnePlus Open",
|
||||||
|
"ua": "Dalvik/2.1.0 (Linux; U; Android 15; CPH2551 Build/AP3A.240617.008)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "OnePlus",
|
||||||
|
"model": "CPH2551",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "OnePlus Pad Go 11.35",
|
"desc": "OnePlus Pad Go 11.35",
|
||||||
"ua": "Mozilla/5.0 (Linux; arm_64; Android 14; OPD2304) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.629 YaApp_Android/24.101/apad YaSearchBrowser/24.101/apad BroPP/1.0 SA/3 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; arm_64; Android 14; OPD2304) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.629 YaApp_Android/24.101/apad YaSearchBrowser/24.101/apad BroPP/1.0 SA/3 Mobile Safari/537.36",
|
||||||
|
|||||||
@@ -1,13 +1,4 @@
|
|||||||
[
|
[
|
||||||
{
|
|
||||||
"desc": "OnePlus 10RT",
|
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 13; CPH2413) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
|
||||||
"expect": {
|
|
||||||
"vendor": "OPPO",
|
|
||||||
"model": "CPH2413",
|
|
||||||
"type": "mobile"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"desc": "OPPO Pad",
|
"desc": "OPPO Pad",
|
||||||
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; OPD2101 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/16.3.9.1290 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; U; Android 13; zh-CN; OPD2101 Build/TP1A.220905.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 UCBrowser/16.3.9.1290 Mobile Safari/537.36",
|
||||||
|
|||||||
83
test/data/ua/device/philips.json
Normal file
83
test/data/ua/device/philips.json
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Philips S616",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 5.1; Philips S616 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.109 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "S616",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips W8510",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 4.2.2; Philips W8510 Build/JDQ39) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.68 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "W8510",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips SmartTV",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; PHILIPS 4k TV Build/RTXC.231010.082.A1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.71 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "PHILIPS",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips SmartTV",
|
||||||
|
"ua": "Opera/9.80 HbbTV/1.1.1 (; Philips; ; ; ; ) NETTV/4.0.2; en) Version/11.60",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips 32PFL6606K/02 SmartTV (2011)",
|
||||||
|
"ua": "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips 32PFL6606K/02 SmartTV (2013)",
|
||||||
|
"ua": "Opera/9.80 (Linux mips ; U; HbbTV/1.1.1 (; Philips; ; ; ; ) CE-HTML/1.0 NETTV/3.1.0; en) Presto/2.6.33 Version/10.70",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips 32PHS5301/12 SmartTV (2016)",
|
||||||
|
"ua": "Mozilla/5.0 (Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36 OPR/29.0.1803.0 OMI/4.5.23.37.MOT2.13 HbbTV/1.2.1 (;Philips;32PHS5301/12;;_TV_MT5800;) Firmware/TPM161E_012.002.045.001 en",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "32PHS5301/12",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips PH0M_EA_T32",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 10; Philips FHD Android TV Build/QTG3.201102.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.186 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Philips PH3M_AL_T32",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; Philips Google TV TA7 Build/RTM5.220609.199; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.58 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Philips",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -25,5 +25,23 @@
|
|||||||
"model": "Neo3 Link",
|
"model": "Neo3 Link",
|
||||||
"type": "xr"
|
"type": "xr"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Pico Neo 3",
|
||||||
|
"ua": "Mozilla/5.0 (X11; Linux x86_64; Pico Neo 3 OS5.12.2 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.48 Chrome/105.0.5195.68 VR Safari/537.36 OculusBrowser/7.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Pico",
|
||||||
|
"model": "Neo 3",
|
||||||
|
"type": "xr"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Pico Neo 3 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (X11; Linux x86_64; Pico Neo 3 Pro OS5.9.9.0 like Quest) AppleWebKit/537.36 (KHTML, like Gecko) PicoBrowser/3.3.46 Chrome/105.0.5195.68 VR Safari/537.36 OculusBrowser/7.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Pico",
|
||||||
|
"model": "Neo 3 Pro",
|
||||||
|
"type": "xr"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
11
test/data/ua/device/retroid.json
Normal file
11
test/data/ua/device/retroid.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Retroid Pocket 4 Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; arm_64; Android 13; Retroid Pocket 4 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.96 YaBrowser/24.4.3.96.00 SA/3 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Retroid",
|
||||||
|
"model": "Pocket 4 Pro",
|
||||||
|
"type": "console"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -296,6 +296,15 @@
|
|||||||
"type": "smarttv"
|
"type": "smarttv"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Samsung SmartTV",
|
||||||
|
"ua": "Mozilla/5.0 (SMART-TV; Linux; Tizen 8.0) AppleWebKit/537.36 (KHTML, like Gecko) Samsung Browser/7.0 Chrome/108.0.5359.1 TV Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Samsung",
|
||||||
|
"model": "undefined",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Samsung SmartTV HBBTV",
|
"desc": "Samsung SmartTV HBBTV",
|
||||||
"ua": "HbbTV/1.5.1 (+DRM;Samsung;SmartTV2021:UAU7000;T-KSU2EDEUC-1506.0;KantSU2e;urn:samsungtv:familyname:21_KANTSU2E_UHD_BASIC:2021;) Tizen/6.0 (+TVPLUS+SmartHubLink) Chrome/76 LaTivu_1.0.1_2021 RVID/17",
|
"ua": "HbbTV/1.5.1 (+DRM;Samsung;SmartTV2021:UAU7000;T-KSU2EDEUC-1506.0;KantSU2e;urn:samsungtv:familyname:21_KANTSU2E_UHD_BASIC:2021;) Tizen/6.0 (+TVPLUS+SmartHubLink) Chrome/76 LaTivu_1.0.1_2021 RVID/17",
|
||||||
|
|||||||
@@ -98,6 +98,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Sony Xperia 1 VI",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; XQ-EC44) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Sony",
|
||||||
|
"model": "XQ-EC44",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Sony Xperia 10ii",
|
"desc": "Sony Xperia 10ii",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AU52) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AU52) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Mobile Safari/537.36",
|
||||||
@@ -107,6 +116,24 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Sony Xperia 10 III Lite",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; XQ-BT44 Build/62.1.A.1.227; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/101.0.4951.61 Mobile Safari/537.36 Sleipnir/3.6.0",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Sony",
|
||||||
|
"model": "XQ-BT44",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Sony Xperia 10 VI",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 14; XQ-ES72 Build/70.0.A.2.233; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/129.0.6668.71 Mobile Safari/537.36 Line/14.16.0/IAB",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Sony",
|
||||||
|
"model": "XQ-ES72",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Sony Xperia Pro",
|
"desc": "Sony Xperia Pro",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AQ52) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.185 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; XQ-AQ52) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.185 Mobile Safari/537.36",
|
||||||
@@ -116,6 +143,24 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Sony Xperia Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 12; Sony XQ-AQ52) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/23.0 Chrome/115.0.0.0 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Sony",
|
||||||
|
"model": "XQ-AQ52",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Sony Xperia Pro I",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; arm_64; Android 11; XQ-BE72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.148 YaBrowser/22.7.3.82.00 SA/3 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Sony",
|
||||||
|
"model": "XQ-BE72",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Sony SGP521 (Xperia Z2 Tablet)",
|
"desc": "Sony SGP521 (Xperia Z2 Tablet)",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 4.4; SGP521 Build/17.1.A.0.432) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Safari/537.36",
|
||||||
|
|||||||
@@ -1,4 +1,31 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc": "Tecno DroiPad 8D",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 5.1; TECNO DP8D Build/LMY47D; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Safari/537.36 OPR/42.0.2254.139280",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "TECNO",
|
||||||
|
"model": "DP8D",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Tecno DroiPad 10A Pro",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 5.1; TECNO DP10A Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.74 Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "TECNO",
|
||||||
|
"model": "DP10A Pro",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Tecno DroiPad 10D 4G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 7.0; TECNO P904) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Mobile Safari/537.36 OPR/77.0.4054.90",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "TECNO",
|
||||||
|
"model": "P904",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Tecno KC8",
|
"desc": "Tecno KC8",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 10; TECNO KC8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 10; TECNO KC8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36",
|
||||||
|
|||||||
20
test/data/ua/device/vizio.json
Normal file
20
test/data/ua/device/vizio.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "VIZIO",
|
||||||
|
"ua": "Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36 CrKey/1.0.999999 VIZIO SmartCast(Conjure/SX7B-4.6.419.12 FW/7.0.23.2-4 Model/M557-G0)",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "VIZIO",
|
||||||
|
"model": "M557-G0",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "VIZIO",
|
||||||
|
"ua": "VIZIO V506-J09 ViziOS/1.4.512.847.1 WatchFree/24.06.13.2 FancyPlayer/1.1.30-qa ",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "VIZIO",
|
||||||
|
"model": "V506-J09",
|
||||||
|
"type": "smarttv"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
29
test/data/ua/device/wiko.json
Normal file
29
test/data/ua/device/wiko.json
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc": "Wiko Life 3",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; Wiko U316AT) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5199.205 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Wiko",
|
||||||
|
"model": "U316AT",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Wiko Ride 3",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; Wiko U614AS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.181 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Wiko",
|
||||||
|
"model": "U614AS",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "Wiko T10",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; Android 11; WIKO T10 Build/RP1A.200720.011) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.62 Mobile Safari/537.36",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "WIKO",
|
||||||
|
"model": "T10",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -116,6 +116,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Xiaomi Mi 11 Lite 5G",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 12; zh-CN; Mi 11 Lite 5G Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.136 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.17.0-gn",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Xiaomi",
|
||||||
|
"model": "Mi 11 Lite 5G",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Xiaomi Mi 5s Plus",
|
"desc": "Xiaomi Mi 5s Plus",
|
||||||
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; MI 5s Plus Build/MXB48T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/8.7.1",
|
"ua": "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; MI 5s Plus Build/MXB48T) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/8.7.1",
|
||||||
@@ -188,6 +197,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Xiaomi Mi 10T",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 12; fr-CA; Mi 10T Build/SKQ1.211006.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.79 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.16.1-gn",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Xiaomi",
|
||||||
|
"model": "Mi 10T",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Xiaomi Mi A2",
|
"desc": "Xiaomi Mi A2",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 9; Mi A2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 9; Mi A2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36",
|
||||||
@@ -314,6 +332,15 @@
|
|||||||
"type": "tablet"
|
"type": "tablet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "Xiaomi Pad 5",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 12; ca-ES; Xiaomi Pad 5 Build/SKQ1.220303.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.86 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.6.0-gn",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Xiaomi",
|
||||||
|
"model": "mi Pad 5",
|
||||||
|
"type": "tablet"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "Xiaomi Pad 6S Pro 12.4",
|
"desc": "Xiaomi Pad 6S Pro 12.4",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 14; 24018RPACC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 14; 24018RPACC) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
|
||||||
@@ -458,6 +485,15 @@
|
|||||||
"type": "mobile"
|
"type": "mobile"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "XiaoMi Redmi Note 10 Lite",
|
||||||
|
"ua": "Mozilla/5.0 (Linux; U; Android 12; es-VE; Mi Note 10 Lite Build/SKQ1.210908.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.88 Mobile Safari/537.36 XiaoMi/MiuiBrowser/13.16.1-gn",
|
||||||
|
"expect": {
|
||||||
|
"vendor": "Xiaomi",
|
||||||
|
"model": "Mi Note 10 Lite",
|
||||||
|
"type": "mobile"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "XiaoMi Redmi Note 10 Pro",
|
"desc": "XiaoMi Redmi Note 10 Pro",
|
||||||
"ua": "Mozilla/5.0 (Linux; Android 13; M2101K6P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
"ua": "Mozilla/5.0 (Linux; Android 13; M2101K6P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36",
|
||||||
|
|||||||
@@ -79,6 +79,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Algolia Crawler",
|
||||||
|
"ua" : "Algolia Crawler/v2.183.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Algolia Crawler",
|
||||||
|
"version" : "v2.183.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Algolia Crawler Renderscript",
|
||||||
|
"ua" : "Algolia Crawler Renderscript",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Algolia Crawler Renderscript",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Applebot",
|
"desc" : "Applebot",
|
||||||
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4 (Applebot/0.1;+http://www.apple.com/go/applebot)",
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B410 Safari/600.1.4 (Applebot/0.1;+http://www.apple.com/go/applebot)",
|
||||||
@@ -139,6 +159,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Baidu ADS",
|
||||||
|
"ua" : "Baidu-ADS",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Baidu-ADS",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Baiduspider",
|
"desc" : "Baiduspider",
|
||||||
"ua" : "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
|
"ua" : "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
|
||||||
@@ -229,6 +259,36 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "BLEXBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; BLEXBot/1.0; +http://webmeup-crawler.com/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BLEXBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "botify",
|
||||||
|
"ua" : "Desktop: Mozilla/5.0 (compatible; botify; http://botify.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "botify",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Bravebot",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Bravebot/1.0; +https://search.brave.com/help/brave-search-crawler) Chrome/W.X.Y.Z Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Bravebot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Bytespider",
|
"desc" : "Bytespider",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.1511.1269 Mobile Safari/537.36; Bytespider",
|
"ua" : "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.1511.1269 Mobile Safari/537.36; Bytespider",
|
||||||
@@ -259,6 +319,36 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ChatGLM-Spider",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; ChatGLM-Spider/1.0; +https://chatglm.cn/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ChatGLM-Spider",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Claude-SearchBot",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-SearchBot/1.0; +Claude-SearchBot@anthropic.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Claude-SearchBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ClaudeWeb",
|
||||||
|
"ua" : "Claude-Web/1.0 (web crawler; +https://www.anthropic.com/; bots@anthropic.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Claude-Web",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Coc Coc Bot (web)",
|
"desc" : "Coc Coc Bot (web)",
|
||||||
"ua" : "Mozilla/5.0 (compatible; coccocbot-web/1.0; +http://help.coccoc.com/searchengine)",
|
"ua" : "Mozilla/5.0 (compatible; coccocbot-web/1.0; +http://help.coccoc.com/searchengine)",
|
||||||
@@ -280,15 +370,55 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "ClaudeWeb",
|
"desc" : "cohere-training-data-crawler",
|
||||||
"ua" : "Claude-Web/1.0 (web crawler; +https://www.anthropic.com/; bots@anthropic.com)",
|
"ua" : "cohere-training-data-crawler (+crawler@cohere.ai)",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Claude-Web",
|
"name" : "cohere-training-data-crawler",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "contxbot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible;contxbot/1.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "contxbot",
|
||||||
"version" : "1.0",
|
"version" : "1.0",
|
||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Cotoyogi",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Cotoyogi/4.0; +https://ds.rois.ac.jp/center8/crawler/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Cotoyogi",
|
||||||
|
"version" : "4.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Coveobot",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) (compatible; Coveobot/2.0;+http://www.coveo.com/bot.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Coveobot",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "CriteoBot",
|
||||||
|
"ua" : "CriteoBot/0.1 (+https://www.criteo.com/criteo-crawler/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "CriteoBot",
|
||||||
|
"version" : "0.1",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "DataForSEO",
|
"desc" : "DataForSEO",
|
||||||
"ua" : "Mozilla/5.0 (compatible; DataForSeoBot; +https://dataforseo.com/dataforseo-bot)",
|
"ua" : "Mozilla/5.0 (compatible; DataForSeoBot; +https://dataforseo.com/dataforseo-bot)",
|
||||||
@@ -299,6 +429,46 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Daum",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; MSIE or Firefox mutant;) Daum 4.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Daum",
|
||||||
|
"version" : "4.1",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Daumoa",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; MSIE or Firefox mutant; not on Windows server;) Daumoa 4.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Daumoa",
|
||||||
|
"version" : "4.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Daumoa-image",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; MSIE or Firefox mutant; not on Windows server;) Daumoa-image/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Daumoa-image",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "DeepSeekBot",
|
||||||
|
"ua" : "DeepSeekBot",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "DeepSeekBot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Diffbot",
|
"desc" : "Diffbot",
|
||||||
"ua" : "Diffbot/0.1",
|
"ua" : "Diffbot/0.1",
|
||||||
@@ -329,6 +499,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "DuckDuckGo-Favicons-Bot",
|
||||||
|
"ua" : "DuckDuckGo-Favicons-Bot/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "DuckDuckGo-Favicons-Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Elastic",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/124.0.6367.29 Safari/537.36 Elastic/Synthetics",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Elastic",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Exabot",
|
"desc" : "Exabot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; Exabot/3.0; +http://www.exabot.com/go/robot)",
|
"ua" : "Mozilla/5.0 (compatible; Exabot/3.0; +http://www.exabot.com/go/robot)",
|
||||||
@@ -369,6 +559,36 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "FirecrawlAgent",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; FirecrawlAgent/1.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "FirecrawlAgent",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Freespoke",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Freespoke/2.0; +https://docs.freespoke.com/search/bot)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Freespoke",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "APIs-Google",
|
||||||
|
"ua" : "APIs-Google (+https://developers.google.com/webmasters/APIs-Google.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "APIs-Google",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Googlebot-Video",
|
"desc" : "Googlebot-Video",
|
||||||
"ua" : "Googlebot-Video/1.0",
|
"ua" : "Googlebot-Video/1.0",
|
||||||
@@ -469,6 +689,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Google-CloudVertexBot",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.7204.183 Mobile Safari/537.36 (compatible; Google-CloudVertexBot; +https://cloud.google.com/enterprise-search)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Google-CloudVertexBot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Google-Safety",
|
"desc" : "Google-Safety",
|
||||||
"ua" : "Google-Safety",
|
"ua" : "Google-Safety",
|
||||||
@@ -489,6 +719,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HuggingFace-Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; HuggingFace-Bot/1.0; +https://huggingface.co/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HuggingFace-Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iAskBot",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/605.1.15 (KHTML, like Gecko; compatible; iAskBot/1.0; +https://iask.ai/) Chrome/120.0.6099.119 Safari/605.1.15",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "iAskBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "ImagesiftBot",
|
"desc" : "ImagesiftBot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; ImagesiftBot; +imagesift.com)",
|
"ua" : "Mozilla/5.0 (compatible; ImagesiftBot; +imagesift.com)",
|
||||||
@@ -499,6 +749,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Kagibot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Kagibot/1.0; +https://kagi.com/bot)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Kagibot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Kangaroo Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Kangaroo Bot/1.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Kangaroo Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Linespider",
|
"desc" : "Linespider",
|
||||||
"ua" : "Mozilla/5.0 (compatible; Linespider/1.1; +https://lin.ee/4dwXkTH)",
|
"ua" : "Mozilla/5.0 (compatible; Linespider/1.1; +https://lin.ee/4dwXkTH)",
|
||||||
@@ -529,6 +799,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Marginalia Search",
|
||||||
|
"ua" : "search.marginalia.nu",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "marginalia",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Meta-ExternalAgent",
|
"desc" : "Meta-ExternalAgent",
|
||||||
"ua" : "meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)",
|
"ua" : "meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)",
|
||||||
@@ -560,6 +840,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "msnbot",
|
||||||
|
"ua" : "msnbot/2.0b (+http://search.msn.com/msnbot.htm)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "msnbot",
|
||||||
|
"version" : "2.0b",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Omgili",
|
"desc" : "Omgili",
|
||||||
"ua" : "omgili/0.5 +https://omgili.com",
|
"ua" : "omgili/0.5 +https://omgili.com",
|
||||||
@@ -580,6 +870,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "OnCrawl",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4 (compatible; OnCrawl Mobile/1.0; +http://www.oncrawl.com/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "OnCrawl",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Onespot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Onespot-ScraperBot/1.0; +https://www.onespot.com/identifying-traffic.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Onespot-ScraperBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "OpenAI Search",
|
"desc" : "OpenAI Search",
|
||||||
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot",
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot",
|
||||||
@@ -590,6 +900,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "PanguBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; PanguBot/1.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "PanguBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "PerplexityBot",
|
"desc" : "PerplexityBot",
|
||||||
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
|
||||||
@@ -620,6 +940,76 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qwantbot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Qwantbot/1.0_12345; +https://help.qwant.com/bot/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Qwantbot",
|
||||||
|
"version" : "1.0_12345",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qwantbot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Qwantbot-prod51071/1.0; +Qwantbot@qwant.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Qwantbot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Qwantbot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Qwantbot-news/2.0; +https://help.qwant.com/bot/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Qwantbot-news",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Replicate-Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Replicate-Bot/1.0; +https://replicate.com/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Replicate-Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "RunPod-Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; RunPod-Bot/1.0; +https://runpod.io/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "RunPod-Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "SBIntuitionsBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; SBIntuitionsBot/0.1;+https://www.sbintuitions.co.jp/bot/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "SBIntuitionsBot",
|
||||||
|
"version" : "0.1",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "SeekportBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; SeekportBot; +https://bot.seekport.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "SeekportBot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "SemrushBot",
|
"desc" : "SemrushBot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)",
|
"ua" : "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)",
|
||||||
@@ -671,7 +1061,27 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Sogou",
|
"desc" : "Siteimprove",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; SiteCheck-sitecrawl by Siteimprove.com; +https://siteimprove.com/bots) Chrome/[VERSION] Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Siteimprove",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Sogou Pic Spider",
|
||||||
|
"ua" : "Sogou Pic Spider/3.0( http://www.sogou.com/docs/help/webmasters.htm#07)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Sogou Pic Spider",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Sogou web spider",
|
||||||
"ua" : "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)",
|
"ua" : "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
@@ -680,6 +1090,36 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Startpage",
|
||||||
|
"ua" : "StartpagePrivateImageProxy/3.0 (https://www.startpage.com/; support@startpage.com) aiohttp.client/3.11.11",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "StartpagePrivateImageProxy",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "SurdotlyBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; SurdotlyBot/1.0; +http://sur.ly/bot.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "SurdotlyBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Swiftbot",
|
||||||
|
"ua" : "Swiftbot/1.0 (swiftype.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Swiftbot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Teoma",
|
"desc" : "Teoma",
|
||||||
"ua" : "Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)",
|
"ua" : "Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)",
|
||||||
@@ -690,6 +1130,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "TikTokSpider",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; TikTokSpider; ttspider-feedback@tiktok.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "TikTokSpider",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Timpibot",
|
"desc" : "Timpibot",
|
||||||
"ua" : "Timpibot/0.8 (+http://www.timpi.io)",
|
"ua" : "Timpibot/0.8 (+http://www.timpi.io)",
|
||||||
@@ -700,6 +1150,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Together-Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Together-Bot/1.0; +https://together.ai/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Together-Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "TurnitinBot",
|
"desc" : "TurnitinBot",
|
||||||
"ua" : "TurnitinBot (https://turnitin.com/robot/crawlerinfo.html)",
|
"ua" : "TurnitinBot (https://turnitin.com/robot/crawlerinfo.html)",
|
||||||
@@ -710,6 +1170,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "TwinAgent",
|
||||||
|
"ua" : "TwinAgent/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "TwinAgent",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "xAI-Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; xAI-Bot/1.0; +https://x.ai/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "xAI-Bot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "VelenPublicWebCrawler",
|
"desc" : "VelenPublicWebCrawler",
|
||||||
"ua" : "Mozilla/5.0 (compatible; VelenPublicWebCrawler/1.0; +https://velen.io)",
|
"ua" : "Mozilla/5.0 (compatible; VelenPublicWebCrawler/1.0; +https://velen.io)",
|
||||||
@@ -720,6 +1200,36 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "v0bot",
|
||||||
|
"ua" : "v0bot",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "v0bot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "webzio",
|
||||||
|
"ua" : "webzio (+https://webz.io/bot.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webzio",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Webzio-Extended",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Webzio-Extended/1.0; +https://www.webzio.com/bot.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Webzio-Extended",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Yahoo! Japan",
|
"desc" : "Yahoo! Japan",
|
||||||
"ua" : "Y!J-BRW/1.0 (https://www.yahoo-help.jp/app/answers/detail/p/595/a_id/42716)",
|
"ua" : "Y!J-BRW/1.0 (https://www.yahoo-help.jp/app/answers/detail/p/595/a_id/42716)",
|
||||||
@@ -740,6 +1250,46 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexAccessibilityBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexAccessibilityBot",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexAdditionalBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexAdditionalBot/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexAdditionalBot",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexAdNet",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexAdNet/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexAdNet",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexBlogs",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexBlogs/0.99; robot; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexBlogs",
|
||||||
|
"version" : "0.99",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "YandexBot",
|
"desc" : "YandexBot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)",
|
"ua" : "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)",
|
||||||
@@ -750,6 +1300,256 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexBot MirrorDetector",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexBot MirrorDetector",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexComBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexComBot/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexComBot",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexFavicons",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexFavicons/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexFavicons",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexImageResizer",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexImageResizer/2.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexImageResizer",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexImages",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexImages",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexMarket",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexMarket/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexMarket",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexMetrika",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexMetrika/2.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexMetrika",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexMedia",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexMedia/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexMedia",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexMobileBot",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4 (compatible; YandexMobileBot/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexMobileBot",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexMobileScreenShotBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexMobileScreenShotBot/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexMobileScreenShotBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexNews",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexNews/4.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexNews",
|
||||||
|
"version" : "4.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexOntoDB",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexOntoDB/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexOntoDB",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexOntoDBAPI",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexOntoDBAPI/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexOntoDBAPI",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexPartner",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexPartner/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexPartner",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexRCA",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexRCA/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexRCA",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexRenderResourcesBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexRenderResourcesBot/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexRenderResourcesBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexScreenshotBot",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Safari/537.36 (compatible; YandexScreenshotBot/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexScreenshotBot",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexSpravBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexSpravBot/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexSpravBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexTracker",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexTracker/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexTracker",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexVertis",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexVertis/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexVertis",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexVerticals",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexVerticals/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexVerticals",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexVideo",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexVideo/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexVideo",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexVideoParser",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexVideoParser/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexVideoParser",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexWebmaster",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexWebmaster/2.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexWebmaster",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YepBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YepBot/1.0; +http://yep.com/yepbot/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YepBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Yeti",
|
"desc" : "Yeti",
|
||||||
"ua" : "Mozilla/5.0 (compatible; Yeti/1.1; +http://naver.me/spd)",
|
"ua" : "Mozilla/5.0 (compatible; Yeti/1.1; +http://naver.me/spd)",
|
||||||
@@ -789,5 +1589,15 @@
|
|||||||
"version" : "undefined",
|
"version" : "undefined",
|
||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ZumBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; ZumBot/1.0; http://help.zum.com/inquiry)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ZumBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,6 +9,16 @@
|
|||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Apple Mail",
|
||||||
|
"ua" : "Mail/3826.500.181.1.5 CFNetwork/3826.500.111.1.1 Darwin/24.4.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mail",
|
||||||
|
"version" : "3826.500.181.1.5",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "BlueMail",
|
"desc" : "BlueMail",
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) BlueMail/0.10.31 Chrome/61.0.3163.100 Electron/2.0.18 Safari/537.36",
|
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) BlueMail/0.10.31 Chrome/61.0.3163.100 Electron/2.0.18 Safari/537.36",
|
||||||
@@ -29,6 +39,16 @@
|
|||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "DaumMail",
|
||||||
|
"ua" : "DaumMobileApp (LG-KU5400; U; Android 2.3.7|10; ko-kr) DaumMail/1.0.8 ",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "DaumMail",
|
||||||
|
"version" : "1.0.8",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Evolution",
|
"desc" : "Evolution",
|
||||||
"ua" : "Evolution/3.52.3",
|
"ua" : "Evolution/3.52.3",
|
||||||
@@ -119,6 +139,36 @@
|
|||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Polymail",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Polymail/2.3.12 Chrome/114.0.5735.134 Electron/25.2.0 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Polymail",
|
||||||
|
"version" : "2.3.12",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ProtonMail",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) ProtonMail/1.4.0 Chrome/122.0.6261.156 Electron/29.4.6 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ProtonMail",
|
||||||
|
"version" : "1.4.0",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "SparkDesktop",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) SparkDesktop/3.0.30 Chrome/102.0.5005.63 Electron/19.0.4 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "SparkDesktop",
|
||||||
|
"version" : "3.0.30",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Sparrow",
|
"desc" : "Sparrow",
|
||||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Sparrow/1043.1",
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Sparrow/1043.1",
|
||||||
@@ -158,5 +208,25 @@
|
|||||||
"version" : "1.3.10",
|
"version" : "1.3.10",
|
||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Zimbra",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 6.2; it; rv:1.9.2.19pre) Gecko/20110902 Prism zdesktop/7.2.8",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Zimbra",
|
||||||
|
"version" : "7.2.8",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ZohoMail",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ZohoMail-Desktop/1.6.3 Chrome/124.0.6367.207 Electron/30.0.6 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ZohoMail-Desktop",
|
||||||
|
"version" : "1.6.3",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -9,6 +9,16 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Asana",
|
||||||
|
"ua" : "Asana/1.4.0 WebsiteMetadataRetriever",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Asana",
|
||||||
|
"version" : "1.4.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Better Uptime Bot",
|
"desc" : "Better Uptime Bot",
|
||||||
"ua" : "Better Uptime Bot Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
|
"ua" : "Better Uptime Bot Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
|
||||||
@@ -29,6 +39,26 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Bit.ly",
|
||||||
|
"ua" : "bitlybot/3.0 (+http://bit.ly/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "bitlybot",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Blueno",
|
||||||
|
"ua" : "facebookexternalhit/1.1 (compatible; Blueno/1.0; +http://naver.me/scrap)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Blueno",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Bluesky",
|
"desc" : "Bluesky",
|
||||||
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app) Chrome/100.0.0.0 Safari/537.36",
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app) Chrome/100.0.0.0 Safari/537.36",
|
||||||
@@ -39,6 +69,16 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "BufferLinkPreviewBot",
|
||||||
|
"ua" : "BufferLinkPreviewBot/1.0 (+https://scraper.buffer.com/about/bots/link-preview-bot)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BufferLinkPreviewBot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "ChatGPT-User",
|
"desc" : "ChatGPT-User",
|
||||||
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot",
|
||||||
@@ -49,6 +89,46 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Chrome-Lighthouse",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4590.2 Mobile Safari/537.36 Chrome-Lighthouse",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Chrome-Lighthouse",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Claude-User",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +Claude-User@anthropic.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Claude-User",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Cohere-AI",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Cohere-AI/1.0; +https://cohere.com/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Cohere-AI",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Discordbot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Discordbot",
|
||||||
|
"version" : "2.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "DuckAssistBot",
|
"desc" : "DuckAssistBot",
|
||||||
"ua" : "DuckAssistBot/1.2; (+http://duckduckgo.com/duckassistbot.html)",
|
"ua" : "DuckAssistBot/1.2; (+http://duckduckgo.com/duckassistbot.html)",
|
||||||
@@ -59,6 +139,16 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Gemini-Deep-Research",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Gemini-Deep-Research; +https://gemini.google/overview/deep-research/) Chrome/135.0.0.0 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Gemini-Deep-Research",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Google FeedFetcher",
|
"desc" : "Google FeedFetcher",
|
||||||
"ua" : "FeedFetcher-Google; (+http://www.google.com/feedfetcher.html)",
|
"ua" : "FeedFetcher-Google; (+http://www.google.com/feedfetcher.html)",
|
||||||
@@ -129,6 +219,46 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HubSpot Page Fetcher",
|
||||||
|
"ua" : "HubSpot Page Fetcher/1.0 http://www.hubspot.com/ web-crawlers@hubspot.com",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HubSpot Page Fetcher",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Iframely",
|
||||||
|
"ua" : "Iframely/1.3.1 (+https://iframely.com/docs/about)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Iframely",
|
||||||
|
"version" : "1.3.1",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "kakaotalk-scrap",
|
||||||
|
"ua" : "facebookexternalhit/1.1; kakaotalk-scrap/1.0; +https://devtalk.kakao.com/t/scrap/33984",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "kakaotalk-scrap",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "KeybaseBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; KeybaseBot; +https://keybase.io)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "KeybaseBot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Meta-ExternalFetcher",
|
"desc" : "Meta-ExternalFetcher",
|
||||||
"ua" : "meta-externalfetcher/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)",
|
"ua" : "meta-externalfetcher/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler)",
|
||||||
@@ -149,6 +279,36 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MistralAI-User",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; MistralAI-User/1.0; +https://docs.mistral.ai/robots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MistralAI-User",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NovaAct",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Agent-NovaAct/0.9",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "NovaAct",
|
||||||
|
"version" : "0.9",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Perplexity-User",
|
||||||
|
"ua" : "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Perplexity-User",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Pinterestbot",
|
"desc" : "Pinterestbot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; Pinterestbot/1.0; +http://www.pinterest.com/bot.html)",
|
"ua" : "Mozilla/5.0 (compatible; Pinterestbot/1.0; +http://www.pinterest.com/bot.html)",
|
||||||
@@ -179,6 +339,36 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Slack-ImgProxy",
|
||||||
|
"ua" : "Slack-ImgProxy 0.19 (+https://api.slack.com/robots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Slack-ImgProxy",
|
||||||
|
"version" : "0.19",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Slackbot",
|
||||||
|
"ua" : "Slackbot 1.0 (+https://api.slack.com/robots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Slackbot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Slackbot-LinkExpanding",
|
||||||
|
"ua" : "Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Slackbot-LinkExpanding",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Snap URL Preview",
|
"desc" : "Snap URL Preview",
|
||||||
"ua" : "Snap URL Preview Service; bot; snapchat; https://developers.snap.com/robots ",
|
"ua" : "Snap URL Preview Service; bot; snapchat; https://developers.snap.com/robots ",
|
||||||
@@ -209,6 +399,16 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Twitterbot",
|
||||||
|
"ua" : "Twitterbot/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Twitterbot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "UptimeRobot",
|
"desc" : "UptimeRobot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)",
|
"ua" : "Mozilla/5.0 (compatible; UptimeRobot/2.0; http://www.uptimerobot.com/)",
|
||||||
@@ -219,6 +419,26 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "vercel-favicon-bot",
|
||||||
|
"ua" : "vercel-favicon-bot",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "vercel-favicon-bot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "vercel-screenshot-bot",
|
||||||
|
"ua" : "vercel-screenshot-bot",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "vercel-screenshot-bot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Vercelbot",
|
"desc" : "Vercelbot",
|
||||||
"ua" : "Vercelbot (+https://vercel.com)",
|
"ua" : "Vercelbot (+https://vercel.com)",
|
||||||
@@ -229,6 +449,26 @@
|
|||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "vercelflags",
|
||||||
|
"ua" : "vercelflags",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "vercelflags",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "verceltracing",
|
||||||
|
"ua" : "verceltracing",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "verceltracing",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "WhatsApp",
|
"desc" : "WhatsApp",
|
||||||
"ua" : "WhatsApp/2.23.20.0",
|
"ua" : "WhatsApp/2.23.20.0",
|
||||||
@@ -238,5 +478,105 @@
|
|||||||
"version" : "2.23.20.0",
|
"version" : "2.23.20.0",
|
||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YaDirectFetcher",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YaDirectFetcher/1.0; Dyatel; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YaDirectFetcher",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexCalendar",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexCalendar/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexCalendar",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexDirect",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexDirect/3.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexDirect",
|
||||||
|
"version" : "3.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexDirectDyn",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexDirectDyn/1.0; +http://yandex.com/bots",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexDirectDyn",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexForDomain",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexForDomain/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexForDomain",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexPagechecker",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexPagechecker/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexPagechecker",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexSearchShop",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexSearchShop/1.0; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexSearchShop",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexSitelinks",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexSitelinks; Dyatel; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexSitelinks",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YandexUserproxy",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; YandexUserproxy; robot; +http://yandex.com/bots)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YandexUserproxy",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Zoombot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Zoombot/1.0; +https://zoom.us; crawler@domain.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Zoombot",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,4 +1,154 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Discord on Linux",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) discord/0.0.26 Chrome/108.0.5359.215 Electron/22.3.2 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "discord",
|
||||||
|
"version" : "0.0.26",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Discord on iPad",
|
||||||
|
"ua" : "Discord/52.0 (iPad; iOS 14.4; Scale/2.00)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Discord",
|
||||||
|
"version" : "52.0",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Evernote on Windows",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Evernote Windows/306387 (pt-PT, DDL); Windows/6.1.0 (Win32); Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Evernote",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Figma on Mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4_0) AppleWebKit/537.36 (KHTML, like Gecko) Figma/99.0.0 Chrome/89.0.4389.128 Electron/12.0.9 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Figma",
|
||||||
|
"version" : "99.0.0",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Flipboard on Android",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 8.0.0; SM-A720F Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.110 Mobile Safari/537.36 Flipboard/4.1.13/4342,4.1.13.4342",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Flipboard",
|
||||||
|
"version" : "4.1.13",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mattermost on Mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/4.4.0 Chrome/76.0.3809.146 Electron/6.1.7 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mattermost",
|
||||||
|
"version" : "4.4.0",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mattermost on iPad",
|
||||||
|
"ua" : "Mattermost/1.49.1 (iPad; iOS 15.3.1; Scale/2.00)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mattermost",
|
||||||
|
"version" : "1.49.1",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Teams on Mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_3_1) AppleWebKit/537.36 (KHTML, like Gecko) Teams/1.8.00.3758 Chrome/126.0.6478.261 Electron/31.7.7 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Teams",
|
||||||
|
"version" : "1.8.00.3758",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Teams on iPad",
|
||||||
|
"ua" : "Mozilla/5.0 (iPad; CPU OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 TeamsMobile-iOS",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Teams",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Teams on iPhone",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 TeamsMobile-iOS",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Teams",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Microsoft Teams on Android",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 8.1.0; SM-G610F Build/M1AJQ; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.101 Mobile Safari/537.36 TeamsMobile-Android",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Teams",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Notion on Mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Notion/2.0.23 Chrome/91.0.4472.164 Electron/13.6.9 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Notion",
|
||||||
|
"version" : "2.0.23",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Postman on Mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Postman/9.29.0 Chrome/94.0.4606.81 Electron/15.5.7 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Postman",
|
||||||
|
"version" : "9.29.0",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Rambox on mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/537.36 (KHTML, like Gecko) Rambox/0.7.7 Chrome/78.0.3904.130 Electron/7.2.4 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Rambox",
|
||||||
|
"version" : "0.7.7",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Rocket.Chat on mac",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Rocket.Chat/3.8.16 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Rocket.Chat",
|
||||||
|
"version" : "3.8.16",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Slack on mac",
|
"desc" : "Slack on mac",
|
||||||
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Slack/4.39.90 Chrome/127.0.6533.72 Electron/13.1.9 Safari/537.36",
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Slack/4.39.90 Chrome/127.0.6533.72 Electron/13.1.9 Safari/537.36",
|
||||||
@@ -9,6 +159,26 @@
|
|||||||
"type" : "inapp"
|
"type" : "inapp"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "TikTok Lite",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 8.0.0; SM-J400F Build/R16NW; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36 Channel/release AppName/ultralite app_version/27.2.3 Region/ID ByteLocale/id-ID ByteFullLocale/id-ID",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "TikTok Lite",
|
||||||
|
"version" : "27.2.3",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "VS Code on Windows",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Code/1.85.1 Chrome/114.0.5735.289 Electron/25.9.7 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "VS Code",
|
||||||
|
"version" : "1.85.1",
|
||||||
|
"type" : "inapp"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Yahoo! Japan on Android",
|
"desc" : "Yahoo! Japan on Android",
|
||||||
"ua" : "Mozilla/5.0 (Linux; Android 13; SH-M20 Build/TKQ1.220915.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.163 Mobile Safari/537.36 YJApp-ANDROID jp.co.yahoo.android.yjtop/3.187.0",
|
"ua" : "Mozilla/5.0 (Linux; Android 13; SH-M20 Build/TKQ1.220915.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/132.0.6834.163 Mobile Safari/537.36 YJApp-ANDROID jp.co.yahoo.android.yjtop/3.187.0",
|
||||||
|
|||||||
@@ -1,4 +1,24 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "AdobeAIR",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) AdobeAIR/3.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AdobeAIR",
|
||||||
|
"version" : "3.1",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "aiohttp",
|
||||||
|
"ua" : "Python/3.9 aiohttp/3.8.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "aiohttp",
|
||||||
|
"version" : "3.8.1",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Apache-HttpClient",
|
"desc" : "Apache-HttpClient",
|
||||||
"ua" : "Apache-HttpClient/4.5.14 (Java/17.0.12)",
|
"ua" : "Apache-HttpClient/4.5.14 (Java/17.0.12)",
|
||||||
@@ -19,6 +39,36 @@
|
|||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Bun",
|
||||||
|
"ua" : "Bun/1.0.6",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Bun",
|
||||||
|
"version" : "1.0.6",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Dart",
|
||||||
|
"ua" : "Dart/3.5 (dart:io)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Dart",
|
||||||
|
"version" : "3.5",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Deno",
|
||||||
|
"ua" : "Deno/2.1.7",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Deno",
|
||||||
|
"version" : "2.1.7",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "go-http-client",
|
"desc" : "go-http-client",
|
||||||
"ua" : "go-http-client/1.1",
|
"ua" : "go-http-client/1.1",
|
||||||
@@ -39,6 +89,16 @@
|
|||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "hackney",
|
||||||
|
"ua" : "hackney/1.20.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "hackney",
|
||||||
|
"version" : "1.20.1",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "GuzzleHttp",
|
"desc" : "GuzzleHttp",
|
||||||
"ua" : "GuzzleHttp/6.5.5 curl/7.70.0 PHP/7.4.22",
|
"ua" : "GuzzleHttp/6.5.5 curl/7.70.0 PHP/7.4.22",
|
||||||
@@ -110,12 +170,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "OkHttp",
|
"desc" : "Node.js",
|
||||||
"ua" : "okhttp/3.2.0",
|
"ua" : "Node.js/22",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "okhttp",
|
"name" : "Node.js",
|
||||||
"version" : "3.2.0",
|
"version" : "22",
|
||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -129,6 +189,26 @@
|
|||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Nutch",
|
||||||
|
"ua" : "AliyunSecBot/Nutch-1.21-SNAPSHOT",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Nutch",
|
||||||
|
"version" : "1.21-SNAPSHOT",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "OkHttp",
|
||||||
|
"ua" : "okhttp/3.2.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "okhttp",
|
||||||
|
"version" : "3.2.0",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "PHP-SOAP",
|
"desc" : "PHP-SOAP",
|
||||||
"ua" : "PHP-SOAP/7.4.33",
|
"ua" : "PHP-SOAP/7.4.33",
|
||||||
@@ -149,6 +229,16 @@
|
|||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Python httpx",
|
||||||
|
"ua" : "python-httpx/0.27.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "python-httpx",
|
||||||
|
"version" : "0.27.2",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Python urllib",
|
"desc" : "Python urllib",
|
||||||
"ua" : "Python-urllib/2.6",
|
"ua" : "Python-urllib/2.6",
|
||||||
@@ -159,6 +249,16 @@
|
|||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Python urllib3",
|
||||||
|
"ua" : "python-urllib3/1.26.18",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "python-urllib3",
|
||||||
|
"version" : "1.26.18",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Python requests",
|
"desc" : "Python requests",
|
||||||
"ua" : "python-requests/2.32",
|
"ua" : "python-requests/2.32",
|
||||||
@@ -169,6 +269,16 @@
|
|||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "rest-client",
|
||||||
|
"ua" : "rest-client/2.1.0 (linux-gnu x86_64) ruby/2.7.2p137",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "rest-client",
|
||||||
|
"version" : "2.1.0",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Scrapy",
|
"desc" : "Scrapy",
|
||||||
"ua" : "Scrapy/1.5.0 (+https://scrapy.org)",
|
"ua" : "Scrapy/1.5.0 (+https://scrapy.org)",
|
||||||
@@ -188,5 +298,15 @@
|
|||||||
"version" : "5.0.2",
|
"version" : "5.0.2",
|
||||||
"type" : "library"
|
"type" : "library"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "undici",
|
||||||
|
"ua" : "undici",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "undici",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -7,5 +7,32 @@
|
|||||||
"name" : "AIX",
|
"name" : "AIX",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AIX",
|
||||||
|
"ua" : "Mozilla/5.0 (AIX; SPARC64; smart-thumbtack; Mosaic/2.7) Gecko/20100101 Mosaic/2.7",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AIX",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AIX",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; N; Linux i686; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Mozilla/3.0 (X11; I; AIX 2) Navigator/9.0.0.6",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AIX",
|
||||||
|
"version" : "2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AIX",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; AIX 7.2; en-US; rv:1.7.12) Gecko/20100101 Firefox/126.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AIX",
|
||||||
|
"version" : "7.2"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
20
test/data/ua/os/arcaos.json
Normal file
20
test/data/ua/os/arcaos.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "ArcaOS",
|
||||||
|
"ua" : "Mozilla/5.0 (OS/2; ArcaOS 5.0.6; x86_64; rv:89.0) Gecko/20100101 Firefox/89.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ArcaOS",
|
||||||
|
"version" : "5.0.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ArcaOS",
|
||||||
|
"ua" : "Mozilla/5.0 (OS/2; ArcaOS; x64; rv:89.0) Gecko/20100101 Firefox/89.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ArcaOS",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Arch",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Arch Linux i686; rv:2.0) Gecko/20100101 Firefox/126.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Arch",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Arch",
|
||||||
|
"ua" : "Mozilla/5.0 ArchLinux (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Arch",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Arch",
|
"desc" : "Arch",
|
||||||
"ua" : "Uzbl (Webkit 1.1.10) (Arch Linux)",
|
"ua" : "Uzbl (Webkit 1.1.10) (Arch Linux)",
|
||||||
|
|||||||
@@ -52,5 +52,14 @@
|
|||||||
"name" : "Debian",
|
"name" : "Debian",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Debian",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux sparc64; es-PY; rv:5.0) Gecko/20100101 IceCat/5.0 (like Firefox/5.0; Debian-6.0.1)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Debian",
|
||||||
|
"version" : "6.0.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,5 +7,14 @@
|
|||||||
"name" : "Fuchsia",
|
"name" : "Fuchsia",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Fuchsia",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Mozilla/5.0 (X11; Linux; Fuchsia; GoogleTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Large Screen Safari/537.36 GoogleTV",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Fuchsia",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,5 +7,32 @@
|
|||||||
"name" : "Haiku",
|
"name" : "Haiku",
|
||||||
"version" : "R1"
|
"version" : "R1"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Haiku",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Haiku x86_64; rv:128.0) Gecko/20100101 Firefox/128.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Haiku",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Haiku",
|
||||||
|
"ua" : "Mozilla/5.0 (Haiku; BeOS; rv:99.0) Gecko/20100101 Firefox/99.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Haiku",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Haiku",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Haiku BePC) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.15.17 Chrome/87.0.4280.144 Safari/537.36 Dooble/2023.12.25 Dooble/2023.12.25",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Haiku",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -5,7 +5,52 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "HarmonyOS",
|
"name" : "HarmonyOS",
|
||||||
"version" : "10"
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HarmonyOS 2",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 10; STK-AL00 Build/HUAWEISTK-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/88.0.4324.93 Mobile Safari/537.36 BDOS/1.0 (HarmonyOS 2.2.0) SP-engine/2.72.0 baiduboxapp/13.34.5.10 (Baidu; P1 10) NABar/1.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HarmonyOS",
|
||||||
|
"version" : "2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HarmonyOS 3",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 12; Huawei P60 Pro Build/HarmonyOS 3.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.1.6136.139 Mobile Safari/537.36 OPR/111.11",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HarmonyOS",
|
||||||
|
"version" : "3.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HarmonyOS 4",
|
||||||
|
"ua" : "Mozilla/5.0 (Android 12; HarmonyOS 4.0.0.118; OXF-AN00 Build/HUAWEIOXF-AN00; HMSCore 6.13.0.302; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36 EdgA/125.0.0.0 Language/zh_TW ABI/arm64-v8a",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HarmonyOS",
|
||||||
|
"version" : "4.0.0.118"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HarmonyOS 4",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux; Android 12; HarmonyOS/4.0.3.601; JAD-AL50; HMSCore/6.13.0.320 Build/AP31.240223.016.A3; x64; ARM64) AppleWebKit/537.36 (KHTML, like Gecko) HuaweiBrowser/14.0.7.302 Mobile Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HarmonyOS",
|
||||||
|
"version" : "4.0.3.601"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HarmonyOS 5",
|
||||||
|
"ua" : "Mozilla/5.0 (PC; OpenHarmony 5.0; HarmonyOS 5.0) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/114.0.0.0 Safari/537.36 ArkWeb/4.1.6.1 Browser/harmony360Browser/1.0.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HarmonyOS",
|
||||||
|
"version" : "5.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,4 +1,22 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "iOS 18.6",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.6 Mobile/15E148 Safari/604.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "18.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iOS 26",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "26.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "iOS in App",
|
"desc" : "iOS in App",
|
||||||
"ua" : "AppName/version CFNetwork/version Darwin/version",
|
"ua" : "AppName/version CFNetwork/version Darwin/version",
|
||||||
@@ -17,6 +35,15 @@
|
|||||||
"version" : "5.1.1"
|
"version" : "5.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iOS with DuckDuckGo",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1 Ddg/26.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "18.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "iOS with Opera Mini",
|
"desc" : "iOS with Opera Mini",
|
||||||
"ua" : "Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10",
|
"ua" : "Opera/9.80 (iPhone; Opera Mini/7.1.32694/27.1407; U; en) Presto/2.8.119 Version/11.10",
|
||||||
@@ -35,6 +62,33 @@
|
|||||||
"version" : "13.6.1"
|
"version" : "13.6.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "iOS with Instagram",
|
||||||
|
"ua": "Instagram 5.0.2 (iPhone5,1; iPhone OS 7_0_4; en_US; en) AppleWebKit/420+",
|
||||||
|
"expect":
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "7.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iOS with MS Word App",
|
||||||
|
"ua": "Microsoft Office Word/2.44.1211 (iOS/13.7; Tablet; es-MX; AppStore; Apple/iPad11,3)",
|
||||||
|
"expect":
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "13.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iOS with Quora App",
|
||||||
|
"ua": "Quora 8.4.30 rv:3230 env:prod (iPad11,3; iPadOS 17.7; en_GB) AppleWebKit",
|
||||||
|
"expect":
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "17.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc": "iOS with Slack App",
|
"desc": "iOS with Slack App",
|
||||||
"ua": "com.tinyspeck.chatlyio/23.04.10 (iPhone; iOS 16.4.1; Scale/3.00)",
|
"ua": "com.tinyspeck.chatlyio/23.04.10 (iPhone; iOS 16.4.1; Scale/3.00)",
|
||||||
@@ -44,6 +98,33 @@
|
|||||||
"version" : "16.4.1"
|
"version" : "16.4.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc": "iOS with Snapchat",
|
||||||
|
"ua": "Snapchat/12.12.1.40 (iPhone15,2; iOS 16.2; gzip)",
|
||||||
|
"expect":
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "16.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iOS with Spotify App",
|
||||||
|
"ua": "Spotify/8.7.70 iOS/16.0 (iPhone15,3)",
|
||||||
|
"expect":
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "16.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc": "iOS with TuneIn Radio App",
|
||||||
|
"ua": "TuneIn Radio/27.1.0; iPad6,3; iPadOS/16.6",
|
||||||
|
"expect":
|
||||||
|
{
|
||||||
|
"name" : "iOS",
|
||||||
|
"version" : "16.6"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "iOS BE App",
|
"desc" : "iOS BE App",
|
||||||
"ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
|
"ua" : "APP-BE Test/1.0 (iPad; Apple; CPU iPhone OS 7_0_2 like Mac OS X)",
|
||||||
|
|||||||
11
test/data/ua/os/knoppix.json
Normal file
11
test/data/ua/os/knoppix.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Knoppix",
|
||||||
|
"ua" : "Mozilla/5.0 (Knoppix; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.3",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Knoppix",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -7,5 +7,14 @@
|
|||||||
"name" : "Kubuntu",
|
"name" : "Kubuntu",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Kubuntu",
|
||||||
|
"ua" : "Mozilla/5.0 (Kubuntu; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Kubuntu",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -25,5 +25,104 @@
|
|||||||
"name" : "Mint",
|
"name" : "Mint",
|
||||||
"version" : "6"
|
"version" : "6"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.5) Gecko/2008121622 Linux Mint/6 (Felicia) Firefox/3.0.4",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "6"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Opera/9.80 (X11; Linux i686; Edition Linux Mint) Presto/2.12.388 Version/12.15",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Opera/9.51 (X11; Linux i686; U; Linux Mint; en)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux Mint/19.3 x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Brave Chrome/83.0.4103.97 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "19.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux Mint/20 x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Kiwi Chrome/100.0.0.0 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Linux Mint/20.2; x86_64) Gecko/20100101 Firefox/92.0.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "20.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.9.0.10) Gecko/2009042513 Linux Mint/5 (Elyssa) Firefox/3.0.10",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060308 Linux Mint/7 (Gloria) Firefox/54.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Linux Mint/8 (Helena) Firefox/3.5.3",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:2.0) Gecko/20100101 Linux Mint 16/Petra Firefox/25.0.1.",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "16"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Mint",
|
||||||
|
"ua" : "Mozilla/5.0 (Linux x86_64; Mint 21.3) AppleWebKit/537.36 (KHTML, like Gecko) Brave/128.0.0.0 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Mint",
|
||||||
|
"version" : "21.3"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,5 +7,32 @@
|
|||||||
"name" : "MorphOS",
|
"name" : "MorphOS",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MorphOS",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; PowerPC MorphOS 3.7; Odyssey Web Browser; rv:1.23) AppleWebKit/538.1 (KHTML, like Gecko) OWB/1.23 Safari/538.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MorphOS",
|
||||||
|
"version" : "3.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MorphOS",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; MorphOS ppc64; rv:88.0) Gecko/20100101 Firefox/88.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MorphOS",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "MorphOS",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; Origyn Web Browser; MorphOS; PPC; U) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "MorphOS",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,5 +7,23 @@
|
|||||||
"name" : "OS/2",
|
"name" : "OS/2",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "OS/2",
|
||||||
|
"ua" : "Mozilla/5.0 (OS/2; OS/2 i386) AppleWebKit/538.36 (KHTML, like Gecko) QtWebEngine/5.15.2 Chrome/127.0.6533.72",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "OS/2",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "OS/2",
|
||||||
|
"ua" : "Mozilla/5.0 (OS/2; Warp 4.5; rv:45.0) Gecko/20100101 Firefox/45.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "OS/2",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -5,7 +5,16 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Solaris",
|
"name" : "Solaris",
|
||||||
"version" : "sun4u"
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Solaris",
|
||||||
|
"ua" : "Mozilla/5.0 (Solaris; SPARC; w3m/0.5.3; rv:1.0) Gecko/20100101 w3m/0.5.3",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Solaris",
|
||||||
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -16,5 +25,23 @@
|
|||||||
"name" : "Solaris",
|
"name" : "Solaris",
|
||||||
"version" : "4.1.4"
|
"version" : "4.1.4"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Solaris",
|
||||||
|
"ua" : "Opera/5.0 (SunOS 5.8 sun4m; U) [en]",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Solaris",
|
||||||
|
"version" : "5.8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Solaris",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100215 Solaris/10.1 (GNU) Superswan/3.5.8 (Byte/me)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Solaris",
|
||||||
|
"version" : "10.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -7,5 +7,14 @@
|
|||||||
"name" : "SUSE",
|
"name" : "SUSE",
|
||||||
"version" : "3.6.17-0.2.1"
|
"version" : "3.6.17-0.2.1"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "SUSE",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; SUSE; Linux amd64; rv:86.0) Gecko/20100101 Firefox/86.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "SUSE",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -16,5 +16,32 @@
|
|||||||
"name" : "Ubuntu",
|
"name" : "Ubuntu",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Ubuntu",
|
||||||
|
"ua" : "Mozilla/5.0 (Wayland; Linux x86_64; Huawei) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Ubuntu/23.04 Edg/110.0.1587.41",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Ubuntu",
|
||||||
|
"version" : "23.04"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Ubuntu",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Ubuntu 20.04; Linux arm; rv:99.0) Gecko/20100101 Firefox/99.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Ubuntu",
|
||||||
|
"version" : "20.04"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Ubuntu",
|
||||||
|
"ua" : "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Ubuntu",
|
||||||
|
"version" : "14.10"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"desc" : "WebOS",
|
"desc" : "HP WebOS",
|
||||||
"ua" : "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.5; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0",
|
"ua" : "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.5; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.83 Safari/534.6 TouchPad/1.0",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "WebOS",
|
"desc" : "Palm WebOS",
|
||||||
"ua" : "Mozilla/5.0 (webOS/1.4.5; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.0",
|
"ua" : "Mozilla/5.0 (webOS/1.4.5; U; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Version/1.0 Safari/532.2 Pre/1.0",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
@@ -17,13 +17,58 @@
|
|||||||
"version" : "1.4.5"
|
"version" : "1.4.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WebOS TV 22",
|
||||||
|
"ua" : " Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chr0me/87.0.4280.88 Safari/537.36 LG Browser/8.00.00(LGE; ST50K-LG2200WEB; 04.42.26; 0x00000001; DTV_C22P); webOS.TV-2022; LG NetCast.TV-2013 Compatible (LGE, ST50K-LG2200WEB, wireless)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webOS",
|
||||||
|
"version" : "22"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WebOS TV 22",
|
||||||
|
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 HbbTV/1.6.1 (+DRM; LGE/SILICONPLAYER/Hyundai; 50HYN3205; WEBOS22 04.42.26; W22_K8LP; DTV_C22P;)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webOS",
|
||||||
|
"version" : "22"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WebOS TV 5.0",
|
||||||
|
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chr0me/68.0.3440.106 Safari/537.36 LG Browser/8.00.00(LGE; SWU-6522; 04.50.63; 0x00000001; DTV_C20P); webOS.TV-2020; LG NetCast.TV-2013 Compatible (LGE, SWU-6522, wireless)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webOS",
|
||||||
|
"version" : "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WebOS TV 5.0",
|
||||||
|
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 HbbTV/1.5.1 (+DRM; LGE/WALTON/Hyundai; 50HYN3205; WEBOS5.0 04.50.63; W50_K6LP; DTV_C20P;)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webOS",
|
||||||
|
"version" : "5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "WebOS TV 5.x",
|
"desc" : "WebOS TV 5.x",
|
||||||
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 WebAppManager",
|
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 WebAppManager",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "webOS",
|
"name" : "webOS",
|
||||||
"version" : "TV"
|
"version" : "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WebOS TV 5.x",
|
||||||
|
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chr0me/68.0.3440.106 Safari/537.36 LG Browser/8.00.00(LGE; E65A71B-S; 04.50.63; 0x00000001; DTV_C20P); webOS.TV-2020; LG NetCast.TV-2013 Compatible (LGE, E65A71B-S, wired)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webOS",
|
||||||
|
"version" : "5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -32,7 +77,16 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "webOS",
|
"name" : "webOS",
|
||||||
"version" : "TV"
|
"version" : "4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "WebOS TV 3.5",
|
||||||
|
"ua" : "Mozilla/5.0 (Web0S; Linux/SmartTV) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 HbbTV/1.3.1 ( DRM; LGE; OLED55B7V-T; WEBOS3.5 06.10.60; W3_M16P; ) FVC/2.0 (LGE; WEBOS3.5 ;)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "webOS",
|
||||||
|
"version" : "3.5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -41,7 +95,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "webOS",
|
"name" : "webOS",
|
||||||
"version" : "TV"
|
"version" : "3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -50,7 +104,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "webOS",
|
"name" : "webOS",
|
||||||
"version" : "TV"
|
"version" : "2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -59,7 +113,7 @@
|
|||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "webOS",
|
"name" : "webOS",
|
||||||
"version" : "TV"
|
"version" : "1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
20
test/data/ua/os/windows-ce.json
Normal file
20
test/data/ua/os/windows-ce.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Windows CE",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows CE",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows CE",
|
||||||
|
"ua" : "Mozilla/4.0 (PDA; Windows CE/1.0.1) NetFront/3.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows CE",
|
||||||
|
"version" : "1.0.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -16,5 +16,23 @@
|
|||||||
"name" : "Windows Mobile",
|
"name" : "Windows Mobile",
|
||||||
"version" : "undefined"
|
"version" : "undefined"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Mobile",
|
||||||
|
"ua" : "Opera/9.7 (Windows Mobile; PPC; Opera Mobi/35166; U; en) Presto/2.2.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Mobile",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Mobile 6.1",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) 320x240; VZW; Motorola-Q9c; Windows Mobile 6.1 Standard",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Mobile",
|
||||||
|
"version" : "6.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -9,14 +9,32 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows Phone OS",
|
"desc" : "Windows Phone 6.5",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch2_T3333; Windows Phone 6.5)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Phone",
|
||||||
|
"version" : "6.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Phone 7.0",
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
|
"ua" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro)",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Windows Phone OS",
|
"name" : "Windows Phone",
|
||||||
"version" : "7.0"
|
"version" : "7.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Phone 7.5",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Phone",
|
||||||
|
"version" : "7.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows Phone 8",
|
"desc" : "Windows Phone 8",
|
||||||
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8X by HTC)",
|
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; HTC; Windows Phone 8X by HTC)",
|
||||||
@@ -25,5 +43,14 @@
|
|||||||
"name" : "Windows Phone",
|
"name" : "Windows Phone",
|
||||||
"version" : "8.0"
|
"version" : "8.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Phone 8.1",
|
||||||
|
"ua" : "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 635) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows Phone",
|
||||||
|
"version" : "8.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
20
test/data/ua/os/windows-rt.json
Normal file
20
test/data/ua/os/windows-rt.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Windows RT 8",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows RT",
|
||||||
|
"version" : "8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows RT 8.1",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.3; ARM; Trident/7.0; Touch; rv:11.0) like Gecko",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows RT",
|
||||||
|
"version" : "8.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,4 +1,103 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Windows 3.1",
|
||||||
|
"ua" : "NCSA_Mosaic/2.0 (Windows 3.1)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 3.1",
|
||||||
|
"ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 3.1)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows NT",
|
||||||
|
"ua" : "Mozilla/4.51 [de] (WinNT; I)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "NT"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows NT 3.51",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 4.0; Windows NT)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "NT"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows NT 3.51",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 5.05; Windows NT 3.51)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "NT 3.51"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows NT 4.0",
|
||||||
|
"ua" : "Opera/8.41.(Windows NT 4.0; ts-ZA) Presto/2.9.178 Version/11.00",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "NT 4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows NT 4.0",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; WinNT4.0; de-DE; rv:1.7.5) Gecko/20041108 Firefox/52.7.4",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "NT 4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Netscape on Windows 95",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; Win95; de-DE; rv:0.9.2) Gecko/20010726 Netscape6/6.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "95"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 95",
|
||||||
|
"ua" : "Mozilla/3.0 (Win95)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "95"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 95",
|
||||||
|
"ua" : "Mozilla/3.0 (compatible; Opera/3.0; Windows 95/NT4) 3.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "95"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 95",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0; Windows 95) Opera 6.02 [en]",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "95"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows 95",
|
"desc" : "Windows 95",
|
||||||
"ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)",
|
"ua" : "Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)",
|
||||||
@@ -17,6 +116,24 @@
|
|||||||
"version" : "98"
|
"version" : "98"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Firebird on Windows 98",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007 Firebird/0.7",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "98"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "K-Meleon on Windows 98",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031016 K-Meleon/0.8.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "98"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows ME",
|
"desc" : "Windows ME",
|
||||||
"ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90) Gecko/20020502 CS 2000 7.0/7.0",
|
"ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90) Gecko/20020502 CS 2000 7.0/7.0",
|
||||||
@@ -26,6 +143,51 @@
|
|||||||
"version" : "ME"
|
"version" : "ME"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Opera on Windows ME",
|
||||||
|
"ua" : "Mozilla/4.0 (compatible; MSIE 5.0; Windows ME) Opera 5.12 [de]",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "ME"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Netscape on Windows ME",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; Win 9x 4.90; en-US; rv:1.8.1.8pre) Gecko/20071015 Firefox/2.0.0.7 Navigator/9.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "ME"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Netscape on Windows 2000",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.5) Gecko/20050519 Netscape/8.0.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "2000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Opera on Windows 2000",
|
||||||
|
"ua" : "Opera/6.05 (Windows 2000; U)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "2000"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Opera on Windows 2000",
|
||||||
|
"ua" : "Opera/9.69 (Windows NT 5.01; en-US) Presto/2.8.160 Version/10.00",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "2000"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows 2000",
|
"desc" : "Windows 2000",
|
||||||
"ua" : "Mozilla/3.0 (compatible; MSIE 3.0; Windows NT 5.0)",
|
"ua" : "Mozilla/3.0 (compatible; MSIE 3.0; Windows NT 5.0)",
|
||||||
@@ -44,6 +206,15 @@
|
|||||||
"version" : "XP"
|
"version" : "XP"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows XP",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows XP; U) Opera 6.05 [de]",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "XP"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows Vista",
|
"desc" : "Windows Vista",
|
||||||
"ua" : "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)",
|
"ua" : "Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)",
|
||||||
@@ -53,6 +224,33 @@
|
|||||||
"version" : "Vista"
|
"version" : "Vista"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 7",
|
||||||
|
"ua" : "Microsoft Windows 7",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 7",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Evernote Windows/306387 (pt-PT, DDL); Windows/6.1.0 (Win32); Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 7",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows 7 Enterprise; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6099.71 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows 7",
|
"desc" : "Windows 7",
|
||||||
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
|
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)",
|
||||||
@@ -71,6 +269,15 @@
|
|||||||
"version" : "8"
|
"version" : "8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows 8.1",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:66.0.5) Gecko/20100101 Firefox/66.0.5",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "8.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows 10",
|
"desc" : "Windows 10",
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
|
"ua" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
|
||||||
@@ -80,6 +287,15 @@
|
|||||||
"version" : "10"
|
"version" : "10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Windows Server 2012 R2",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows Server 2012 R2 Standard; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5975.80 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "Server 2012 R2"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "WeChat Desktop for Windows Built-in Browser",
|
"desc" : "WeChat Desktop for Windows Built-in Browser",
|
||||||
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400",
|
"ua" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400",
|
||||||
@@ -99,48 +315,75 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Windows RT",
|
"desc" : "iTunes on Windows Vista",
|
||||||
"ua" : "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "Windows",
|
|
||||||
"version" : "RT"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc" : "Windows CE",
|
|
||||||
"ua" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "Windows",
|
|
||||||
"version" : "CE"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc" : "Windows NT on x86 or aarch64 CPU using Firefox",
|
|
||||||
"ua" : "Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "Windows",
|
|
||||||
"version" : "NT x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc" : "Windows NT on x64 CPU using Firefox",
|
|
||||||
"ua" : "Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0",
|
|
||||||
"expect" :
|
|
||||||
{
|
|
||||||
"name" : "Windows",
|
|
||||||
"version" : "NT x"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"desc" : "iTunes Windows Vista",
|
|
||||||
"ua" : "iTunes/10.7 (Windows; Microsoft Windows Vista Home Premium Edition Service Pack 1 (Build 6001)) AppleWebKit/536.26.9",
|
"ua" : "iTunes/10.7 (Windows; Microsoft Windows Vista Home Premium Edition Service Pack 1 (Build 6001)) AppleWebKit/536.26.9",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "Windows",
|
"name" : "Windows",
|
||||||
"version" : "Vista"
|
"version" : "Vista"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 7",
|
||||||
|
"ua" : "iTunes/10.6.3 (Windows; Microsoft Windows 7 x64 Business Edition Service Pack 1 (Build 7601)) AppleWebKit/534.57.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 8",
|
||||||
|
"ua" : "iTunes/12.1.1 (Windows; Microsoft Windows 8 x64 Business Edition (Build 9200)) AppleWebKit/7600.1017.9000.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "8"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 8.1",
|
||||||
|
"ua" : "iTunes/12.4 (Windows; Microsoft Windows 8.1 x64 Business Edition (Build 9200); x64) AppleWebKit/7601.6016.1000.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "8.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 10",
|
||||||
|
"ua" : "iTunes/12.9.1 (Windows; Microsoft Windows 10 x64 Professional Edition (Build 18362); x64) AppleWebKit/7606.2104.0.21",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 10",
|
||||||
|
"ua" : "iTunes/12.6.3 (Windows; Microsoft Windows 10.0 x64 (Build 17763); x64) AppleWebKit/7604.1038.1006.6",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 10 S",
|
||||||
|
"ua" : "iTunes/12.12 (Windows; Microsoft Windows 10 S x64; x64) AppleWebKit/7613.2007",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "iTunes on Windows 11",
|
||||||
|
"ua" : "iTunes/12.13 (Windows; Microsoft Windows 11 x64; x64) AppleWebKit/7613.2007",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Windows",
|
||||||
|
"version" : "11"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
20
test/data/ua/os/xubuntu.json
Normal file
20
test/data/ua/os/xubuntu.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Xubuntu",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Xubuntu Linux 21.10 x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/537.57 Vivaldi/5.1.2 (Blink)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Xubuntu",
|
||||||
|
"version" : "21.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Xubuntu",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; Xubuntu 14.04.5 LTS) AppleWebKit/537.36 (KHTML, like Gecko) Xubuntu Chrome/66.0.2623.87 Safari/537.36",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Xubuntu",
|
||||||
|
"version" : "14.04.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -7,5 +7,14 @@
|
|||||||
"name" : "Zenwalk",
|
"name" : "Zenwalk",
|
||||||
"version" : "7.3"
|
"version" : "7.3"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Zenwalk",
|
||||||
|
"ua" : "Mozilla/5.0 (X11; U; Linux i686; de; rv:1.9.2.13) Gecko/20101221 IceCat/3.6.13 (like Firefox/3.6.13) (Zenwalk GNU Linux)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Zenwalk",
|
||||||
|
"version" : "undefined"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
37
test/unit/cli/cli.spec.js
Normal file
37
test/unit/cli/cli.spec.js
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
const assert = require('node:assert');
|
||||||
|
const { exec } = require('node:child_process');
|
||||||
|
const fs = require('node:fs');
|
||||||
|
const { UAParser } = require('../../../src/main/ua-parser');
|
||||||
|
const uap = new UAParser();
|
||||||
|
|
||||||
|
const input = [
|
||||||
|
'Opera/9.25 (Windows NT 6.0; U; ru)',
|
||||||
|
'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
|
||||||
|
];
|
||||||
|
const output = input.map(x => uap.setUA(x).getResult());
|
||||||
|
|
||||||
|
describe('npx ua-parser-js <string>', () => {
|
||||||
|
it ('print result to stdout', () => {
|
||||||
|
exec('npx ua-parser-js "TEST"', (err, stdout, stderr) => {
|
||||||
|
assert.deepEqual(JSON.parse(stdout), JSON.parse(JSON.stringify([uap.setUA("TEST").getResult()])));
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('npx ua-parser-js --input-file=<filepath>', () => {
|
||||||
|
it ('load file and print result to stdout', () => {
|
||||||
|
exec('npx ua-parser-js --input-file="../test/unit/cli/input.txt"', (err, stdout, stderr) => {
|
||||||
|
assert.deepEqual(JSON.parse(stdout), JSON.parse(JSON.stringify(output)));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('npx ua-parser-js --input-file=<filepath> --output-file=<filepath>', () => {
|
||||||
|
it ('load file and save result to file', () => {
|
||||||
|
exec('npx ua-parser-js --input-file="../test/unit/cli/input.txt" --output-file="../test/unit/cli/output.json"', (err, stdout, stderr) => {
|
||||||
|
fs.readFile('test/unit/cli/output.json', (err, data) => {
|
||||||
|
assert.deepEqual(JSON.parse(data), JSON.parse(JSON.stringify(output)));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
2
test/unit/cli/input.txt
Normal file
2
test/unit/cli/input.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Opera/9.25 (Windows NT 6.0; U; ru)
|
||||||
|
Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)
|
||||||
32
test/unit/cli/output.json
Normal file
32
test/unit/cli/output.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"ua": "Opera/9.25 (Windows NT 6.0; U; ru)",
|
||||||
|
"browser": {
|
||||||
|
"name": "Opera",
|
||||||
|
"version": "9.25",
|
||||||
|
"major": "9"
|
||||||
|
},
|
||||||
|
"cpu": {},
|
||||||
|
"device": {},
|
||||||
|
"engine": {},
|
||||||
|
"os": {
|
||||||
|
"name": "Windows",
|
||||||
|
"version": "Vista"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ua": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",
|
||||||
|
"browser": {
|
||||||
|
"name": "IE",
|
||||||
|
"version": "5.5",
|
||||||
|
"major": "5"
|
||||||
|
},
|
||||||
|
"cpu": {},
|
||||||
|
"device": {},
|
||||||
|
"engine": {},
|
||||||
|
"os": {
|
||||||
|
"name": "Windows",
|
||||||
|
"version": "NT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { UAParser } from '../../src/main/ua-parser.mjs';
|
import { UAParser } from '../../src/main/ua-parser.mjs';
|
||||||
import { CPU, Device, Engine } from '../../src/enums/ua-parser-enums.mjs';
|
import { CPUArch, DeviceType, EngineName } from '../../src/enums/ua-parser-enums.mjs';
|
||||||
import * as assert from 'assert';
|
import * as assert from 'assert';
|
||||||
|
|
||||||
describe('Returns', () => {
|
describe('Returns', () => {
|
||||||
@@ -19,8 +19,8 @@ describe('Returns', () => {
|
|||||||
describe('Enums', () => {
|
describe('Enums', () => {
|
||||||
it('Can use enum', () => {
|
it('Can use enum', () => {
|
||||||
const { cpu, device, engine } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
|
const { cpu, device, engine } = UAParser('Mozilla/5.0 (X11; U; Linux armv7l; en-GB; rv:1.9.2a1pre) Gecko/20090928 Firefox/3.5 Maemo Browser 1.4.1.22 RX-51 N900');
|
||||||
assert.strictEqual(cpu.is(CPU.ARM), true);
|
assert.strictEqual(cpu.is(CPUArch.ARM), true);
|
||||||
assert.strictEqual(device.is(Device.MOBILE), true);
|
assert.strictEqual(device.is(DeviceType.MOBILE), true);
|
||||||
assert.strictEqual(engine.is(Engine.GECKO), true);
|
assert.strictEqual(engine.is(EngineName.GECKO), true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
const assert = require('assert');
|
|
||||||
const { UAParser } = require('../../src/main/ua-parser');
|
|
||||||
const { getDeviceVendor, isAppleSilicon, isAIBot, isBot, isChromeFamily } = require('../../src/helpers/ua-parser-helpers');
|
|
||||||
const { Bots, Emails } = require('../../src/extensions/ua-parser-extensions');
|
|
||||||
|
|
||||||
describe('getDeviceVendor', () => {
|
|
||||||
it('Can guess the device vendor from a model name', () => {
|
|
||||||
|
|
||||||
const modelSM = 'SM-A605G';
|
|
||||||
const modelRedmi = 'Redmi Note 8';
|
|
||||||
const modelNexus = 'Nexus 6P';
|
|
||||||
const modelAquos = 'AQUOS-TVX19B';
|
|
||||||
|
|
||||||
assert.equal(getDeviceVendor(modelSM), 'Samsung');
|
|
||||||
assert.equal(getDeviceVendor(modelRedmi), 'Xiaomi');
|
|
||||||
assert.equal(getDeviceVendor(modelNexus), 'Huawei');
|
|
||||||
assert.equal(getDeviceVendor(modelAquos), 'Sharp');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('isAppleSilicon', () => {
|
|
||||||
it('Can detect Apple Silicon device', () => {
|
|
||||||
|
|
||||||
// non-real ua
|
|
||||||
const macARM = 'Mozilla/5.0 (Macintosh; ARM; Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0';
|
|
||||||
const macIntel = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0';
|
|
||||||
|
|
||||||
assert.equal(isAppleSilicon(UAParser(macIntel)), false);
|
|
||||||
assert.equal(isAppleSilicon(macIntel), false);
|
|
||||||
assert.equal(isAppleSilicon(UAParser(macARM)), true);
|
|
||||||
assert.equal(isAppleSilicon(macARM), true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('isAIBot', () => {
|
|
||||||
it('Can detect AI Bots', () => {
|
|
||||||
|
|
||||||
const claudeBot = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)';
|
|
||||||
const firefox = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0';
|
|
||||||
const searchGPT = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot';
|
|
||||||
const semrushAI = 'Mozilla/5.0 (compatible; SemrushBot-OCOB/1; +https://www.semrush.com/bot/)';
|
|
||||||
|
|
||||||
assert.equal(isAIBot(UAParser(claudeBot, Bots)), true);
|
|
||||||
assert.equal(isAIBot(claudeBot), true);
|
|
||||||
assert.equal(isAIBot(firefox), false);
|
|
||||||
assert.equal(isAIBot(searchGPT), true);
|
|
||||||
assert.equal(isAIBot(semrushAI), true);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('isBot', () => {
|
|
||||||
it('Can detect Bots', () => {
|
|
||||||
|
|
||||||
// non-real ua
|
|
||||||
const ahrefsBot = 'Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)';
|
|
||||||
const firefox = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0';
|
|
||||||
const scrapy = 'Scrapy/1.5.0 (+https://scrapy.org)';
|
|
||||||
const thunderbird = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
|
|
||||||
|
|
||||||
const botParser = new UAParser(firefox, { Bots, Emails });
|
|
||||||
assert.equal(isBot(botParser.getResult()), false);
|
|
||||||
assert.equal(isBot(botParser.setUA(ahrefsBot).getResult()), true);
|
|
||||||
assert.equal(isBot(botParser.setUA(scrapy).getResult()), true);
|
|
||||||
assert.equal(isBot(botParser.setUA(thunderbird).getResult()), false);
|
|
||||||
|
|
||||||
assert.equal(isBot(ahrefsBot), true);
|
|
||||||
assert.equal(isBot(firefox), false);
|
|
||||||
assert.equal(isBot(scrapy), true);
|
|
||||||
assert.equal(isBot(thunderbird), false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('isChromeFamily', () => {
|
|
||||||
it('Can detect Chromium-based browser', () => {
|
|
||||||
|
|
||||||
const edge = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.2151.58';
|
|
||||||
const firefox = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0';
|
|
||||||
|
|
||||||
assert.equal(isChromeFamily(UAParser(edge)), true);
|
|
||||||
assert.equal(isChromeFamily(UAParser(firefox)), false);
|
|
||||||
assert.equal(isChromeFamily(edge), true);
|
|
||||||
assert.equal(isChromeFamily(firefox), false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -10,7 +10,6 @@ var cpus = require('../data/ua/cpu/cpu-all.json');
|
|||||||
var devices = readJsonFiles('test/data/ua/device');
|
var devices = readJsonFiles('test/data/ua/device');
|
||||||
var engines = require('../data/ua/engine/engine-all.json');
|
var engines = require('../data/ua/engine/engine-all.json');
|
||||||
var os = readJsonFiles('test/data/ua/os');
|
var os = readJsonFiles('test/data/ua/os');
|
||||||
var { Headers } = require('node-fetch');
|
|
||||||
|
|
||||||
function readJsonFiles(dir) {
|
function readJsonFiles(dir) {
|
||||||
var list = [];
|
var list = [];
|
||||||
@@ -91,6 +90,34 @@ describe('Returns', function () {
|
|||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('works even when Array.prototype has been mangled', function(done) {
|
||||||
|
const result = withMangledArrayProto(() => new UAParser('').getResult());
|
||||||
|
|
||||||
|
function withMangledArrayProto(fn, key = 'isEmpty', value = function() { return this.length === 0; }) {
|
||||||
|
const originalValue = Array.prototype[key];
|
||||||
|
const restore = Object.hasOwnProperty.call(Array.prototype, key)
|
||||||
|
? () => Array.prototype[key] = originalValue
|
||||||
|
: () => delete Array.prototype[key];
|
||||||
|
|
||||||
|
Array.prototype[key] = value;
|
||||||
|
const result = fn();
|
||||||
|
restore();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.deepEqual(result,
|
||||||
|
{
|
||||||
|
ua : '',
|
||||||
|
browser: { name: undefined, version: undefined, major: undefined, type: undefined },
|
||||||
|
cpu: { architecture: undefined },
|
||||||
|
device: { vendor: undefined, model: undefined, type: undefined },
|
||||||
|
engine: { name: undefined, version: undefined},
|
||||||
|
os: { name: undefined, version: undefined }
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Extending Regex', function () {
|
describe('Extending Regex', function () {
|
||||||
@@ -135,6 +162,14 @@ describe('Extending Regex', function () {
|
|||||||
assert.deepEqual(myParser3.setUA(myUA2).getDevice(), {vendor: "MyTab", model: "14 Pro Max", type: "tablet"});
|
assert.deepEqual(myParser3.setUA(myUA2).getDevice(), {vendor: "MyTab", model: "14 Pro Max", type: "tablet"});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('User-agent with trailing space', function () {
|
||||||
|
it ('trailing space will be trimmed', function () {
|
||||||
|
const uastring = ' Opera/9.21 (Windows NT 5.1; U; ru) ';
|
||||||
|
const { ua } = UAParser(uastring);
|
||||||
|
assert.equal(ua, 'Opera/9.21 (Windows NT 5.1; U; ru) ');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('User-agent length', function () {
|
describe('User-agent length', function () {
|
||||||
var UA_MAX_LENGTH = 500;
|
var UA_MAX_LENGTH = 500;
|
||||||
|
|
||||||
@@ -347,10 +382,27 @@ describe('Read user-agent data from req.headers', function () {
|
|||||||
assert.strictEqual(engine.name, "EdgeHTML");
|
assert.strictEqual(engine.name, "EdgeHTML");
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Fetch API\'s Header can be passed directly into headers', () => {
|
// Headers supported in node 18+ - https://developer.mozilla.org/en-US/docs/Web/API/Headers
|
||||||
const reqHeaders = new Headers();
|
if (typeof Headers !== 'undefined') {
|
||||||
reqHeaders.append('User-Agent', 'Midori/0.2.2 (X11; Linux i686; U; en-us) WebKit/531.2+');
|
it('Fetch API\'s Header can be passed directly into headers', () => {
|
||||||
const { browser } = UAParser(reqHeaders);
|
const reqHeaders = new Headers();
|
||||||
assert.strictEqual(browser.is('Midori'), true);
|
reqHeaders.append('User-Agent', 'Midori/0.2.2 (X11; Linux i686; U; en-us) WebKit/531.2+');
|
||||||
|
const { browser } = UAParser(reqHeaders);
|
||||||
|
assert.strictEqual(browser.is('Midori'), true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
it('Headers field name should be case insensitive', function () {
|
||||||
|
const hEaDeRs = {
|
||||||
|
'uSeR-aGenT' : 'Midori/0.2.2 (X11; Linux i686; U; en-us) WebKit/531.2+'
|
||||||
|
};
|
||||||
|
const { browser } = UAParser(hEaDeRs);
|
||||||
|
assert.strictEqual(browser.toString(), "Midori 0.2.2");
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
it('Empty headers should not raise any error', function () {
|
||||||
|
const emptyHeaders = {};
|
||||||
|
const { browser } = UAParser(emptyHeaders);
|
||||||
|
assert.strictEqual(browser.toString(), "undefined");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
42
test/unit/submodules/bot-detection.spec.js
Normal file
42
test/unit/submodules/bot-detection.spec.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
const assert = require('assert');
|
||||||
|
const { UAParser } = require('../../../src/main/ua-parser');
|
||||||
|
const { isAICrawler, isBot } = require('../../../src/bot-detection/bot-detection');
|
||||||
|
const { Bots, Emails } = require('../../../src/extensions/ua-parser-extensions');
|
||||||
|
|
||||||
|
describe('isAICrawler()', () => {
|
||||||
|
it('Can detect AI Crawlers', () => {
|
||||||
|
|
||||||
|
// AI Crawlers
|
||||||
|
const claudeBot = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)';
|
||||||
|
const searchGPT = 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; OAI-SearchBot/1.0; +https://openai.com/searchbot';
|
||||||
|
const semrushAI = 'Mozilla/5.0 (compatible; SemrushBot-OCOB/1; +https://www.semrush.com/bot/)';
|
||||||
|
|
||||||
|
assert.equal(isAICrawler(claudeBot), true);
|
||||||
|
assert.equal(isAICrawler(searchGPT), true);
|
||||||
|
assert.equal(isAICrawler(semrushAI), true);
|
||||||
|
|
||||||
|
// Non-AI Crawlers
|
||||||
|
const firefox = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0';
|
||||||
|
|
||||||
|
assert.equal(isAICrawler(firefox), false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('isBot()', () => {
|
||||||
|
it('Can detect general Bots', () => {
|
||||||
|
|
||||||
|
// Bots
|
||||||
|
const ahrefsBot = 'Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)';
|
||||||
|
const scrapy = 'Scrapy/1.5.0 (+https://scrapy.org)';
|
||||||
|
|
||||||
|
assert.equal(isBot(ahrefsBot), true);
|
||||||
|
assert.equal(isBot(scrapy), true);
|
||||||
|
|
||||||
|
// Non-bots
|
||||||
|
const firefox = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0';
|
||||||
|
const thunderbird = 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0';
|
||||||
|
|
||||||
|
assert.equal(isBot(firefox), false);
|
||||||
|
assert.equal(isBot(thunderbird), false);
|
||||||
|
});
|
||||||
|
});
|
||||||
16
test/unit/submodules/browser-detection.spec.js
Normal file
16
test/unit/submodules/browser-detection.spec.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
const assert = require('assert');
|
||||||
|
const { UAParser } = require('../../../src/main/ua-parser');
|
||||||
|
const { isChromeFamily } = require('../../../src/browser-detection/browser-detection');
|
||||||
|
|
||||||
|
describe('isChromeFamily()', () => {
|
||||||
|
it('Can detect Chromium-based browser', () => {
|
||||||
|
|
||||||
|
const edge = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.2151.58';
|
||||||
|
const firefox = 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0';
|
||||||
|
|
||||||
|
assert.equal(isChromeFamily(UAParser(edge)), true);
|
||||||
|
assert.equal(isChromeFamily(edge), true);
|
||||||
|
assert.equal(isChromeFamily(UAParser(firefox)), false);
|
||||||
|
assert.equal(isChromeFamily(firefox), false);
|
||||||
|
});
|
||||||
|
});
|
||||||
32
test/unit/submodules/device-detection.spec.js
Normal file
32
test/unit/submodules/device-detection.spec.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
const assert = require('assert');
|
||||||
|
const { UAParser } = require('../../../src/main/ua-parser');
|
||||||
|
const { getDeviceVendor, isAppleSilicon } = require('../../../src/device-detection/device-detection');
|
||||||
|
const { DeviceVendor } = require('../../../src/enums/ua-parser-enums');
|
||||||
|
|
||||||
|
describe('getDeviceVendor()', () => {
|
||||||
|
it('Can guess the device vendor from a model name', () => {
|
||||||
|
|
||||||
|
const sm = 'SM-A605G';
|
||||||
|
const redmi = 'Redmi Note 8';
|
||||||
|
const nexus = 'Nexus 6P';
|
||||||
|
const aquos = 'AQUOS-TVX19B';
|
||||||
|
|
||||||
|
assert.equal(getDeviceVendor(sm), DeviceVendor.SAMSUNG);
|
||||||
|
assert.equal(getDeviceVendor(redmi), DeviceVendor.XIAOMI);
|
||||||
|
assert.equal(getDeviceVendor(nexus), DeviceVendor.HUAWEI);
|
||||||
|
assert.equal(getDeviceVendor(aquos), DeviceVendor.SHARP);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('isAppleSilicon()', () => {
|
||||||
|
it('Can detect Apple Silicon device', () => {
|
||||||
|
|
||||||
|
const macARM = 'Mozilla/5.0 (Macintosh; ARM; Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0';
|
||||||
|
const macIntel = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:97.0) Gecko/20100101 Firefox/97.0';
|
||||||
|
|
||||||
|
assert.equal(isAppleSilicon(UAParser(macIntel)), false);
|
||||||
|
assert.equal(isAppleSilicon(macIntel), false);
|
||||||
|
assert.equal(isAppleSilicon(UAParser(macARM)), true);
|
||||||
|
assert.equal(isAppleSilicon(macARM), true);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -3,8 +3,10 @@ const assert = require('assert');
|
|||||||
const parseJS = require('@babel/parser').parse;
|
const parseJS = require('@babel/parser').parse;
|
||||||
const traverse = require('@babel/traverse').default;
|
const traverse = require('@babel/traverse').default;
|
||||||
const safe = require('safe-regex');
|
const safe = require('safe-regex');
|
||||||
const { UAParser } = require('../../src/main/ua-parser');
|
const { UAParser } = require('../../../src/main/ua-parser');
|
||||||
const { Bots, CLIs, Crawlers, Emails, Fetchers, InApps, Libraries, Vehicles } = require('../../src/extensions/ua-parser-extensions');
|
const { Bots, CLIs, Crawlers, Emails, Fetchers, InApps, Libraries, Vehicles } = require('../../../src/extensions/ua-parser-extensions');
|
||||||
|
const { BrowserType, OSName, Extension } = require('../../../src/enums/ua-parser-enums');
|
||||||
|
const { CLI, Crawler, Email, Fetcher, Library } = Extension.BrowserName;
|
||||||
|
|
||||||
describe('Extensions', () => {
|
describe('Extensions', () => {
|
||||||
[
|
[
|
||||||
@@ -17,7 +19,7 @@ describe('Extensions', () => {
|
|||||||
['Vehicles', 'vehicle', Vehicles]
|
['Vehicles', 'vehicle', Vehicles]
|
||||||
]
|
]
|
||||||
.forEach(([desc, path, ext]) => {
|
.forEach(([desc, path, ext]) => {
|
||||||
const tests = require(`../data/ua/extension/${path}.json`);
|
const tests = require(`../../data/ua/extension/${path}.json`);
|
||||||
describe(desc, () => {
|
describe(desc, () => {
|
||||||
tests.forEach((test) => {
|
tests.forEach((test) => {
|
||||||
it(`Can detect ${test.desc}: "${test.ua}"`, () => {
|
it(`Can detect ${test.desc}: "${test.ua}"`, () => {
|
||||||
@@ -42,29 +44,29 @@ describe('Extensions', () => {
|
|||||||
const jsdom = 'Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/20.0.3';
|
const jsdom = 'Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/20.0.3';
|
||||||
const scrapy = 'Scrapy/1.5.0 (+https://scrapy.org)';
|
const scrapy = 'Scrapy/1.5.0 (+https://scrapy.org)';
|
||||||
|
|
||||||
assert.equal(UAParser(scrapy, Bots).browser.name, 'Scrapy');
|
assert.equal(UAParser(scrapy, Bots).browser.name, Library.SCRAPY);
|
||||||
|
|
||||||
const emailParser = new UAParser(Emails);
|
const emailParser = new UAParser(Emails);
|
||||||
assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: "Microsoft Outlook", version: "16.0.9126", major: "16", type: "email"});
|
assert.deepEqual(emailParser.setUA(outlook).getBrowser(), {name: Email.MICROSOFT_OUTLOOK, version: "16.0.9126", major: "16", type: BrowserType.EMAIL});
|
||||||
assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: "Thunderbird", version: "78.13.0", major: "78", type: "email"});
|
assert.deepEqual(emailParser.setUA(thunderbird).getBrowser(), {name: Email.THUNDERBIRD, version: "78.13.0", major: "78", type: BrowserType.EMAIL});
|
||||||
|
|
||||||
const libraryParser = new UAParser(Libraries);
|
const libraryParser = new UAParser(Libraries);
|
||||||
assert.deepEqual(libraryParser.setUA(axios).getBrowser(), {name: "axios", version: "1.3.5", major: "1", type: "library"});
|
assert.deepEqual(libraryParser.setUA(axios).getBrowser(), {name: Library.AXIOS, version: "1.3.5", major: "1", type: BrowserType.LIBRARY});
|
||||||
assert.deepEqual(libraryParser.setUA(jsdom).getBrowser(), {name: "jsdom", version: "20.0.3", major: "20", type: "library"});
|
assert.deepEqual(libraryParser.setUA(jsdom).getBrowser(), {name: Library.JSDOM, version: "20.0.3", major: "20", type: BrowserType.LIBRARY});
|
||||||
assert.deepEqual(libraryParser.setUA(scrapy).getBrowser(), {name: "Scrapy", version: "1.5.0", major: "1", type: "library"});
|
assert.deepEqual(libraryParser.setUA(scrapy).getBrowser(), {name: Library.SCRAPY, version: "1.5.0", major: "1", type: BrowserType.LIBRARY});
|
||||||
|
|
||||||
// Bluesky
|
// Bluesky
|
||||||
const bluesky = 'Mozilla/5.0 (compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app)';
|
const bluesky = 'Mozilla/5.0 (compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app)';
|
||||||
assert.deepEqual(new UAParser(bluesky, Bots).getBrowser(), {
|
assert.deepEqual(new UAParser(bluesky, Bots).getBrowser(), {
|
||||||
name: 'Bluesky',
|
name: Fetcher.BLUESKY,
|
||||||
version: '1.1',
|
version: '1.1',
|
||||||
major: '1',
|
major: '1',
|
||||||
type: 'fetcher'
|
type: BrowserType.FETCHER
|
||||||
});
|
});
|
||||||
|
|
||||||
const whatsapp = "WhatsApp/2.0 A";
|
const whatsapp = "WhatsApp/2.0 A";
|
||||||
assert.deepEqual(new UAParser(whatsapp, Fetchers).getOS(), {
|
assert.deepEqual(new UAParser(whatsapp, Fetchers).getOS(), {
|
||||||
name : 'Android',
|
name : OSName.ANDROID,
|
||||||
version : undefined
|
version : undefined
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -77,14 +79,14 @@ describe('Merge', () => {
|
|||||||
// try merging crawlers & CLIs
|
// try merging crawlers & CLIs
|
||||||
const crawlersAndCLIs = { browser : [...Crawlers.browser, ...CLIs.browser]};
|
const crawlersAndCLIs = { browser : [...Crawlers.browser, ...CLIs.browser]};
|
||||||
const crawlersAndCLIsParser = new UAParser(crawlersAndCLIs);
|
const crawlersAndCLIsParser = new UAParser(crawlersAndCLIs);
|
||||||
assert.deepEqual(crawlersAndCLIsParser.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"});
|
assert.deepEqual(crawlersAndCLIsParser.setUA(wget).getBrowser(), {name: CLI.WGET, version: "1.21.1", major: "1", type: BrowserType.CLI});
|
||||||
assert.deepEqual(crawlersAndCLIsParser.setUA(facebookBot).getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"crawler"});
|
assert.deepEqual(crawlersAndCLIsParser.setUA(facebookBot).getBrowser(), {name: Crawler.META_FACEBOOKBOT, version: "1.0", major: "1", type: BrowserType.CRAWLER});
|
||||||
|
|
||||||
// alternative merge options
|
// alternative merge options
|
||||||
const crawlersAndCLIsParser2 = new UAParser([Crawlers, CLIs]);
|
const crawlersAndCLIsParser2 = new UAParser([Crawlers, CLIs]);
|
||||||
const crawlersAndCLIsParser3 = new UAParser(facebookBot, [Crawlers, CLIs]);
|
const crawlersAndCLIsParser3 = new UAParser(facebookBot, [Crawlers, CLIs]);
|
||||||
assert.deepEqual(crawlersAndCLIsParser2.setUA(wget).getBrowser(), {name: "Wget", version: "1.21.1", major: "1", type:"cli"});
|
assert.deepEqual(crawlersAndCLIsParser2.setUA(wget).getBrowser(), {name: CLI.WGET, version: "1.21.1", major: "1", type: BrowserType.CLI});
|
||||||
assert.deepEqual(crawlersAndCLIsParser3.getBrowser(), {name: "FacebookBot", version: "1.0", major: "1", type:"crawler"});
|
assert.deepEqual(crawlersAndCLIsParser3.getBrowser(), {name: Crawler.META_FACEBOOKBOT, version: "1.0", major: "1", type: BrowserType.CRAWLER});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
13
test/unit/submodules/helpers.spec.js
Normal file
13
test/unit/submodules/helpers.spec.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
const assert = require('assert');
|
||||||
|
const { isFrozenUA } = require('../../../src/helpers/ua-parser-helpers');
|
||||||
|
|
||||||
|
describe('isFrozenUA()', () => {
|
||||||
|
it('matches supplied user-agent string with known frozen user-agent pattern', () => {
|
||||||
|
|
||||||
|
const regularMobileUA = "Mozilla/5.0 (Linux; Android 9; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.1234.56 Mobile Safari/537.36";
|
||||||
|
const frozenMobileUA = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36";
|
||||||
|
|
||||||
|
assert.equal(isFrozenUA(regularMobileUA), false);
|
||||||
|
assert.equal(isFrozenUA(frozenMobileUA), true);
|
||||||
|
});
|
||||||
|
});
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user