您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Auto clicks Work.ink buttons with human-like mouse events, random delays
// ==UserScript== // @name Work.ink Auto Clicker Human-Like // @namespace http://tampermonkey.net/ // @version 1.6 // @description Auto clicks Work.ink buttons with human-like mouse events, random delays // @author Shiva // @match *://*.work.ink/* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; // 🔹 Helper: random wait (1–3s by default) function wait(min = 1000, max = 3000) { const delay = Math.floor(Math.random() * (max - min + 1)) + min; return new Promise(resolve => setTimeout(resolve, delay)); } // 🔹 Human-like click for normal steps function simulateMouseClick(element) { if (!element) return false; element.scrollIntoView({ behavior: "smooth", block: "center" }); element.focus(); const rect = element.getBoundingClientRect(); const clientX = rect.left + rect.width / 2 + (Math.random() * 4 - 2); // jitter const clientY = rect.top + rect.height / 2 + (Math.random() * 4 - 2); const opts = { bubbles: true, cancelable: true, view: window, clientX, clientY, screenX: window.screenX + clientX, screenY: window.screenY + clientY, buttons: 1 }; const events = [ "pointerover", "pointerenter", "mouseover", "mouseenter", "pointerdown", "mousedown", "pointerup", "mouseup", "click" ]; events.forEach((type, i) => { setTimeout(() => { element.dispatchEvent(new PointerEvent(type, opts)); }, i * (10 + Math.random() * 30)); }); return true; } // 🔹 Helper: wait for element function waitForElement(selector, timeout = 60000) { return new Promise((resolve, reject) => { const start = Date.now(); const interval = setInterval(() => { const el = document.querySelector(selector); if (el) { clearInterval(interval); resolve(el); } else if (Date.now() - start > timeout) { clearInterval(interval); reject(`Timeout waiting for element: ${selector}`); } }, 500); }); } // 🔹 YOUR ORIGINAL final button logic (unchanged) function waitAndClickFinalButton(selector, delay = 1000) { const interval = setInterval(() => { const el = document.querySelector(selector); if (el && !el.disabled && el.offsetParent !== null) { console.log("✅ Final button is now enabled. Clicking..."); el.scrollIntoView({ behavior: "smooth", block: "center" }); el.focus(); ['pointerdown', 'mousedown', 'mouseup', 'click'].forEach(type => { el.dispatchEvent(new MouseEvent(type, { bubbles: true, cancelable: true, view: window, buttons: 1 })); }); console.log("✅ Final button clicked. Stopping retries."); clearInterval(interval); } else { console.log("⏳ Final button still disabled. Waiting..."); } }, delay); } // 🔹 Step sequence (async function runSteps() { try { const el1 = await waitForElement('div.button.large.accessBtn'); console.log("Step 1: Go To Destination"); await wait(); simulateMouseClick(el1); const adsBtn = await waitForElement('button:contains("Continue With Ads")'); console.log("Step 2: Continue With Ads"); await wait(); simulateMouseClick(adsBtn); const el2 = await waitForElement('div.button.large.accessBtn'); console.log("Step 3: Go To Destination Again"); await wait(); simulateMouseClick(el2); const finalBtn = await waitForElement('button span:contains("Proceed to Safe Destination")'); console.log("Step 4: Proceed to Safe Destination"); await wait(); simulateMouseClick(finalBtn.closest("button")); console.log("⏳ Waiting for final access button..."); waitAndClickFinalButton('#access-offers', 5000); } catch (err) { console.error("⚠️ Script error:", err); } })(); // 🔹 Add :contains() pseudo support (function() { const contains = (selector) => { const regex = /:contains\(["']?(.+?)["']?\)/; if (!regex.test(selector)) return null; const text = selector.match(regex)[1]; const baseSelector = selector.replace(regex, ''); return [...document.querySelectorAll(baseSelector)] .find(el => el.textContent.trim().includes(text)); }; document.querySelector = new Proxy(document.querySelector, { apply(target, thisArg, args) { if (args[0].includes(':contains')) { return contains(args[0]); } return Reflect.apply(target, thisArg, args); } }); })(); // 🔹 Remove "done" banners const observer = new MutationObserver(() => { const banner = document.querySelector('.done-banner-container'); if (banner) banner.remove(); }); observer.observe(document.body, { childList: true, subtree: true }); })();