mirror of
https://github.com/faisalman/ua-parser-js.git
synced 2025-09-28 00:18:45 +03:00
Merge tag 'tags/2.0.0' into pro-personal
This commit is contained in:
commit
db06606acd
14
CHANGELOG.md
14
CHANGELOG.md
@ -55,7 +55,8 @@
|
|||||||
- **`'ua-parser-js/helpers'`**: Provides utility methods to extend detection functionality:
|
- **`'ua-parser-js/helpers'`**: Provides utility methods to extend detection functionality:
|
||||||
- `getDeviceVendor()`: Guesses the device vendor based on its model name
|
- `getDeviceVendor()`: Guesses the device vendor based on its model name
|
||||||
- `isAppleSilicon()`: Detects Apple Silicon device properties
|
- `isAppleSilicon()`: Detects Apple Silicon device properties
|
||||||
- `isBot()`: Checks if the browser is a bot
|
- `isAIBot()`: Checks if the user-agent is an AI bot
|
||||||
|
- `isBot()`: Checks if the user-agent is a bot
|
||||||
- `isChromeFamily()`: Checks if the browser is Chrome-based (uses Blink engine) — e.g., New Opera, New Edge, Vivaldi, Brave, Arc, etc.
|
- `isChromeFamily()`: Checks if the browser is Chrome-based (uses Blink engine) — e.g., New Opera, New Edge, Vivaldi, Brave, Arc, etc.
|
||||||
- `isElectron()`: Detects if current window is running within Electron
|
- `isElectron()`: Detects if current window is running within Electron
|
||||||
- `isFromEU()`: Detects if current browser's timezone is from an EU country
|
- `isFromEU()`: Detects if current browser's timezone is from an EU country
|
||||||
@ -64,6 +65,17 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Version 2.0.0
|
||||||
|
|
||||||
|
- `ua-parser-js/extensions` submodule:
|
||||||
|
- Add new CLI: ELinks, HTTPie
|
||||||
|
- Add new crawler: AI2Bot, aiHitBot, anthropic-ai, Diffbot, ImagesiftBot, magpie-crawler, Omgilibot, Screaming Frog SEO Spider, Seznambot, Teoma, Timpibot, VelenPublicWebCrawler, Webzio-Extended, YouBot
|
||||||
|
- Add new email: Airmail, BlueMail, eMClient, NaverMailApp, Sparrow, Yahoo
|
||||||
|
- Add new fetcher: cohere-ai, Vercelbot
|
||||||
|
- Add new library: java, python-urllib, python-requests
|
||||||
|
- `ua-parser-js/helpers` submodule:
|
||||||
|
- Add new method `isAIBot()`: Checks if the user-agent is an AI bot
|
||||||
|
|
||||||
## Version 2.0.0-rc.3
|
## Version 2.0.0-rc.3
|
||||||
|
|
||||||
- Add support for Headers object
|
- Add support for Headers object
|
||||||
|
18
README.md
18
README.md
@ -1,10 +1,12 @@
|
|||||||
<p align="center">
|
# UAParser.js PRO Personal License
|
||||||
<a href="https://uaparser.dev"><img src="https://raw.githubusercontent.com/faisalman/ua-parser-js/gh-pages/images/uap-header.png"></a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
# UAParser.js
|
Thank you for choosing the UAParser.js PRO Personal License.
|
||||||
|
|
||||||
Thank you for purchasing UAParser.js PRO Personal License, if you haven't please oreder here: https://store.faisalman.com
|
Please be aware that using this package without a valid license purchase is strictly prohibited and constitutes a violation of applicable copyright laws.
|
||||||
|
|
||||||
|
An exception applies if the package is used solely as a part of a product developed by a valid license holder, in accordance with their license terms.
|
||||||
|
|
||||||
|
If you have not yet purchased a license, you may do so at https://store.faisalman.com.
|
||||||
|
|
||||||
# Download
|
# Download
|
||||||
|
|
||||||
@ -16,8 +18,12 @@ npm install @ua-parser-js/pro-personal
|
|||||||
|
|
||||||
https://docs.uaparser.dev
|
https://docs.uaparser.dev
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { UAParser } from '@ua-parser-js/pro-personal';
|
||||||
|
```
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
UAParser.js PRO Personal
|
UAParser.js PRO Personal
|
||||||
|
|
||||||
Copyright (c) 2012-2024 Faisal Salman <<f@faisalman.com>>
|
Copyright (c) 2023-2024 Faisal Salman <<f@faisalman.com>>
|
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.pack.js
vendored
4
dist/ua-parser.pack.js
vendored
File diff suppressed because one or more lines are too long
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@ua-parser-js/pro-personal",
|
"name": "@ua-parser-js/pro-personal",
|
||||||
"version": "2.0.0-rc.3",
|
"version": "2.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@ua-parser-js/pro-personal",
|
"name": "@ua-parser-js/pro-personal",
|
||||||
"version": "2.0.0-rc.3",
|
"version": "2.0.0",
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"title": "UAParser.js PRO Personal",
|
"title": "UAParser.js PRO Personal",
|
||||||
"name": "@ua-parser-js/pro-personal",
|
"name": "@ua-parser-js/pro-personal",
|
||||||
"version": "2.0.0-rc.3",
|
"version": "2.0.0",
|
||||||
"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": [
|
||||||
@ -180,7 +180,8 @@
|
|||||||
},
|
},
|
||||||
"./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",
|
||||||
|
"types": "./src/enums/ua-parser-enums.d.ts"
|
||||||
},
|
},
|
||||||
"./extensions": {
|
"./extensions": {
|
||||||
"require": "./src/extensions/ua-parser-extensions.js",
|
"require": "./src/extensions/ua-parser-extensions.js",
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Enums for UAParser.js v2.0.0-rc.3
|
/* Enums for UAParser.js v2.0.0
|
||||||
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>
|
||||||
UAParser.js PRO Personal License */
|
UAParser.js PRO Personal License */
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// Source: /src/enums/ua-parser-enums.js
|
// Source: /src/enums/ua-parser-enums.js
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Enums for UAParser.js v2.0.0-rc.3
|
/* Enums for UAParser.js v2.0.0
|
||||||
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>
|
||||||
UAParser.js PRO Personal License */
|
UAParser.js PRO Personal License */
|
||||||
|
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.0-rc.3
|
// Type definitions for Helpers submodule of UAParser.js v2.0.0
|
||||||
// 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.0-rc.3
|
/* Extensions for UAParser.js v2.0.0
|
||||||
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>
|
||||||
UAParser.js PRO Personal License */
|
UAParser.js PRO Personal License */
|
||||||
@ -28,8 +28,8 @@ const LIBRARY = 'library';
|
|||||||
|
|
||||||
const CLIs = Object.freeze({
|
const CLIs = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
// wget / curl / lynx
|
// wget / curl / Lynx / ELinks / HTTPie
|
||||||
[/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -42,7 +42,6 @@ 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
|
||||||
// Applebot - http://apple.com/go/applebot
|
|
||||||
// Bingbot - http://www.bing.com/bingbot.htm
|
// Bingbot - http://www.bing.com/bingbot.htm
|
||||||
// CCBot - https://commoncrawl.org/faq
|
// CCBot - https://commoncrawl.org/faq
|
||||||
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
||||||
@ -54,13 +53,17 @@ const Crawlers = Object.freeze({
|
|||||||
// 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
|
||||||
// SemrushBot - http://www.semrush.com/bot.html
|
// SemrushBot - http://www.semrush.com/bot.html
|
||||||
/((?:ahrefs|amazon|apple|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush)bot)\/([\w\.]+)/i,
|
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
||||||
|
/((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
|
||||||
|
|
||||||
|
// Applebot - http://apple.com/go/applebot
|
||||||
|
/(applebot(?:-extended)?)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
||||||
/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
|
/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
|
||||||
|
|
||||||
// ClaudeBot (Anthropic)
|
// ClaudeBot (Anthropic)
|
||||||
/(claude(?:bot|-web))\/([\w\.]+)/i,
|
/(claude(?:bot|-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,
|
||||||
@ -87,8 +90,8 @@ const Crawlers = Object.freeze({
|
|||||||
// Yeti (Naver)
|
// Yeti (Naver)
|
||||||
/(yeti)\/([\w\.]+)/i,
|
/(yeti)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// YisouSpider
|
// aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
|
||||||
/(yisouspider)\/?([\w\.]*)/i
|
/((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
|
||||||
],
|
],
|
||||||
|
|
||||||
[NAME, VERSION, [TYPE, CRAWLER]],
|
[NAME, VERSION, [TYPE, CRAWLER]],
|
||||||
@ -97,13 +100,15 @@ const Crawlers = Object.freeze({
|
|||||||
// 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
|
||||||
// Bytespider
|
// 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
|
||||||
// Qihoo 360Spider
|
// Qihoo 360Spider
|
||||||
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
||||||
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
||||||
/(360spider-?(?:image|video)?|bytespider|(?:aspiegel|dataforseo|petal|turnitin)bot|(?=yahoo! )slurp)/i
|
/\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
|
||||||
],
|
],
|
||||||
[NAME, [TYPE, CRAWLER]]
|
[NAME, [TYPE, CRAWLER]]
|
||||||
]
|
]
|
||||||
@ -195,8 +200,10 @@ const ExtraDevices = Object.freeze({
|
|||||||
|
|
||||||
const Emails = Object.freeze({
|
const Emails = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
|
[
|
||||||
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
||||||
[/(evolution|kmail2?|kontact|(?:microsoft |mac)outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
|
/(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
|
||||||
|
], [NAME, VERSION, [TYPE, EMAIL]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -234,8 +241,8 @@ const Fetchers = Object.freeze({
|
|||||||
],
|
],
|
||||||
[NAME, VERSION, [TYPE, FETCHER]],
|
[NAME, VERSION, [TYPE, FETCHER]],
|
||||||
|
|
||||||
// Google Bots / Snapchat
|
// Google Bots / Cohere / Snapchat / Vercelbot
|
||||||
[/(feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
|
[/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
|
||||||
[NAME, [TYPE, FETCHER]],
|
[NAME, [TYPE, FETCHER]],
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
@ -293,8 +300,6 @@ const MediaPlayers = Object.freeze({
|
|||||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||||
|
|
||||||
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
||||||
/(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
|
|
||||||
// Java/urllib/requests/wget/cURL
|
|
||||||
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
||||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||||
|
|
||||||
@ -370,8 +375,8 @@ const MediaPlayers = Object.freeze({
|
|||||||
|
|
||||||
const Libraries = Object.freeze({
|
const Libraries = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
// Axios/jsdom/Scrapy
|
// Axios/jsdom/Scrapy/Java/urllib/requests
|
||||||
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
|
[/\b(axios|jsdom|scrapy|java|python-urllib|python-requests)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// Source: /src/extensions/ua-parser-extensions.js
|
// Source: /src/extensions/ua-parser-extensions.js
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Extensions for UAParser.js v2.0.0-rc.3
|
/* Extensions for UAParser.js v2.0.0
|
||||||
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>
|
||||||
UAParser.js PRO Personal License */
|
UAParser.js PRO Personal License */
|
||||||
@ -32,8 +32,8 @@ const LIBRARY = 'library';
|
|||||||
|
|
||||||
const CLIs = Object.freeze({
|
const CLIs = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
// wget / curl / lynx
|
// wget / curl / Lynx / ELinks / HTTPie
|
||||||
[/(wget|curl|lynx)[\/ ]([\w\.]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i], [NAME, VERSION, [TYPE, CLI]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -46,7 +46,6 @@ 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
|
||||||
// Applebot - http://apple.com/go/applebot
|
|
||||||
// Bingbot - http://www.bing.com/bingbot.htm
|
// Bingbot - http://www.bing.com/bingbot.htm
|
||||||
// CCBot - https://commoncrawl.org/faq
|
// CCBot - https://commoncrawl.org/faq
|
||||||
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
||||||
@ -58,13 +57,17 @@ const Crawlers = Object.freeze({
|
|||||||
// 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
|
||||||
// SemrushBot - http://www.semrush.com/bot.html
|
// SemrushBot - http://www.semrush.com/bot.html
|
||||||
/((?:ahrefs|amazon|apple|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush)bot)\/([\w\.]+)/i,
|
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
||||||
|
/((?:ahrefs|amazon|bing|cc|dot|duckduck|exa|facebook|gpt|mj12|mojeek|oai-search|perplexity|semrush|seznam)bot)\/([\w\.-]+)/i,
|
||||||
|
|
||||||
|
// Applebot - http://apple.com/go/applebot
|
||||||
|
/(applebot(?:-extended)?)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
||||||
/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
|
/(baiduspider)[-imagevdonsfcpr]{0,6}\/([\w\.]+)/i,
|
||||||
|
|
||||||
// ClaudeBot (Anthropic)
|
// ClaudeBot (Anthropic)
|
||||||
/(claude(?:bot|-web))\/([\w\.]+)/i,
|
/(claude(?:bot|-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,
|
||||||
@ -91,8 +94,8 @@ const Crawlers = Object.freeze({
|
|||||||
// Yeti (Naver)
|
// Yeti (Naver)
|
||||||
/(yeti)\/([\w\.]+)/i,
|
/(yeti)\/([\w\.]+)/i,
|
||||||
|
|
||||||
// YisouSpider
|
// aiHitBot / Diffbot / Magpie-Crawler / Omgilibot / Webzio-Extended / Screaming Frog SEO Spider / Timpibot / VelenPublicWebCrawler / YisouSpider / YouBot
|
||||||
/(yisouspider)\/?([\w\.]*)/i
|
/((?:aihit|diff|timpi|you)bot|omgili(?:bot)?|(?:magpie-|velenpublicweb)crawler|webzio-extended|(?:screaming frog seo |yisou)spider)\/?([\w\.]*)/i
|
||||||
],
|
],
|
||||||
|
|
||||||
[NAME, VERSION, [TYPE, CRAWLER]],
|
[NAME, VERSION, [TYPE, CRAWLER]],
|
||||||
@ -101,13 +104,15 @@ const Crawlers = Object.freeze({
|
|||||||
// 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
|
||||||
// Bytespider
|
// 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
|
||||||
// Qihoo 360Spider
|
// Qihoo 360Spider
|
||||||
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
||||||
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
||||||
/(360spider-?(?:image|video)?|bytespider|(?:aspiegel|dataforseo|petal|turnitin)bot|(?=yahoo! )slurp)/i
|
/\b(360spider-?(?:image|video)?|bytespider|(?:ai2|aspiegel|dataforseo|imagesift|petal|turnitin)bot|teoma|(?=yahoo! )slurp)/i
|
||||||
],
|
],
|
||||||
[NAME, [TYPE, CRAWLER]]
|
[NAME, [TYPE, CRAWLER]]
|
||||||
]
|
]
|
||||||
@ -199,8 +204,10 @@ const ExtraDevices = Object.freeze({
|
|||||||
|
|
||||||
const Emails = Object.freeze({
|
const Emails = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
|
[
|
||||||
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
// Evolution / Kontact/KMail / [Microsoft/Mac] Outlook / Thunderbird
|
||||||
[/(evolution|kmail2?|kontact|(?:microsoft |mac)outlook|thunderbird)[\s\/]([\w\.]+)/i], [NAME, VERSION, [TYPE, EMAIL]]
|
/(airmail|bluemail|emclient|evolution|foxmail|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|thunderbird|yahoo)(?:m.+ail; |[\/ ])([\w\.]+)/i
|
||||||
|
], [NAME, VERSION, [TYPE, EMAIL]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -238,8 +245,8 @@ const Fetchers = Object.freeze({
|
|||||||
],
|
],
|
||||||
[NAME, VERSION, [TYPE, FETCHER]],
|
[NAME, VERSION, [TYPE, FETCHER]],
|
||||||
|
|
||||||
// Google Bots / Snapchat
|
// Google Bots / Cohere / Snapchat / Vercelbot
|
||||||
[/(feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
|
[/(cohere-ai|vercelbot|feedfetcher-google|google(?:-read-aloud|producer)|(?=bot; )snapchat)/i],
|
||||||
[NAME, [TYPE, FETCHER]],
|
[NAME, [TYPE, FETCHER]],
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
@ -297,8 +304,6 @@ const MediaPlayers = Object.freeze({
|
|||||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||||
|
|
||||||
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
/(htc streaming player)\s[\w_]+\s\/\s([\d\.]+)/i, // HTC Streaming Player
|
||||||
/(java|python-urllib|python-requests|wget|libcurl)\/([\w\.-_]+)/i,
|
|
||||||
// Java/urllib/requests/wget/cURL
|
|
||||||
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
/(lavf)([\d\.]+)/i // Lavf (FFMPEG)
|
||||||
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
], [NAME, VERSION, [TYPE, MEDIAPLAYER]], [
|
||||||
|
|
||||||
@ -374,8 +379,8 @@ const MediaPlayers = Object.freeze({
|
|||||||
|
|
||||||
const Libraries = Object.freeze({
|
const Libraries = Object.freeze({
|
||||||
browser : [
|
browser : [
|
||||||
// Axios/jsdom/Scrapy
|
// Axios/jsdom/Scrapy/Java/urllib/requests
|
||||||
[/\b(axios|jsdom|scrapy)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
|
[/\b(axios|jsdom|scrapy|java|python-urllib|python-requests)\/([\w\.]+)/i], [NAME, VERSION, [TYPE, LIBRARY]]
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
10
src/helpers/ua-parser-helpers.d.ts
vendored
10
src/helpers/ua-parser-helpers.d.ts
vendored
@ -1,13 +1,14 @@
|
|||||||
// Type definitions for Helpers submodule of UAParser.js v2.0.0-rc.3
|
// Type definitions for Helpers submodule of UAParser.js v2.0.0
|
||||||
// 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 { IResult } from "../main/ua-parser";
|
import { IResult } from "../main/ua-parser";
|
||||||
|
|
||||||
declare function getDeviceVendor(model: string): string | undefined;
|
declare function getDeviceVendor(model: string): string | undefined;
|
||||||
declare function isAppleSilicon(res: IResult, useFeatureDetection?: boolean): boolean;
|
declare function isAppleSilicon(resultOrUA: IResult | string): boolean;
|
||||||
declare function isBot(res: IResult): boolean;
|
declare function isAIBot(resultOrUA: IResult | string): boolean;
|
||||||
declare function isChromeFamily(res: IResult): boolean;
|
declare function isBot(resultOrUA: IResult | string): boolean;
|
||||||
|
declare function isChromeFamily(resultOrUA: IResult | string): boolean;
|
||||||
declare function isElectron(): boolean;
|
declare function isElectron(): boolean;
|
||||||
declare function isFromEU(): boolean;
|
declare function isFromEU(): boolean;
|
||||||
declare function isFrozenUA(ua: string): boolean;
|
declare function isFrozenUA(ua: string): boolean;
|
||||||
@ -16,6 +17,7 @@ declare function isStandalonePWA(): boolean;
|
|||||||
export {
|
export {
|
||||||
getDeviceVendor,
|
getDeviceVendor,
|
||||||
isAppleSilicon,
|
isAppleSilicon,
|
||||||
|
isAIBot,
|
||||||
isBot,
|
isBot,
|
||||||
isChromeFamily,
|
isChromeFamily,
|
||||||
isElectron,
|
isElectron,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Helpers for UAParser.js v2.0.0-rc.3
|
/* Helpers for UAParser.js v2.0.0
|
||||||
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>
|
||||||
UAParser.js PRO Personal License */
|
UAParser.js PRO Personal License */
|
||||||
@ -9,18 +9,22 @@
|
|||||||
|
|
||||||
const { UAParser } = require('../main/ua-parser');
|
const { UAParser } = require('../main/ua-parser');
|
||||||
const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
|
const { CPU, OS, Engine } = require('../enums/ua-parser-enums');
|
||||||
|
const { Bots } = require('../extensions/ua-parser-extensions');
|
||||||
const { isFromEU } = require('detect-europe-js');
|
const { isFromEU } = require('detect-europe-js');
|
||||||
const { isFrozenUA } = require('ua-is-frozen');
|
const { isFrozenUA } = require('ua-is-frozen');
|
||||||
const { isStandalonePWA } = require('is-standalone-pwa');
|
const { isStandalonePWA } = require('is-standalone-pwa');
|
||||||
|
|
||||||
|
const toResult = (value, head, ext) => typeof value === 'string' ? UAParser(value, head, ext) : value;
|
||||||
|
|
||||||
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;
|
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;
|
||||||
|
|
||||||
const isAppleSilicon = (res, useFeatureDetection) => {
|
const isAppleSilicon = (resultOrUA) => {
|
||||||
|
const res = toResult(resultOrUA);
|
||||||
if (res.os.is(OS.MACOS)) {
|
if (res.os.is(OS.MACOS)) {
|
||||||
if (res.cpu.is(CPU.ARM)) {
|
if (res.cpu.is(CPU.ARM)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (useFeatureDetection) {
|
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
|
||||||
try {
|
try {
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
||||||
@ -37,9 +41,85 @@ const isAppleSilicon = (res, useFeatureDetection) => {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'library'].includes(res.browser.type);
|
const isAIBot = (resultOrUA) => [
|
||||||
|
|
||||||
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
// AI2
|
||||||
|
'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',
|
||||||
|
|
||||||
|
// 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
|
||||||
@ -47,6 +127,7 @@ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') ||
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
getDeviceVendor,
|
getDeviceVendor,
|
||||||
isAppleSilicon,
|
isAppleSilicon,
|
||||||
|
isAIBot,
|
||||||
isBot,
|
isBot,
|
||||||
isChromeFamily,
|
isChromeFamily,
|
||||||
isElectron,
|
isElectron,
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// Source: /src/helpers/ua-parser-helpers.js
|
// Source: /src/helpers/ua-parser-helpers.js
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
/* Helpers for UAParser.js v2.0.0-rc.3
|
/* Helpers for UAParser.js v2.0.0
|
||||||
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>
|
||||||
UAParser.js PRO Personal License */
|
UAParser.js PRO Personal License */
|
||||||
@ -13,18 +13,22 @@
|
|||||||
|
|
||||||
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 { CPU, OS, Engine } from '../enums/ua-parser-enums.mjs';
|
||||||
|
import { Bots } from '../extensions/ua-parser-extensions.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;
|
||||||
|
|
||||||
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;
|
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;
|
||||||
|
|
||||||
const isAppleSilicon = (res, useFeatureDetection) => {
|
const isAppleSilicon = (resultOrUA) => {
|
||||||
|
const res = toResult(resultOrUA);
|
||||||
if (res.os.is(OS.MACOS)) {
|
if (res.os.is(OS.MACOS)) {
|
||||||
if (res.cpu.is(CPU.ARM)) {
|
if (res.cpu.is(CPU.ARM)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (useFeatureDetection) {
|
if (typeof resultOrUA !== 'string' && typeof window !== 'undefined') {
|
||||||
try {
|
try {
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
const webgl = canvas.getContext('webgl2') || canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
|
||||||
@ -41,9 +45,85 @@ const isAppleSilicon = (res, useFeatureDetection) => {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'library'].includes(res.browser.type);
|
const isAIBot = (resultOrUA) => [
|
||||||
|
|
||||||
const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
|
// AI2
|
||||||
|
'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',
|
||||||
|
|
||||||
|
// 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
|
||||||
@ -51,6 +131,7 @@ const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') ||
|
|||||||
export {
|
export {
|
||||||
getDeviceVendor,
|
getDeviceVendor,
|
||||||
isAppleSilicon,
|
isAppleSilicon,
|
||||||
|
isAIBot,
|
||||||
isBot,
|
isBot,
|
||||||
isChromeFamily,
|
isChromeFamily,
|
||||||
isElectron,
|
isElectron,
|
||||||
|
2
src/main/ua-parser.d.ts
vendored
2
src/main/ua-parser.d.ts
vendored
@ -1,4 +1,4 @@
|
|||||||
// Type definitions for UAParser.js v2.0.0-rc.3
|
// Type definitions for UAParser.js v2.0.0
|
||||||
// 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 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
/* UAParser.js v2.0.0-rc.3
|
/* UAParser.js v2.0.0
|
||||||
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
||||||
UAParser.js PRO Personal License *//*
|
UAParser.js PRO Personal License *//*
|
||||||
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
||||||
@ -19,7 +19,7 @@
|
|||||||
// Constants
|
// Constants
|
||||||
/////////////
|
/////////////
|
||||||
|
|
||||||
var LIBVERSION = '2.0.0-rc.3',
|
var LIBVERSION = '2.0.0',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@ -463,7 +463,7 @@
|
|||||||
// Other
|
// Other
|
||||||
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
||||||
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
|
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
|
||||||
/(links) \(([\w\.]+)/i // Links
|
/\b(links) \(([\w\.]+)/i // Links
|
||||||
], [NAME, [VERSION, /_/g, '.']], [
|
], [NAME, [VERSION, /_/g, '.']], [
|
||||||
|
|
||||||
/(cobalt)\/([\w\.]+)/i // Cobalt
|
/(cobalt)\/([\w\.]+)/i // Cobalt
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
// Source: /src/main/ua-parser.js
|
// Source: /src/main/ua-parser.js
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////
|
||||||
/* UAParser.js v2.0.0-rc.3
|
/* UAParser.js v2.0.0
|
||||||
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
||||||
UAParser.js PRO Personal License *//*
|
UAParser.js PRO Personal License *//*
|
||||||
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
||||||
@ -21,7 +21,7 @@
|
|||||||
// Constants
|
// Constants
|
||||||
/////////////
|
/////////////
|
||||||
|
|
||||||
var LIBVERSION = '2.0.0-rc.3',
|
var LIBVERSION = '2.0.0',
|
||||||
EMPTY = '',
|
EMPTY = '',
|
||||||
UNKNOWN = '?',
|
UNKNOWN = '?',
|
||||||
FUNC_TYPE = 'function',
|
FUNC_TYPE = 'function',
|
||||||
@ -465,7 +465,7 @@
|
|||||||
// Other
|
// Other
|
||||||
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
||||||
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
|
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
|
||||||
/(links) \(([\w\.]+)/i // Links
|
/\b(links) \(([\w\.]+)/i // Links
|
||||||
], [NAME, [VERSION, /_/g, '.']], [
|
], [NAME, [VERSION, /_/g, '.']], [
|
||||||
|
|
||||||
/(cobalt)\/([\w\.]+)/i // Cobalt
|
/(cobalt)\/([\w\.]+)/i // Cobalt
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const { UAParser } = require('../src/main/ua-parser');
|
const { UAParser } = require('../src/main/ua-parser');
|
||||||
const { getDeviceVendor, isAppleSilicon, isBot, isChromeFamily } = require('../src/helpers/ua-parser-helpers');
|
const { getDeviceVendor, isAppleSilicon, isAIBot, isBot, isChromeFamily } = require('../src/helpers/ua-parser-helpers');
|
||||||
const { Bots, Emails } = require('../src/extensions/ua-parser-extensions');
|
const { Bots, Emails } = require('../src/extensions/ua-parser-extensions');
|
||||||
|
|
||||||
describe('getDeviceVendor', () => {
|
describe('getDeviceVendor', () => {
|
||||||
@ -28,7 +28,23 @@ describe('isAppleSilicon', () => {
|
|||||||
const macIntel = 'Mozilla/5.0 (Macintosh; Intel 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(UAParser(macIntel)), false);
|
||||||
|
assert.equal(isAppleSilicon(macIntel), false);
|
||||||
assert.equal(isAppleSilicon(UAParser(macARM)), true);
|
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';
|
||||||
|
|
||||||
|
assert.equal(isAIBot(UAParser(claudeBot, Bots)), true);
|
||||||
|
assert.equal(isAIBot(claudeBot), true);
|
||||||
|
assert.equal(isAIBot(firefox), false);
|
||||||
|
assert.equal(isAIBot(searchGPT), true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -46,6 +62,11 @@ describe('isBot', () => {
|
|||||||
assert.equal(isBot(botParser.setUA(ahrefsBot).getResult()), true);
|
assert.equal(isBot(botParser.setUA(ahrefsBot).getResult()), true);
|
||||||
assert.equal(isBot(botParser.setUA(scrapy).getResult()), true);
|
assert.equal(isBot(botParser.setUA(scrapy).getResult()), true);
|
||||||
assert.equal(isBot(botParser.setUA(thunderbird).getResult()), false);
|
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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -57,5 +78,7 @@ describe('isChromeFamily', () => {
|
|||||||
|
|
||||||
assert.equal(isChromeFamily(UAParser(edge)), true);
|
assert.equal(isChromeFamily(UAParser(edge)), true);
|
||||||
assert.equal(isChromeFamily(UAParser(firefox)), false);
|
assert.equal(isChromeFamily(UAParser(firefox)), false);
|
||||||
|
assert.equal(isChromeFamily(edge), true);
|
||||||
|
assert.equal(isChromeFamily(firefox), false);
|
||||||
});
|
});
|
||||||
});
|
});
|
@ -9,6 +9,36 @@
|
|||||||
"type" : "cli"
|
"type" : "cli"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ELinks",
|
||||||
|
"ua" : "ELinks/0.11.4-3-lite (textmode; Debian; Linux 2.6.26-1-686 i686;",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ELinks",
|
||||||
|
"version" : "0.11.4-3-lite",
|
||||||
|
"type" : "cli"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ELinks",
|
||||||
|
"ua" : "ELinks (0.11.3; Linux 2.6.23-hardened-r4 i686; 166x55)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ELinks",
|
||||||
|
"version" : "0.11.3",
|
||||||
|
"type" : "cli"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "HTTPie",
|
||||||
|
"ua" : "HTTPie/0.9.9",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "HTTPie",
|
||||||
|
"version" : "0.9.9",
|
||||||
|
"type" : "cli"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "lynx",
|
"desc" : "lynx",
|
||||||
"ua" : "Lynx 2.8.8dev.3",
|
"ua" : "Lynx 2.8.8dev.3",
|
||||||
|
@ -49,6 +49,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "AI2Bot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible) AI2Bot (+https://www.allenai.org/crawler)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "AI2Bot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "aiHitBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; aiHitBot/2.9; +https://www.aihitdata.com/about)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "aiHitBot",
|
||||||
|
"version" : "2.9",
|
||||||
|
"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)",
|
||||||
@ -131,7 +151,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"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)",
|
||||||
"expect" :
|
"expect" :
|
||||||
{
|
{
|
||||||
"name" : "DataForSeoBot",
|
"name" : "DataForSeoBot",
|
||||||
@ -139,6 +159,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Diffbot",
|
||||||
|
"ua" : "Diffbot/0.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Diffbot",
|
||||||
|
"version" : "0.1",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Dotbot",
|
"desc" : "Dotbot",
|
||||||
"ua" : "Mozilla/5.0 (compatible; DotBot/1.2; +https://opensiteexplorer.org/dotbot; help@moz.com)",
|
"ua" : "Mozilla/5.0 (compatible; DotBot/1.2; +https://opensiteexplorer.org/dotbot; help@moz.com)",
|
||||||
@ -329,6 +359,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "ImagesiftBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; ImagesiftBot; +imagesift.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "ImagesiftBot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "magpie-crawler",
|
||||||
|
"ua" : "magpie-crawler/1.1 (robots-txt-checker; +http://www.brandwatch.net)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "magpie-crawler",
|
||||||
|
"version" : "1.1",
|
||||||
|
"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)",
|
||||||
@ -360,6 +410,26 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Omgili",
|
||||||
|
"ua" : "omgili/0.5 +https://omgili.com",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "omgili",
|
||||||
|
"version" : "0.5",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Omgilibot",
|
||||||
|
"ua" : "omgilibot/0.3 +http://www.omgili.com/Crawler.html",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "omgilibot",
|
||||||
|
"version" : "0.3",
|
||||||
|
"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",
|
||||||
@ -410,6 +480,36 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "SeznamBot",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; SeznamBot/4.0-RC1; +http://napoveda.seznam.cz/seznambot-intro/)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "SeznamBot",
|
||||||
|
"version" : "4.0-RC1",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Teoma",
|
||||||
|
"ua" : "Mozilla/2.0 (compatible; Ask Jeeves/Teoma; +http://sp.ask.com/docs/about/tech_crawling.html)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Teoma",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Timpibot",
|
||||||
|
"ua" : "Timpibot/0.8 (+http://www.timpi.io)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Timpibot",
|
||||||
|
"version" : "0.8",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "TurnitinBot",
|
"desc" : "TurnitinBot",
|
||||||
"ua" : "TurnitinBot (https://turnitin.com/robot/crawlerinfo.html)",
|
"ua" : "TurnitinBot (https://turnitin.com/robot/crawlerinfo.html)",
|
||||||
@ -420,6 +520,16 @@
|
|||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "VelenPublicWebCrawler",
|
||||||
|
"ua" : "Mozilla/5.0 (compatible; VelenPublicWebCrawler/1.0; +https://velen.io)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "VelenPublicWebCrawler",
|
||||||
|
"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)",
|
||||||
@ -469,5 +579,15 @@
|
|||||||
"version" : "undefined",
|
"version" : "undefined",
|
||||||
"type" : "crawler"
|
"type" : "crawler"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "YouBot",
|
||||||
|
"ua" : "YouBot (+http://www.you.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "YouBot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "crawler"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -1,4 +1,34 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Airmail",
|
||||||
|
"ua" : "Airmail 1.0 rv:148 (Macintosh; Mac OS X 10.8.3; en_BE)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Airmail",
|
||||||
|
"version" : "1.0",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BlueMail",
|
||||||
|
"version" : "0.10.31",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "BlueMail",
|
||||||
|
"ua" : "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16A405 BlueMail iOS",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "BlueMail",
|
||||||
|
"version" : "iOS",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Evolution",
|
"desc" : "Evolution",
|
||||||
"ua" : "Evolution/3.52.3",
|
"ua" : "Evolution/3.52.3",
|
||||||
@ -9,6 +39,26 @@
|
|||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "eM Client",
|
||||||
|
"ua" : "eMClient/9.2.2157.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "eMClient",
|
||||||
|
"version" : "9.2.2157.0",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Foxmail",
|
||||||
|
"ua" : "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36 foxmail/7.2.15.80",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "foxmail",
|
||||||
|
"version" : "7.2.15.80",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "KMail",
|
"desc" : "KMail",
|
||||||
"ua" : "KMail/4.14.10 (FreeBSD/12.0-CURRENT; KDE/4.14.10; amd64; ; )",
|
"ua" : "KMail/4.14.10 (FreeBSD/12.0-CURRENT; KDE/4.14.10; amd64; ; )",
|
||||||
@ -59,6 +109,26 @@
|
|||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"desc" : "NaverMailApp",
|
||||||
|
"ua" : "NaverMailApp/2.1.23 (Android 10; SM-N960N)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "NaverMailApp",
|
||||||
|
"version" : "2.1.23",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Sparrow",
|
||||||
|
"ua" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Sparrow/1043.1",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Sparrow",
|
||||||
|
"version" : "1043.1",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Thunderbird",
|
"desc" : "Thunderbird",
|
||||||
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0",
|
"ua" : "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0",
|
||||||
@ -68,5 +138,25 @@
|
|||||||
"version" : "78.13.0",
|
"version" : "78.13.0",
|
||||||
"type" : "email"
|
"type" : "email"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Yahoo! Mail",
|
||||||
|
"ua" : "YahooMobile/1.0 (mail; 3.0.5.1311380); (Linux; U; Android 4.0.3; htc_runnymede Build/ICE_CREAM_SANDWICH_MR1);",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Yahoo",
|
||||||
|
"version" : "3.0.5.1311380",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Yahoo! Mail",
|
||||||
|
"ua" : "YahooMobileMail/1.0 (Android Mail; 1.3.10) (supersonic;HTC;PC36100;2.3.5/GRJ90) ",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Yahoo",
|
||||||
|
"version" : "1.3.10",
|
||||||
|
"type" : "email"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -118,5 +118,15 @@
|
|||||||
"version" : "2.0",
|
"version" : "2.0",
|
||||||
"type" : "fetcher"
|
"type" : "fetcher"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Vercelbot",
|
||||||
|
"ua" : "Vercelbot (+https://vercel.com)",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Vercelbot",
|
||||||
|
"version" : "undefined",
|
||||||
|
"type" : "fetcher"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -1,4 +1,54 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"desc" : "Axios",
|
||||||
|
"ua" : "axios/1.7.2",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "axios",
|
||||||
|
"version" : "1.7.2",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Java",
|
||||||
|
"ua" : "Java/1.6.0_14",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Java",
|
||||||
|
"version" : "1.6.0_14",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "jsdom",
|
||||||
|
"ua" : "Mozilla/5.0 (unknown OS) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/11.12.0",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "jsdom",
|
||||||
|
"version" : "11.12.0",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Python urllib",
|
||||||
|
"ua" : "Python-urllib/2.6",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "Python-urllib",
|
||||||
|
"version" : "2.6",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"desc" : "Python requests",
|
||||||
|
"ua" : "python-requests/2.32",
|
||||||
|
"expect" :
|
||||||
|
{
|
||||||
|
"name" : "python-requests",
|
||||||
|
"version" : "2.32",
|
||||||
|
"type" : "library"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"desc" : "Scrapy",
|
"desc" : "Scrapy",
|
||||||
"ua" : "Scrapy/1.5.0 (+https://scrapy.org)",
|
"ua" : "Scrapy/1.5.0 (+https://scrapy.org)",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user