🤖 Auto Scroll

00:00
Ready to Start
Smooth • Natural • Human-like

404

Page not found. Check the address or go back .

// ============================================ // 🎯 ADJUSTABLE SETTINGS - EDIT THESE VALUES // ============================================ const SCROLL_SETTINGS = { // Timing Settings MINIMUM_DURATION: 60000, // Minimum scroll time in milliseconds (60000 = 60 seconds) INITIAL_PAUSE_TIME: 7000, // Initial pause before scrolling starts (7000 = 7 seconds) // Pause Settings (during reading) PAUSE_MIN_DURATION: 2000, // Minimum pause time (2000 = 2 seconds) PAUSE_MAX_DURATION: 4000, // Maximum pause time (4000 = 4 seconds) PAUSE_FREQUENCY: 0.006, // How often to pause (0.006 = more frequent pauses throughout) PAUSE_START_AFTER: 8000, // Don't pause until this time elapsed (8000 = 8 seconds) // Scroll Speed Settings MIN_SCROLL_SPEED: 0.5, // Minimum pixels per frame (prevents getting stuck) SPEED_SMOOTHING: 0.1, // How smoothly speed changes (0.1 = smooth, 0.5 = fast response) SPEED_MULTIPLIER: 20, // Overall speed multiplier (higher = faster) // Randomization Settings (to avoid bot detection) RANDOM_DURATION_VARIANCE: 0.20, // +/- 20% variation in total duration RANDOM_PAUSE_VARIANCE: 0.35, // +/- 35% variation in pause durations RANDOM_SPEED_VARIANCE: 0.25, // +/- 25% variation in scroll speed RANDOM_INITIAL_PAUSE_VARIANCE: 0.50, // +/- 50% variation in initial pause // Advanced Anti-Detection ENABLE_RANDOM_SCROLLBACK: true, // Sometimes scroll back (re-reading) SCROLLBACK_PROBABILITY: 0.08, // 8% chance of scrolling back SCROLLBACK_DISTANCE: 100, // How far to scroll back (pixels) ENABLE_SPEED_VARIATIONS: true, // Vary speed during scroll SPEED_CHANGE_PROBABILITY: 0.05, // 5% chance to change speed ENABLE_MICRO_PAUSES: true, // Very brief hesitations while scrolling MICRO_PAUSE_PROBABILITY: 0.03, // 3% chance per frame MICRO_PAUSE_DURATION: 200, // 200ms brief pause // Random Click Settings ENABLE_RANDOM_CLICKS: true, // Enable random link clicking CLICK_PROBABILITY: 0.15, // 15% chance to click a link during session CLICK_MIN_TIME: 15000, // Don't click before 15 seconds CLICK_MAX_TIME: 50000, // Don't click after 50 seconds CLICK_HOVER_BEFORE: true, // Hover over link before clicking CLICK_HOVER_DURATION: 800, // Hover for 0.8-2 seconds before click CLICK_IN_NEW_TAB: true, // Open links in new tab (Ctrl+Click) CLICK_CLOSE_TAB_AFTER: true, // Close new tab after viewing CLICK_TAB_VIEW_TIME: 3000, // View new tab for 3-8 seconds // Cursor Movement Settings CURSOR_FOLLOW_SPEED: 0.15, // How fast cursor follows target CURSOR_MICRO_MOVEMENT_PAUSE: 0.30, // Micro-movements during PAUSE CURSOR_MICRO_DISTANCE: 8, // Maximum pixel distance for micro-movements // Cursor Reading Position CURSOR_READING_X_MIN: 0.15, CURSOR_READING_X_MAX: 0.55, CURSOR_READING_Y_MIN: 0.30, CURSOR_READING_Y_MAX: 0.70, // Cursor Line Reading Animation CURSOR_LINE_START_X: 0.12, CURSOR_LINE_END_X: 0.55, CURSOR_LINE_Y: 0.45, CURSOR_LINE_DURATION: 2000, CURSOR_LINE_WAVE: 12 }; // ============================================ // 🔧 MAIN SCRIPT - DON'T EDIT BELOW THIS LINE // ============================================ // Global variables let scrollActive = false; let scrollStartTime = null; let scrollAnimFrame = null; let cursorAnimFrame = null; let timerInterval = null; const customCursor = document.getElementById('customCursor'); let cursorPosX = window.innerWidth / 2; let cursorPosY = window.innerHeight / 2; let cursorTargetX = cursorPosX; let cursorTargetY = cursorPosY; let totalHeight = 0; let currentSpeed = 0; let targetSpeed = 0; let nextPauseTime = 0; let minDuration = SCROLL_SETTINGS.MINIMUM_DURATION; let isCurrentlyScrolling = false; let microPauseEndTime = 0; // Randomization factors let randomDurationFactor = 1; let randomSpeedFactor = 1; let randomInitialPauseFactor = 1; let randomPausePattern = []; let sessionPersonality = {}; // Click tracking let clickScheduled = false; let clickTime = 0; let clickedLinks = []; let newTabReference = null; function startAutoScroll() { if (scrollActive) return; // Generate unique session "personality" sessionPersonality = { readingSpeed: 0.8 + Math.random() * 0.4, pauseFrequency: 0.7 + Math.random() * 0.6, scrollbackTendency: Math.random(), cursorActivity: 0.5 + Math.random() * 1.0, microPauseTendency: Math.random(), clickTendency: Math.random() }; // Generate random factors randomDurationFactor = 1 + (Math.random() - 0.5) * 2 * SCROLL_SETTINGS.RANDOM_DURATION_VARIANCE; randomSpeedFactor = 1 + (Math.random() - 0.5) * 2 * SCROLL_SETTINGS.RANDOM_SPEED_VARIANCE; randomInitialPauseFactor = 1 + (Math.random() - 0.5) * 2 * SCROLL_SETTINGS.RANDOM_INITIAL_PAUSE_VARIANCE; randomDurationFactor *= sessionPersonality.readingSpeed; randomSpeedFactor *= sessionPersonality.readingSpeed; // Generate random pause pattern randomPausePattern = []; const numPauses = 15 + Math.floor(Math.random() * 10); for (let i = 0; i < numPauses; i++) { randomPausePattern.push({ position: Math.random(), duration: SCROLL_SETTINGS.PAUSE_MIN_DURATION + Math.random() * (SCROLL_SETTINGS.PAUSE_MAX_DURATION - SCROLL_SETTINGS.PAUSE_MIN_DURATION), used: false }); } randomPausePattern.sort((a, b) => a.position - b.position); // Schedule random click clickScheduled = false; clickedLinks = []; newTabReference = null; if (SCROLL_SETTINGS.ENABLE_RANDOM_CLICKS && Math.random() < SCROLL_SETTINGS.CLICK_PROBABILITY * sessionPersonality.clickTendency) { clickTime = SCROLL_SETTINGS.CLICK_MIN_TIME + Math.random() * (SCROLL_SETTINGS.CLICK_MAX_TIME - SCROLL_SETTINGS.CLICK_MIN_TIME); clickScheduled = true; console.log('Click scheduled at:', Math.floor(clickTime / 1000), 'seconds'); } // Reset scroll to top window.scrollTo({top: 0, behavior: 'instant'}); scrollActive = true; scrollStartTime = Date.now(); // Calculate total scrollable height totalHeight = Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ) - window.innerHeight; // Calculate duration const contentLength = totalHeight; const estimatedTime = Math.max( SCROLL_SETTINGS.MINIMUM_DURATION, (contentLength / 500) * SCROLL_SETTINGS.MINIMUM_DURATION ); minDuration = estimatedTime * randomDurationFactor; // Base speed const totalFrames = (minDuration / 1000) * 60; const baseSpeed = totalHeight / totalFrames; targetSpeed = baseSpeed * randomSpeedFactor; currentSpeed = SCROLL_SETTINGS.MIN_SCROLL_SPEED; // Show cursor if (customCursor) { customCursor.classList.add('active'); document.body.style.cursor = 'none'; } // Position cursor const startXVariance = sessionPersonality.cursorActivity * 0.1; const startYVariance = sessionPersonality.cursorActivity * 0.1; cursorPosX = window.innerWidth * (0.25 + (Math.random() - 0.5) * startXVariance); cursorPosY = window.innerHeight * (0.35 + (Math.random() - 0.5) * startYVariance); cursorTargetX = cursorPosX; cursorTargetY = cursorPosY; updateScrollStatus('Starting...'); // Initial pause const initialPause = SCROLL_SETTINGS.INITIAL_PAUSE_TIME * randomInitialPauseFactor; nextPauseTime = Date.now() + initialPause; currentSpeed = SCROLL_SETTINGS.MIN_SCROLL_SPEED; targetSpeed = 1.0; isCurrentlyScrolling = false; microPauseEndTime = 0; // Start animations animateCursor(); animateScroll(); startTimer(); console.log('Session Personality:', sessionPersonality); } function animateScroll() { if (!scrollActive) return; const now = Date.now(); const elapsed = now - scrollStartTime; const currentPos = window.pageYOffset || document.documentElement.scrollTop; // Check if it's time to perform random click if (clickScheduled && elapsed >= clickTime && clickedLinks.length === 0) { performRandomClick(); return; } // Check if finished if (elapsed >= minDuration || currentPos >= totalHeight - 10) { finishScroll(); return; } const targetPosition = (elapsed / minDuration) * totalHeight; const scrollProgress = currentPos / totalHeight; // Check for micro-pause if (now < microPauseEndTime) { scrollAnimFrame = requestAnimationFrame(animateScroll); return; } if (now < nextPauseTime) { // PAUSE isCurrentlyScrolling = false; updateScrollStatus('Reading...'); } else { // SCROLL PHASE isCurrentlyScrolling = true; // Random scrollback if (SCROLL_SETTINGS.ENABLE_RANDOM_SCROLLBACK && Math.random() < SCROLL_SETTINGS.SCROLLBACK_PROBABILITY * sessionPersonality.scrollbackTendency && currentPos > 100 && elapsed > 15000) { const scrollbackAmount = Math.random() * SCROLL_SETTINGS.SCROLLBACK_DISTANCE; window.scrollTo(0, Math.max(0, currentPos - scrollbackAmount)); updateScrollStatus('Re-reading...'); nextPauseTime = now + (1000 + Math.random() * 1500); isCurrentlyScrolling = false; scrollAnimFrame = requestAnimationFrame(animateScroll); return; } // Micro-pause if (SCROLL_SETTINGS.ENABLE_MICRO_PAUSES && Math.random() < SCROLL_SETTINGS.MICRO_PAUSE_PROBABILITY * sessionPersonality.microPauseTendency) { microPauseEndTime = now + SCROLL_SETTINGS.MICRO_PAUSE_DURATION; scrollAnimFrame = requestAnimationFrame(animateScroll); return; } // Check predetermined pause points let shouldPause = false; for (let i = 0; i < randomPausePattern.length; i++) { const pausePoint = randomPausePattern[i]; if (scrollProgress >= pausePoint.position && scrollProgress < pausePoint.position + 0.05) { if (!pausePoint.used) { shouldPause = true; pausePoint.used = true; const pauseDuration = pausePoint.duration * (1 + (Math.random() - 0.5) * SCROLL_SETTINGS.RANDOM_PAUSE_VARIANCE) * sessionPersonality.pauseFrequency; nextPauseTime = now + pauseDuration; isCurrentlyScrolling = false; moveCursorReading(); updateScrollStatus('Pausing...'); break; } } } // Random additional pauses if (!shouldPause && elapsed > SCROLL_SETTINGS.PAUSE_START_AFTER) { const adjustedFrequency = SCROLL_SETTINGS.PAUSE_FREQUENCY * sessionPersonality.pauseFrequency; if (Math.random() < adjustedFrequency) { const pauseDuration = SCROLL_SETTINGS.PAUSE_MIN_DURATION + Math.random() * (SCROLL_SETTINGS.PAUSE_MAX_DURATION - SCROLL_SETTINGS.PAUSE_MIN_DURATION); nextPauseTime = now + pauseDuration * (1 + (Math.random() - 0.5) * SCROLL_SETTINGS.RANDOM_PAUSE_VARIANCE); isCurrentlyScrolling = false; moveCursorReading(); updateScrollStatus('Pausing...'); } } if (isCurrentlyScrolling) { updateScrollStatus('Scrolling...'); // Random speed variations if (SCROLL_SETTINGS.ENABLE_SPEED_VARIATIONS && Math.random() < SCROLL_SETTINGS.SPEED_CHANGE_PROBABILITY) { randomSpeedFactor = 1 + (Math.random() - 0.5) * SCROLL_SETTINGS.RANDOM_SPEED_VARIANCE; } const remainingTime = minDuration - elapsed; const remainingDistance = totalHeight - currentPos; if (remainingTime > 0 && remainingDistance > 0) { targetSpeed = (remainingDistance / remainingTime) * SCROLL_SETTINGS.SPEED_MULTIPLIER * randomSpeedFactor * sessionPersonality.readingSpeed; currentSpeed += (targetSpeed - currentSpeed) * SCROLL_SETTINGS.SPEED_SMOOTHING; const jitter = (Math.random() - 0.5) * 0.5; let finalSpeed = Math.max(SCROLL_SETTINGS.MIN_SCROLL_SPEED, currentSpeed + jitter); const newPos = Math.min(currentPos + finalSpeed, totalHeight); window.scrollTo(0, newPos); updateCursorForScroll(); } } } scrollAnimFrame = requestAnimationFrame(animateScroll); } function animateCursor() { if (!scrollActive || !customCursor) return; const followSpeed = SCROLL_SETTINGS.CURSOR_FOLLOW_SPEED * sessionPersonality.cursorActivity; cursorPosX += (cursorTargetX - cursorPosX) * followSpeed; cursorPosY += (cursorTargetY - cursorPosY) * followSpeed; customCursor.style.left = cursorPosX + 'px'; customCursor.style.top = cursorPosY + 'px'; if (!isCurrentlyScrolling) { const adjustedProbability = SCROLL_SETTINGS.CURSOR_MICRO_MOVEMENT_PAUSE * sessionPersonality.cursorActivity; if (Math.random() < adjustedProbability) { const distance = SCROLL_SETTINGS.CURSOR_MICRO_DISTANCE * sessionPersonality.cursorActivity; cursorTargetX += (Math.random() - 0.5) * distance; cursorTargetY += (Math.random() - 0.5) * distance; } } cursorAnimFrame = requestAnimationFrame(animateCursor); } function updateCursorForScroll() { // DO NOTHING - cursor stays still while scrolling } function updateCursorPosition() { const readingX = window.innerWidth * SCROLL_SETTINGS.CURSOR_READING_X_MIN + Math.random() * window.innerWidth * (SCROLL_SETTINGS.CURSOR_READING_X_MAX - SCROLL_SETTINGS.CURSOR_READING_X_MIN); const readingY = window.innerHeight * SCROLL_SETTINGS.CURSOR_READING_Y_MIN + Math.random() * window.innerHeight * (SCROLL_SETTINGS.CURSOR_READING_Y_MAX - SCROLL_SETTINGS.CURSOR_READING_Y_MIN); cursorTargetX = readingX; cursorTargetY = readingY; } function moveCursorReading() { const startX = window.innerWidth * SCROLL_SETTINGS.CURSOR_LINE_START_X; const endX = window.innerWidth * SCROLL_SETTINGS.CURSOR_LINE_END_X; const midY = window.innerHeight * SCROLL_SETTINGS.CURSOR_LINE_Y; const duration = SCROLL_SETTINGS.CURSOR_LINE_DURATION; const startMoveTime = Date.now(); function moveCursor() { if (!scrollActive) return; const elapsed = Date.now() - startMoveTime; const progress = Math.min(elapsed / duration, 1); const easeProgress = progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2; cursorTargetX = startX + (endX - startX) * easeProgress; cursorTargetY = midY + Math.sin(easeProgress * Math.PI) * SCROLL_SETTINGS.CURSOR_LINE_WAVE; if (progress < 1) { setTimeout(moveCursor, 16); } } moveCursor(); } function performRandomClick() { updateScrollStatus('Looking for link...'); const allLinks = Array.from(document.querySelectorAll('a[href]')).filter(link => { const href = link.getAttribute('href'); const rect = link.getBoundingClientRect(); const isVisible = rect.top >= 0 && rect.bottom <= window.innerHeight && rect.width > 0 && rect.height > 0; const isInternal = href && (!href.startsWith('http://') && !href.startsWith('https://') || (href && href.includes(window.location.hostname))); const notControl = !link.closest('.scroll-controls'); const notClicked = !clickedLinks.includes(link); return isVisible && isInternal && notControl && notClicked && href && href !== '#'; }); if (allLinks.length === 0) { console.log('No suitable links found for clicking'); clickScheduled = false; scrollAnimFrame = requestAnimationFrame(animateScroll); return; } const targetLink = allLinks[Math.floor(Math.random() * allLinks.length)]; clickedLinks.push(targetLink); console.log('Selected link to click:', targetLink.href); moveCursorToElement(targetLink, () => { if (SCROLL_SETTINGS.CLICK_HOVER_BEFORE) { updateScrollStatus('Hovering link...'); const hoverDuration = SCROLL_SETTINGS.CLICK_HOVER_DURATION + Math.random() * 1200; const hoverEvent = new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window }); targetLink.dispatchEvent(hoverEvent); setTimeout(() => { clickLink(targetLink); }, hoverDuration); } else { clickLink(targetLink); } }); } function moveCursorToElement(element, callback) { const rect = element.getBoundingClientRect(); const targetX = rect.left + rect.width * (0.3 + Math.random() * 0.4); const targetY = rect.top + rect.height * (0.3 + Math.random() * 0.4); const startX = cursorTargetX; const startY = cursorTargetY; const duration = 800 + Math.random() * 700; const startTime = Date.now(); function animate() { const elapsed = Date.now() - startTime; const progress = Math.min(elapsed / duration, 1); const easeProgress = progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2; cursorTargetX = startX + (targetX - startX) * easeProgress; cursorTargetY = startY + (targetY - startY) * easeProgress; if (progress < 1) { setTimeout(animate, 16); } else { if (callback) callback(); } } animate(); } function clickLink(link) { updateScrollStatus('Clicking link...'); if (SCROLL_SETTINGS.CLICK_IN_NEW_TAB) { const href = link.href; newTabReference = window.open(href, '_blank'); console.log('Opened link in new tab:', href); if (SCROLL_SETTINGS.CLICK_CLOSE_TAB_AFTER && newTabReference) { const viewTime = SCROLL_SETTINGS.CLICK_TAB_VIEW_TIME + Math.random() * 5000; setTimeout(() => { if (newTabReference && !newTabReference.closed) { newTabReference.close(); console.log('Closed new tab after viewing'); } updateScrollStatus('Resuming reading...'); setTimeout(() => { if (scrollActive) { scrollAnimFrame = requestAnimationFrame(animateScroll); } }, 500); }, viewTime); } else { setTimeout(() => { if (scrollActive) { scrollAnimFrame = requestAnimationFrame(animateScroll); } }, 1000); } } else { link.click(); } clickScheduled = false; } function startTimer() { timerInterval = setInterval(() => { if (!scrollActive) return; const elapsed = Date.now() - scrollStartTime; const seconds = Math.floor(elapsed / 1000); const minutes = Math.floor(seconds / 60); const secs = seconds % 60; const timerElement = document.getElementById('scrollTimer'); if (timerElement) { timerElement.textContent = String(minutes).padStart(2, '0') + ':' + String(secs).padStart(2, '0'); } const currentPos = window.pageYOffset || document.documentElement.scrollTop; const scrollProg = totalHeight > 0 ? (currentPos / totalHeight) * 100 : 0; const timeProg = (elapsed / minDuration) * 100; const displayProg = Math.min(Math.max(scrollProg, timeProg), 100); const progressElement = document.getElementById('scrollProgress'); if (progressElement) { progressElement.style.width = displayProg + '%'; } }, 100); } function finishScroll() { window.scrollTo(0, totalHeight); const finalTime = Date.now() - scrollStartTime; const finalSecs = Math.floor(finalTime / 1000); const mins = Math.floor(finalSecs / 60); const secs = finalSecs % 60; const timerElement = document.getElementById('scrollTimer'); if (timerElement) { timerElement.textContent = String(mins).padStart(2, '0') + ':' + String(secs).padStart(2, '0'); } const progressElement = document.getElementById('scrollProgress'); if (progressElement) { progressElement.style.width = '100%'; } updateScrollStatus('Completed!'); setTimeout(stopAutoScroll, 2000); } function stopAutoScroll() { scrollActive = false; scrollStartTime = null; currentSpeed = 0; targetSpeed = 0; if (scrollAnimFrame) { cancelAnimationFrame(scrollAnimFrame); scrollAnimFrame = null; } if (cursorAnimFrame) { cancelAnimationFrame(cursorAnimFrame); cursorAnimFrame = null; } if (timerInterval) { clearInterval(timerInterval); timerInterval = null; } if (customCursor) { customCursor.classList.remove('active'); } document.body.style.cursor = ''; const timerElement = document.getElementById('scrollTimer'); if (timerElement && timerElement.textContent === '00:00') { const progressElement = document.getElementById('scrollProgress'); if (progressElement) { progressElement.style.width = '0%'; } } updateScrollStatus('Stopped'); } function updateScrollStatus(text) { const statusElement = document.getElementById('scrollStatus'); if (statusElement) { statusElement.textContent = text; } } // Stop on user interaction let lastMouseMove = 0; let significantMoveCount = 0; document.addEventListener('mousemove', function(e) { if (!scrollActive) return; const now = Date.now(); if (now - lastMouseMove < 100) return; lastMouseMove = now; significantMoveCount++; if (significantMoveCount > 5) { stopAutoScroll(); significantMoveCount = 0; } }); window.addEventListener('wheel', function(e) { if (scrollActive) { e.preventDefault(); stopAutoScroll(); } }, {passive: false}); window.addEventListener('touchstart', function() { if (scrollActive) stopAutoScroll(); }); window.addEventListener('keydown', function(e) { if (scrollActive && [32, 33, 34, 35, 36, 37, 38, 39, 40].includes(e.keyCode)) { e.preventDefault(); stopAutoScroll(); } }); setTimeout(function() { significantMoveCount = 0; }, 1000);