您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Click all buttons with a 750ms delay between each click
// ==UserScript== // @name Give 'Ride-ons' to everyone on Zwift Feed // @namespace typpi.online // @version 2.3 // @description Click all buttons with a 750ms delay between each click // @author Nick2bad4u // @license UnLicense // @homepageURL https://github.com/Nick2bad4u/UserStyles // @grant none // @run-at document-idle // @include *://*.zwift.com/feed // @icon https://www.google.com/s2/favicons?sz=256&domain=zwift.com // ==/UserScript== (function () { 'use strict'; let isClicking = false; let intervalId = null; // Define startStopButton globally let startStopButton = null; // Function to click buttons with a delay using a promise function clickButtonWithDelay(button, delay) { return new Promise((resolve) => { setTimeout(() => { button.scrollIntoView({ behavior: 'smooth', block: 'center', }); button.click(); console.log('Clicked button'); resolve(); }, delay); }); } // Function to click all buttons sequentially async function clickButtonsSequentially(buttons, delay) { for (let i = 0; i < buttons.length; i++) { await clickButtonWithDelay(buttons[i], delay); } } // Main process to find and click buttons, and keep scrolling async function startClickingProcess() { if (isClicking) return; isClicking = true; console.log('Starting the clicking process...'); intervalId = setInterval(async () => { const buttons = Array.from( document.querySelectorAll('.button.button--rideon:not(.clicked)'), ); if (buttons.length > 0) { console.log(`Found ${buttons.length} buttons. Clicking...`); await clickButtonsSequentially(buttons, 750); // 750ms delay buttons.forEach((button) => button.classList.add('clicked')); } else { console.log('No new buttons found at this moment.'); } }, 3000); // Check for new buttons every 3 seconds } // Stop the clicking process function stopClickingProcess() { if (!isClicking) return; isClicking = false; clearInterval(intervalId); intervalId = null; console.log('Stopped the clicking process.'); } // Toggle the clicking process function toggleClickingProcess() { if (isClicking) { stopClickingProcess(); startStopButton.textContent = 'Give Ride-ons'; } else { startClickingProcess(); startStopButton.textContent = 'Stop'; } } // Create a UI integrated into the navbar function createUI() { const navRight = document.querySelector('.PrimaryNav-module__right--_UfGm'); if (!navRight) { console.error('Navbar not found. UI cannot be created.'); return; } const uiContainer = document.createElement('li'); uiContainer.className = 'PrimaryNav-module__hideNav--2X2zV PrimaryNav-module__lessLinks--2fidO'; // Assign to the global variable startStopButton = document.createElement('a'); startStopButton.textContent = 'Give Ride-ons'; startStopButton.className = 'PrimaryNav-module__page-link--24LJd'; startStopButton.style.cursor = 'pointer'; startStopButton.style.marginRight = '10px'; startStopButton.addEventListener('click', toggleClickingProcess); uiContainer.appendChild(startStopButton); navRight.appendChild(uiContainer); } createUI(); })();