UNPKG

js-detect-incognito-private-browsing

Version:

Javascript Code to Detect Private or Incognito Browsing (with Bot detector) and Paywall

287 lines (242 loc) 9.44 kB
/** * BrowsingModeDetector * * @returns {BrowsingModeDetector} * @constructor * @author Maykonn Welington Candido <maykonn@outlook.com> */ window.BrowsingModeDetector = function () { var _instance = this; var _ignoringBots = true; var _browsingInIncognitoMode; var _callbackForNormalMode; var _callbackForIncognitoOrPrivateMode; var _callbackDefault; // if given, will be executed even _callbackForNormalMode and _callbackForIncognitoOrPrivateMode are given this.BROWSING_NORMAL_MODE = 'NORMAL_MODE'; this.BROWSING_INCOGNITO_PRIVATE_MODE = 'INCOGNITO_PRIVATE_MODE'; /** * @returns {BrowsingModeDetector} */ this.ignoringBots = function () { _ignoringBots = true; return this; }; /** * @returns {BrowsingModeDetector} */ this.notIgnoringBots = function () { _ignoringBots = false; return this; }; this.getBrowsingMode = function () { return (_browsingInIncognitoMode ? this.BROWSING_INCOGNITO_PRIVATE_MODE : this.BROWSING_NORMAL_MODE); }; this.setBrowsingInIncognitoMode = function () { _browsingInIncognitoMode = true; }; this.setBrowsingInNormalMode = function () { _browsingInIncognitoMode = false; }; /** * @param callback optional */ this.isBotBrowsing = function (callback) { var userAgentToTest = window.navigator.userAgent; var isBot = /googlebot|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google|bingbot|slurp|java|wget|curl|Commons-HttpClient|Python-urllib|libwww|httpunit|nutch|phpcrawl|msnbot|jyxobot|FAST-WebCrawler|FAST Enterprise Crawler|biglotron|teoma|convera|seekbot|gigablast|exabot|ngbot|ia_archiver|GingerCrawler|webmon |httrack|webcrawler|grub.org|UsineNouvelleCrawler|antibot|netresearchserver|speedy|fluffy|bibnum.bnf|findlink|msrbot|panscient|yacybot|AISearchBot|IOI|ips-agent|tagoobot|MJ12bot|dotbot|woriobot|yanga|buzzbot|mlbot|yandexbot|purebot|Linguee Bot|Voyager|CyberPatrol|voilabot|baiduspider|citeseerxbot|spbot|twengabot|postrank|turnitinbot|scribdbot|page2rss|sitebot|linkdex|Adidxbot|blekkobot|ezooms|dotbot|Mail.RU_Bot|discobot|heritrix|findthatfile|europarchive.org|NerdByNature.Bot|sistrix crawler|ahrefsbot|Aboundex|domaincrawler|wbsearchbot|summify|ccbot|edisterbot|seznambot|ec2linkfinder|gslfbot|aihitbot|intelium_bot|facebookexternalhit|yeti|RetrevoPageAnalyzer|lb-spider|sogou|lssbot|careerbot|wotbox|wocbot|ichiro|DuckDuckBot|lssrocketcrawler|drupact|webcompanycrawler|acoonbot|openindexspider|gnam gnam spider|web-archive-net.com.bot|backlinkcrawler|coccoc|integromedb|content crawler spider|toplistbot|seokicks-robot|it2media-domain-crawler|ip-web-crawler.com|siteexplorer.info|elisabot|proximic|changedetection|blexbot|arabot|WeSEE:Search|niki-bot|CrystalSemanticsBot|rogerbot|360Spider|psbot|InterfaxScanBot|Lipperhey SEO Service|CC Metadata Scaper|g00g1e.net|GrapeshotCrawler|urlappendbot|brainobot|fr-crawler|binlar|SimpleCrawler|Livelapbot|Twitterbot|cXensebot|smtbot|bnf.fr_bot|A6-Indexer|ADmantX|Facebot|Twitterbot|OrangeBot|memorybot|AdvBot|MegaIndex|SemanticScholarBot|ltx71|nerdybot|xovibot|BUbiNG|Qwantify|archive.org_bot|Applebot|TweetmemeBot|crawler4j|findxbot|SemrushBot|yoozBot|lipperhey|y!j-asr|Domain Re-Animator Bot|AddThis/i.test(userAgentToTest); return (typeof callback === 'undefined' ? isBot : callback(isBot)); }; /** * @param callback * @returns {BrowsingModeDetector} */ this.setCallbackForNormalMode = function (callback) { _callbackForNormalMode = callback; return this; }; /** * @param callback * @returns {BrowsingModeDetector} */ this.setCallbackForIncognitoOrPrivateMode = function (callback) { _callbackForIncognitoOrPrivateMode = callback; return this; }; /** * @param defaultCallback optional */ this.do = function (defaultCallback) { _validateUserCallback(defaultCallback); if (_ignoringBots && this.isBotBrowsing()) { _browsingInIncognitoMode = false; _executeUserCallback(); return; } (new BrowserFactory()) .browser(this) .detectBrowsingMode(_executeUserCallback); }; var _validateUserCallback = function (defaultCallback) { _callbackDefault = defaultCallback; if ( typeof _callbackDefault !== 'function' && (typeof _callbackForNormalMode !== 'function' || typeof _callbackForIncognitoOrPrivateMode !== 'function') ) { throw 'Default callback or specific callbacks are required'; } }; var _executeUserCallback = function () { if (_browsingInIncognitoMode && typeof _callbackForIncognitoOrPrivateMode === 'function') { _callbackForIncognitoOrPrivateMode(_instance); } else if (!_browsingInIncognitoMode && typeof _callbackForNormalMode === 'function') { _callbackForNormalMode(_instance); } if (typeof _callbackDefault !== 'undefined') { _callbackDefault(_browsingInIncognitoMode, _instance) } }; return this; }; /** * @returns {BrowserFactory} * @constructor */ var BrowserFactory = function () { var _browser; this.browser = function (BrowsingModeDetector) { if (typeof _browser === 'object') { return _browser; } return _browser = _resolve(BrowsingModeDetector); }; /** * @param {BrowsingModeDetector} BrowsingModeDetector * @returns {*} * @private */ var _resolve = function (BrowsingModeDetector) { if (window.webkitRequestFileSystem) { return new WebkitBrowser(BrowsingModeDetector); } else if ('MozAppearance' in document.documentElement.style) { return new MozillaBrowser(BrowsingModeDetector); } else if (/constructor/i.test(window.HTMLElement)) { return new SafariBrowser(BrowsingModeDetector); } else if (window.PointerEvent || window.MSPointerEvent) { return new IE10EdgeBrowser(BrowsingModeDetector); } else { return new OtherBrowser(BrowsingModeDetector); } }; return this; }; /** * @param {BrowsingModeDetector} BrowsingModeDetector * @returns {WebkitBrowser} * @constructor */ var WebkitBrowser = function (BrowsingModeDetector) { this.BrowsingModeDetector = BrowsingModeDetector; this.detectBrowsingMode = function (_executeUserCallback) { var self = this; var callbackWhenWebkitRequestFileSystemIsON = function () { self.BrowsingModeDetector.setBrowsingInNormalMode(); _executeUserCallback(); }; var callbackWhenWebkitRequestFileSystemIsOFF = function () { self.BrowsingModeDetector.setBrowsingInIncognitoMode(); _executeUserCallback(); }; window.webkitRequestFileSystem( window.TEMPORARY, 1, callbackWhenWebkitRequestFileSystemIsON, callbackWhenWebkitRequestFileSystemIsOFF ); }; return this; }; /** * @param {BrowsingModeDetector} BrowsingModeDetector * @returns {MozillaBrowser} * @constructor */ var MozillaBrowser = function (BrowsingModeDetector) { this.BrowsingModeDetector = BrowsingModeDetector; this.detectBrowsingMode = function (_executeUserCallback) { if (navigator.serviceWorker) { this.BrowsingModeDetector.setBrowsingInNormalMode(); } else { this.BrowsingModeDetector.setBrowsingInIncognitoMode(); } _executeUserCallback(); }; return this; }; /** * @param {BrowsingModeDetector} BrowsingModeDetector * @returns {SafariBrowser} * @constructor */ var SafariBrowser = function (BrowsingModeDetector) { this.BrowsingModeDetector = BrowsingModeDetector; this.detectBrowsingMode = function (_executeUserCallback) { // iOS 11 // From gist discussion: https://gist.github.com/cou929/7973956#gistcomment-2272103 try { window.openDatabase(null, null, null, null); } catch (e) { this.BrowsingModeDetector.setBrowsingInIncognitoMode(); _executeUserCallback(); } // Older Safari try { if (!localStorage.length) { localStorage.i = 1; localStorage.removeItem('i'); } this.BrowsingModeDetector.setBrowsingInNormalMode(); } catch (e) { // From: https://gist.github.com/jherax/a81c8c132d09cc354a0e2cb911841ff1 // Safari only enables cookie in private mode // if cookie is disabled then all client side storage is disabled // if all client side storage is disabled, then there is no point // in using private mode if (navigator.cookieEnabled) { this.BrowsingModeDetector.setBrowsingInIncognitoMode(); } else { this.BrowsingModeDetector.setBrowsingInNormalMode(); } } _executeUserCallback(); }; return this; }; /** * @param {BrowsingModeDetector} BrowsingModeDetector * @returns {IE10EdgeBrowser} * @constructor */ var IE10EdgeBrowser = function (BrowsingModeDetector) { this.BrowsingModeDetector = BrowsingModeDetector; this.detectBrowsingMode = function (_executeUserCallback) { if (window.indexedDB) { this.BrowsingModeDetector.setBrowsingInNormalMode(); } else { this.BrowsingModeDetector.setBrowsingInIncognitoMode(); } _executeUserCallback(); }; return this; }; /** * @param {BrowsingModeDetector} BrowsingModeDetector * @returns {OtherBrowser} * @constructor */ var OtherBrowser = function (BrowsingModeDetector) { this.BrowsingModeDetector = BrowsingModeDetector; this.detectBrowsingMode = function (_executeUserCallback) { this.BrowsingModeDetector.setBrowsingInNormalMode(); _executeUserCallback(); }; return this; };