Greasy Fork is available in English.
Этот скрипт обнаруживает и автоматически нажимает кнопки, которые становятся активными. Он был протестирован и работает правильно на странице https://app.runwayml.com/*.
// ==UserScript== // @name Auto Click Enabled Button // @name:zh-CN 自动点击启用按钮 // @name:en Auto Click Enabled Button // @name:hi ऑटो क्लिक सक्षम बटन // @name:fr Bouton de clic automatique activé // @name:ar زر النقر التلقائي عند التمكين // @name:bg Автоматично кликване на активиран бутон // @name:ru Автоматическое нажатие на активированные кнопки // @name:pt-BR Botão de Clique Automático Habilitado // @name:id Tombol Klik Otomatis yang Diaktifkan // @name:zh-TW 自動點擊啟用按鈕 // @namespace http://tampermonkey.net/ // @version 2.6 // @description This script detects and automatically clicks buttons that become enabled // @description:en This script detects and automatically clicks buttons that become enabled. It has been tested and works correctly on the https://app.runwayml.com/* page. // @description:zh-CN 这个脚本可以探测并自动点击变为可用状态的按钮。该脚本于 https://app.runwayml.com/* 页面测试正常运行。 // @description:hi यह स्क्रिप्ट बटन को पहचानती है और स्वचालित रूप से क्लिक करती है जो सक्षम हो जाते हैं। इसका परीक्षण https://app.runwayml.com/* पृष्ठ पर किया गया है और यह सही ढंग से काम करता है। // @description:fr Ce script détecte et clique automatiquement sur les boutons qui deviennent activés. Il a été testé et fonctionne correctement sur la page https://app.runwayml.com/*. // @description:ar يكتشف هذا البرنامج النصي الأزرار التي تصبح ممكّنة وينقر عليها تلقائيًا. تم اختباره ويعمل بشكل صحيح على صفحة https://app.runwayml.com/*. // @description:bg Този скрипт открива и автоматично кликва върху бутони, които стават активни. Тестван е и работи правилно на страницата https://app.runwayml.com/*. // @description:ru Этот скрипт обнаруживает и автоматически нажимает кнопки, которые становятся активными. Он был протестирован и работает правильно на странице https://app.runwayml.com/*. // @description:pt-BR Este script detecta e clica automaticamente em botões que se tornam habilitados. Ele foi testado e funciona corretamente na página https://app.runwayml.com/*. // @description:id Skrip ini mendeteksi dan mengklik tombol yang menjadi aktif secara otomatis. Skrip ini telah diuji dan berfungsi dengan baik di halaman https://app.runwayml.com/*. // @description:zh-TW 此腳本可以檢測並自動點擊變為可用狀態的按鈕。經測試,該腳本在 https://app.runwayml.com/* 頁面上正常運行。 // @author HDR10 // @match https://*/* // @match https://app.runwayml.com/* // @grant none // @license Apache License 2.0 // ==/UserScript== (function() { 'use strict'; // 多语言支持的按钮文本 const texts = { en: { title: "Auto Click Enabled Button", statusStopped: "Auto-clicking stopped", statusStarted: "Auto-clicking enabled", start: "Enable", stop: "Stop", clickLimit: "Stop after clicking:", clearLog: "Clear log", minimize: "Minimize" }, "zh-CN": { title: "自动点击启用按钮", statusStopped: "自动点击已停止", statusStarted: "自动点击已启用", start: "启用", stop: "停止", clickLimit: "点击几次后停止:", clearLog: "清除log", minimize: "最小化" }, hi: { title: "ऑटो क्लिक सक्षम बटन", statusStopped: "स्वचालित क्लिक बंद हो गया", statusStarted: "स्वचालित क्लिक सक्षम", start: "सक्षम करें", stop: "रोकें", clickLimit: "क्लिक करने के बाद रोकें:", clearLog: "लॉग साफ़ करें", minimize: "छोटा करें" }, fr: { title: "Bouton de clic automatique activé", statusStopped: "Clic automatique arrêté", statusStarted: "Clic automatique activé", start: "Activer", stop: "Arrêter", clickLimit: "Arrêter après avoir cliqué:", clearLog: "Effacer le journal", minimize: "Minimiser" }, ar: { title: "زر النقر التلقائي عند التمكين", statusStopped: "توقف النقر التلقائي", statusStarted: "تمكين النقر التلقائي", start: "تمكين", stop: "إيقاف", clickLimit: "توقف بعد النقر:", clearLog: "مسح السجل", minimize: "تصغير" }, bg: { title: "Автоматично кликване на активиран бутон", statusStopped: "Автоматичното кликване е спряно", statusStarted: "Автоматичното кликване е активирано", start: "Активирай", stop: "Спри", clickLimit: "Спри след кликване:", clearLog: "Изчисти дневника", minimize: "Минимизирай" }, ru: { title: "Автоматическое нажатие на активированные кнопки", statusStopped: "Автоклик остановлен", statusStarted: "Автоклик активирован", start: "Активировать", stop: "Остановить", clickLimit: "Остановить после кликов:", clearLog: "Очистить журнал", minimize: "Свернуть" }, "pt-BR": { title: "Botão de Clique Automático Habilitado", statusStopped: "Clique automático parado", statusStarted: "Clique automático habilitado", start: "Habilitar", stop: "Parar", clickLimit: "Parar após clicar:", clearLog: "Limpar log", minimize: "Minimizar" }, id: { title: "Tombol Klik Otomatis yang Diaktifkan", statusStopped: "Klik otomatis dihentikan", statusStarted: "Klik otomatis diaktifkan", start: "Aktifkan", stop: "Hentikan", clickLimit: "Berhenti setelah mengklik:", clearLog: "Hapus log", minimize: "Minimalkan" }, "zh-TW": { title: "自動點擊啟用按鈕", statusStopped: "自動點擊已停止", statusStarted: "自動點擊已啟用", start: "啟用", stop: "停止", clickLimit: "點擊幾次後停止:", clearLog: "清除log", minimize: "最小化" } }; // 获取浏览器语言,默认为英文 const lang = navigator.language || navigator.userLanguage; const userLang = lang.startsWith('zh') ? (lang === 'zh-TW' ? 'zh-TW' : 'zh-CN') : (texts[lang] ? lang : 'en'); const t = texts[userLang]; // 创建浮窗 const floatWindow = document.createElement('div'); floatWindow.style.position = 'fixed'; floatWindow.style.bottom = '10px'; floatWindow.style.right = '10px'; floatWindow.style.width = '400px'; floatWindow.style.height = '250px'; floatWindow.style.backgroundColor = 'white'; floatWindow.style.border = '1px solid black'; floatWindow.style.color = 'black'; floatWindow.style.padding = '10px'; floatWindow.style.overflowY = 'auto'; floatWindow.style.zIndex = '10000'; floatWindow.style.display = 'none'; // 初始状态为最小化 floatWindow.innerHTML = ` <div> <div id="dragHandle" style="width: 20px; height: 20px; background-color: gray; position: absolute; top: 5px; right: 5px; cursor: move;"></div> <h3>${t.title}</h3> <p id="statusLabel">${t.statusStopped}</p> <button id="startBtn">${t.start}</button> <button id="stopBtn">${t.stop}</button> <label for="clickLimit">${t.clickLimit}</label> <input type="number" id="clickLimit" value="0" min="0" style="width: 50px;"> <div id="logContainer" style="height: 100px; background-color: white; border: 1px solid black; overflow-y: auto;"></div> <button id="clearLogBtn">${t.clearLog}</button> <button id="minimizeBtn">${t.minimize}</button> </div> `; document.body.appendChild(floatWindow); // 创建最小化图标 const minimizeIcon = document.createElement('div'); minimizeIcon.style.position = 'fixed'; minimizeIcon.style.bottom = '10px'; minimizeIcon.style.right = '10px'; minimizeIcon.style.width = '40px'; minimizeIcon.style.height = '40px'; minimizeIcon.style.backgroundColor = 'white'; minimizeIcon.style.border = '1px solid black'; minimizeIcon.style.borderRadius = '50%'; minimizeIcon.style.display = 'flex'; minimizeIcon.style.alignItems = 'center'; minimizeIcon.style.justifyContent = 'center'; minimizeIcon.style.cursor = 'pointer'; minimizeIcon.style.zIndex = '10000'; minimizeIcon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-4.41 3.59-8 8-8 4.41 0 8 3.59 8 8 0 4.41-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z"/></svg>`; document.body.appendChild(minimizeIcon); let observer; let autoClickEnabled = false; let clickCount = 0; let clickLimit = 0; document.getElementById('startBtn').addEventListener('click', function() { autoClickEnabled = true; clickCount = 0; clickLimit = parseInt(document.getElementById('clickLimit').value, 10); document.getElementById('statusLabel').textContent = t.statusStarted; document.getElementById('statusLabel').style.color = 'green'; minimizeIcon.style.backgroundColor = 'green'; startObserving(); }); document.getElementById('stopBtn').addEventListener('click', function() { autoClickEnabled = false; document.getElementById('statusLabel').textContent = t.statusStopped; document.getElementById('statusLabel').style.color = 'black'; minimizeIcon.style.backgroundColor = 'white'; stopObserving(); }); document.getElementById('clearLogBtn').addEventListener('click', function() { document.getElementById('logContainer').innerHTML = ''; }); document.getElementById('minimizeBtn').addEventListener('click', function() { floatWindow.style.display = 'none'; minimizeIcon.style.display = 'flex'; }); minimizeIcon.addEventListener('click', function() { floatWindow.style.display = 'block'; minimizeIcon.style.display = 'none'; }); function startObserving() { const config = { attributes: true, childList: true, subtree: true }; observer = new MutationObserver(mutationsList => { for (let mutation of mutationsList) { if (mutation.type === 'attributes' && mutation.attributeName === 'disabled') { const target = mutation.target; if (target.tagName.toLowerCase() === 'button' && !target.disabled && autoClickEnabled) { target.click(); clickCount++; logClick(target); if (clickLimit > 0 && clickCount >= clickLimit) { autoClickEnabled = false; document.getElementById('statusLabel').textContent = t.statusStopped; document.getElementById('statusLabel').style.color = 'black'; minimizeIcon.style.backgroundColor = 'white'; stopObserving(); } } } } }); observer.observe(document.body, config); } function stopObserving() { if (observer) { observer.disconnect(); observer = null; } } function logClick(target) { const logContainer = document.getElementById('logContainer'); const timestamp = new Date().toLocaleTimeString(); const logEntry = document.createElement('div'); logEntry.textContent = `${timestamp} - 点击了按钮: ${target.innerText || target.id || 'Unknown'}`; logContainer.appendChild(logEntry); // 保持日志最多显示10行 while (logContainer.children.length > 10) { logContainer.removeChild(logContainer.firstChild); } // 自动滚动到最新日志 logContainer.scrollTop = logContainer.scrollHeight; } // 拖动浮窗功能 const dragHandle = document.getElementById('dragHandle'); let isDragging = false; let startX, startY, initialX, initialY; dragHandle.addEventListener('mousedown', function(e) { isDragging = true; startX = e.clientX; startY = e.clientY; initialX = floatWindow.offsetLeft; initialY = floatWindow.offsetTop; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }); function onMouseMove(e) { if (isDragging) { const dx = e.clientX - startX; const dy = e.clientY - startY; floatWindow.style.left = initialX + dx + 'px'; floatWindow.style.top = initialY + dy + 'px'; } } function onMouseUp() { isDragging = false; document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); } })();