Add new helper method: isBot() to detect whether current browser is a bot

This commit is contained in:
Faisal Salman 2024-11-02 13:15:33 +07:00
parent 7a754ef227
commit 5a1d0319f8
3 changed files with 24 additions and 1 deletions

View File

@ -6,6 +6,7 @@ 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): boolean; declare function isAppleSilicon(res: IResult): boolean;
declare function isBot(res: IResult): boolean;
declare function isChromeFamily(res: IResult): boolean; declare function isChromeFamily(res: IResult): boolean;
declare function isElectron(): boolean; declare function isElectron(): boolean;
declare function isFromEU(): boolean; declare function isFromEU(): boolean;
@ -15,6 +16,7 @@ declare function isStandalonePWA(): boolean;
export { export {
getDeviceVendor, getDeviceVendor,
isAppleSilicon, isAppleSilicon,
isBot,
isChromeFamily, isChromeFamily,
isElectron, isElectron,
isFromEU, isFromEU,

View File

@ -33,6 +33,8 @@ const isAppleSilicon = (res) => {
return false; return false;
} }
const isBot = (res) => ['cli', 'crawler', 'fetcher', 'module'].includes(res.browser.type);
const isChromeFamily = (res) => res.engine.is(Engine.BLINK); const isChromeFamily = (res) => res.engine.is(Engine.BLINK);
const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js const isElectron = () => !!(process?.versions?.hasOwnProperty('electron') || // node.js
@ -53,6 +55,7 @@ const isStandalonePWA = () => window && (window.matchMedia('(display-mode: stand
module.exports = { module.exports = {
getDeviceVendor, getDeviceVendor,
isAppleSilicon, isAppleSilicon,
isBot,
isChromeFamily, isChromeFamily,
isElectron, isElectron,
isFromEU, isFromEU,

View File

@ -1,6 +1,7 @@
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, 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', () => { describe('getDeviceVendor', () => {
it('Can guess the device vendor from a model name', () => { 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', () => { describe('isChromeFamily', () => {
it('Can detect Chromium-based browser', () => { it('Can detect Chromium-based browser', () => {