@4884org/jumble
Version:
🛡️ Advanced bot detection & content protection component with 100ms optimized timing. Automatically detects bots and scrambles text content while obfuscating media to protect websites. Universal implementation works with React, Vue, Angular, Svelte.
2 lines • 7.64 kB
JavaScript
import{r as t}from"./p-UcIOMeif.js";const e=class{constructor(e){t(this,e)}trapLinkId="__bot_trap_link__";botConfirmed=false;timeoutId=null;forceBot=false;isProcessed=false;detectionStartTime=0;allowSEO=true;customAllowlist=[];customDenylist=[];componentDidLoad(){this.detectionStartTime=this.safePerformanceNow();this.injectTrapLink();this.runDetection()}safePerformanceNow(){return typeof performance?.now==="function"?performance.now():Date.now()}isLegitimateSearchEngine(t){const e=["googlebot","google-inspectiontool","google-site-verification","googleother","bingbot","msnbot","adidxbot","bingpreview","duckduckbot","slurp","yandexbot","baidubot","facebookexternalhit","twitterbot","linkedinbot","whatsapp","telegrambot","semrushbot","ahrefsbot","mj12bot","dotbot","screaming frog","discordbot","slackbot","redditbot","pinterest","uptimerobot","pingdom","gtmetrix"];const o=[...e,...this.customAllowlist];return o.some((e=>t.includes(e.toLowerCase())))}isSuspiciousUserAgent(t){const e=["headless","phantom","selenium","webdriver","puppeteer","playwright","scraper","crawler","harvester","extractor","spider","grabber","leech","gptbot","oai-searchbot","chatgpt-user","anthropic-ai","claudebot","claude-web","google-extended","meta-externalagent","perplexitybot","ccbot","cohere-ai","bytespider","duckassistbot","ai2bot","diffbot","omgili","youbot","timpibot"];const o=[...e,...this.customDenylist];const i=o.some((e=>t.includes(e.toLowerCase())));const s=this.isLegitimateSearchEngine(t);return i&&!s}disconnectedCallback(){if(this.timeoutId!==null){clearTimeout(this.timeoutId);this.timeoutId=null}}async toggleBotMode(){this.forceBot=!this.forceBot;this.runDetection()}async setBotMode(t){this.forceBot=t;this.runDetection()}async getCurrentBotMode(){return this.forceBot||this.botConfirmed||this.isLikelyBot()}runDetection(){if(this.timeoutId!==null){clearTimeout(this.timeoutId)}if(this.isProcessed){this.restoreContent(document.body)}this.timeoutId=setTimeout((()=>{const t=this.forceBot||this.isLikelyBot();if(this.forceBot||this.botConfirmed||t){this.scrambleAllText(document.body);this.obfuscateMedia(document.body);document.body.classList.add("jumble-bot-detected")}else{document.body.classList.remove("jumble-bot-detected")}document.documentElement.classList.remove("jumble-init");this.isProcessed=true;this.timeoutId=null;const e=this.safePerformanceNow()-this.detectionStartTime;console.debug(`Jumble: Bot detection completed in ${Math.round(e)}ms`)}),100)}restoreContent(t){const e=t.querySelectorAll("img.jumble-obfuscated, video.jumble-obfuscated");e.forEach((t=>{const e=t;if(e.tagName.toLowerCase()==="img"){const t=e;if(t.dataset.jumbleOriginalSrc){t.src=t.dataset.jumbleOriginalSrc}if(t.dataset.jumbleOriginalSrcset){t.srcset=t.dataset.jumbleOriginalSrcset}t.classList.remove("jumble-obfuscated")}else if(e.tagName.toLowerCase()==="video"){const t=e;if(t.dataset.jumbleOriginalSrc){t.src=t.dataset.jumbleOriginalSrc}if(t.dataset.jumbleOriginalPoster){t.poster=t.dataset.jumbleOriginalPoster}const o=t.querySelectorAll("source");o.forEach((t=>{if(t.dataset.jumbleOriginalSrc){t.src=t.dataset.jumbleOriginalSrc}}));t.classList.remove("jumble-obfuscated")}}));const o=t.querySelectorAll("*");o.forEach((t=>{const e=t.shadowRoot;if(e){this.restoreContent(e)}}))}injectTrapLink(){const t=document.createElement("a");t.href="/__bot-trap__";t.style.position="absolute";t.style.left="-9999px";t.style.top="-9999px";t.style.width="1px";t.style.height="1px";t.style.overflow="hidden";t.style.textDecoration="none";t.style.color="transparent";t.textContent="bot trap";t.setAttribute("aria-hidden","true");t.setAttribute("tabindex","-1");t.id=this.trapLinkId;document.body.appendChild(t);t.addEventListener("focus",(()=>this.flagAsBot()));t.addEventListener("mouseenter",(()=>this.flagAsBot()));t.addEventListener("click",(()=>this.flagAsBot()))}flagAsBot(){this.botConfirmed=true;console.debug("Jumble: Bot activity detected via trap link")}isLikelyBot(){const t=navigator?.userAgent?.toLowerCase()||"";const e=window;let o=0;const i=[];if(this.allowSEO&&this.isLegitimateSearchEngine(t)){console.debug("Jumble: Legitimate search engine detected - allowing content indexing for SEO",t);return false}const s=!("ontouchstart"in window);const n=!e.chrome;const c=this.isSuspiciousUserAgent(t);const r=(window.outerWidth||0)===0&&(window.outerHeight||0)===0;const a=navigator?.webdriver||false;const l=!navigator?.languages||navigator.languages.length===0;const u=!navigator?.plugins||navigator.plugins.length===0;const d=!navigator?.connection;const h=(screen?.width||0)===0||(screen?.height||0)===0;const b=!window.localStorage||!window.sessionStorage;const m=this.safePerformanceNow()-this.detectionStartTime<50;const f=(window.history?.length||0)<=1;const g=t.includes("phantomjs");const p=t.includes("selenium")||e._selenium||e.__selenium_unwrapped||e.__selenium_evaluate||e.__fxdriver_evaluate;if(s){o+=.5;i.push("No touch support")}if(n){o+=.5;i.push("No Chrome APIs")}if(a){o+=3;i.push("WebDriver detected")}if(l){o+=2;i.push("No languages")}if(u){o+=.5;i.push("No plugins")}if(c){o+=3;i.push("Malicious bot user agent")}if(r){o+=2;i.push("Zero viewport")}if(d){o+=.5;i.push("No connection API")}if(h){o+=2;i.push("Suspicious screen dimensions")}if(b){o+=1;i.push("No storage APIs")}if(m){o+=.5;i.push("Unusually fast execution")}if(f){o+=1;i.push("Minimal browser history")}if(g){o+=3;i.push("PhantomJS detected")}if(p){o+=3;i.push("Selenium detected")}const w=o>=3;if(w){console.debug(`Jumble: Malicious bot detected (suspicion: ${o}/12) - scrambling content`,i)}else{console.debug(`Jumble: Human detected (suspicion: ${o}/12)`)}return w}obfuscateMedia(t){const e=t.querySelectorAll("img, video");e.forEach((t=>{const e=t;if(!e.dataset.jumbleOriginalSrc){e.dataset.jumbleOriginalSrc=e.src||""}if(e.tagName.toLowerCase()==="img"){const t=e;if(t.srcset&&!t.dataset.jumbleOriginalSrcset){t.dataset.jumbleOriginalSrcset=t.srcset}t.src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB2aWV3Qm94PSIwIDAgMSAxIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9IiNmM2Y0ZjYiLz48L3N2Zz4=";t.srcset="";t.classList.add("jumble-obfuscated")}else if(e.tagName.toLowerCase()==="video"){const t=e;if(t.poster&&!t.dataset.jumbleOriginalPoster){t.dataset.jumbleOriginalPoster=t.poster}t.src="";t.poster="";t.pause();const o=t.querySelectorAll("source");o.forEach((t=>{if(!t.dataset.jumbleOriginalSrc){t.dataset.jumbleOriginalSrc=t.src||""}t.src=""}));t.classList.add("jumble-obfuscated")}}));const o=t.querySelectorAll("*");o.forEach((t=>{const e=t.shadowRoot;if(e){this.obfuscateMedia(e)}}))}scrambleAllText(t){const e=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode:t=>{const e=t.parentElement;if(!e)return NodeFilter.FILTER_REJECT;const o=e.tagName.toLowerCase();return["script","style","meta","title","noscript","head"].includes(o)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}});while(e.nextNode()){const t=e.currentNode;t.textContent=this.scramble(t.textContent||"")}const o=t.querySelectorAll("*");o.forEach((t=>{const e=t.shadowRoot;if(e){this.scrambleAllText(e)}}))}scrambleChar(t){const e=t.charCodeAt(0);if(e>=1536&&e<=1791){return String.fromCharCode(1536+Math.floor(Math.random()*256))}if(e>=19968&&e<=40959){return String.fromCharCode(19968+Math.floor(Math.random()*(40959-19968)))}if(e>=65&&e<=90||e>=97&&e<=122){return String.fromCharCode(97+Math.floor(Math.random()*26))}return t}scramble(t){return Array.from(t).map(this.scrambleChar).join("")}render(){return null}};export{e as jumble_head};
//# sourceMappingURL=p-dca5488d.entry.js.map