From 5a1d0319f811e71c09b41e99d4f37d37f59fca48 Mon Sep 17 00:00:00 2001 From: Faisal Salman Date: Sat, 2 Nov 2024 13:15:33 +0700 Subject: [PATCH] Add new helper method: `isBot()` to detect whether current browser is a bot --- src/helpers/ua-parser-helpers.d.ts | 2 ++ src/helpers/ua-parser-helpers.js | 3 +++ test/mocha-test-helpers.js | 20 +++++++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/helpers/ua-parser-helpers.d.ts b/src/helpers/ua-parser-helpers.d.ts index e8dd9d3..7074c22 100644 --- a/src/helpers/ua-parser-helpers.d.ts +++ b/src/helpers/ua-parser-helpers.d.ts @@ -6,6 +6,7 @@ import { IResult } from "../main/ua-parser"; declare function getDeviceVendor(model: string): string | undefined; declare function isAppleSilicon(res: IResult): boolean; +declare function isBot(res: IResult): boolean; declare function isChromeFamily(res: IResult): boolean; declare function isElectron(): boolean; declare function isFromEU(): boolean; @@ -15,6 +16,7 @@ declare function isStandalonePWA(): boolean; export { getDeviceVendor, isAppleSilicon, + isBot, isChromeFamily, isElectron, isFromEU, diff --git a/src/helpers/ua-parser-helpers.js b/src/helpers/ua-parser-helpers.js index 61c63bb..d5e35a0 100644 --- a/src/helpers/ua-parser-helpers.js +++ b/src/helpers/ua-parser-helpers.js @@ -33,6 +33,8 @@ const isAppleSilicon = (res) => { return false; } +const isBot = (res) => ['cli', 'crawler', 'fetcher', 'module'].includes(res.browser.type); + const isChromeFamily = (res) => res.engine.is(Engine.BLINK); const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js @@ -53,6 +55,7 @@ const isStandalonePWA = () => window && (window.matchMedia('(display-mode: stand module.exports = { getDeviceVendor, isAppleSilicon, + isBot, isChromeFamily, isElectron, isFromEU, diff --git a/test/mocha-test-helpers.js b/test/mocha-test-helpers.js index da9ae2c..ab61cd9 100644 --- a/test/mocha-test-helpers.js +++ b/test/mocha-test-helpers.js @@ -1,6 +1,7 @@ const assert = require('assert'); const { UAParser } = require('../src/main/ua-parser'); -const { getDeviceVendor, isAppleSilicon, isChromeFamily } = require('../src/helpers/ua-parser-helpers'); +const { getDeviceVendor, isAppleSilicon, 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', () => { @@ -31,6 +32,23 @@ describe('isAppleSilicon', () => { }); }); +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); + }); +}); + describe('isChromeFamily', () => { it('Can detect Chromium-based browser', () => {