您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
定时自动检测点击进入云机(带倒计时显示)
// ==UserScript== // @name 139Phone自动进入程序 // @description 定时自动检测点击进入云机(带倒计时显示) // @namespace kba_139_phone // @author kkkkkba // @license MIT // @match https://cloudphoneh5.buy.139.com/* // @match https://cloud139.com/* // @grant GM_notification // @grant GM_addStyle // @run-at document-idle // @version 1.4.5 // ==/UserScript== (function() { 'use strict'; // 配置项 const config = { // 测试用5秒 intervalTime: 5 * 1000, // 正式使用3分钟 // intervalTime: 3 * 60 * 1000, // 显示通知 showNotifications: false, // 显示倒计时 showCountdown: true, buttons: [ { name: "进入云机", selector: 'span[data-v-01aeb1d6].normal, span.normal[data-v-01aeb1d6]', textMatch: "进入云机" }, { name: "重连", selector: 'span.van-button__text', textMatch: "重连" }, { name: "现在进入", selector: 'span.van-button__text', textMatch: "现在进入" }, { name: "知道了", selector: 'span.van-button__text', textMatch: "知道了" }, ], }; GM_addStyle(` .auto-clicker-notification { position: fixed; bottom: 60px; right: 20px; max-width: 300px; padding: 8px 12px; background: rgba(0, 0, 0, 0.8); color: white; border-radius: 4px; font-size: 14px; z-index: 99998; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); animation: fadeIn 0.3s, fadeOut 0.3s 2.7s forwards; transform: translateZ(0); font-family: monospace; line-height: 1.4; pointer-events: none; user-select: none; } .countdown-display { position: fixed; bottom: 10px; right: 20px; padding: 5px 10px; background: rgba(0, 0, 0, 0.5); color: #2ecc71; border-radius: 4px; font-size: 13px; z-index: 99998; font-family: monospace; pointer-events: none; user-select: none; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } `); // 运行状态 const state = { startTime: new Date(), lastClickTime: new Date(), nextCheckTime: new Date(), countdownElement: null }; // 初始化倒计时显示 function initCountdownDisplay() { if (!config.showCountdown) return; state.countdownElement = document.createElement('div'); state.countdownElement.className = 'countdown-display'; state.countdownElement.textContent = '0'; document.body.appendChild(state.countdownElement); // 每秒更新倒计时 setInterval(updateCountdown, 1000); } // 更新倒计时显示 function updateCountdown() { if (!state.countdownElement) return; const now = new Date(); const timeLeft = Math.max(0, state.nextCheckTime - now); const secondsLeft = Math.ceil(timeLeft / 1000); const sinceLastClick = now - state.lastClickTime; // state.countdownElement.textContent = `⏳ 下次检测: ${formatDuration(timeLeft)} | ⏱️ 上次点击: ${formatDuration(sinceLastClick)}前`; // 快到时变为黄色 if (secondsLeft <= 10) { state.countdownElement.style.color = '#E54438'; } else { state.countdownElement.style.color = '#2ecc71'; } } // 格式化时间为 HH:MM:SS function formatDuration(ms) { const totalSeconds = Math.floor(ms / 1000); const hours = Math.floor(totalSeconds / 3600); const minutes = Math.floor((totalSeconds % 3600) / 60); const seconds = totalSeconds % 60; return [ hours.toString().padStart(2, '0'), minutes.toString().padStart(2, '0'), seconds.toString().padStart(2, '0') ].join(':'); } // 显示通知 function showNotification(message, type = 'info') { if (!config.showNotifications) return; const colors = { info: '#3498db', success: '#2ecc71', warning: '#f39c12', error: '#e74c3c' }; const notification = document.createElement('div'); notification.className = 'auto-clicker-notification'; notification.textContent = message; notification.style.backgroundColor = colors[type] || colors.info; document.body.appendChild(notification); setTimeout(() => { notification.remove(); }, 3000); } // 查找目标元素 function findTargetElements() { const foundElements = []; config.buttons.forEach(buttonConfig => { let elements = Array.from(document.querySelectorAll(buttonConfig.selector)); if (buttonConfig.textMatch) { elements = elements.filter(el => el.textContent.includes(buttonConfig.textMatch) ); } if (elements.length > 0) { foundElements.push({ config: buttonConfig, element: elements[0] }); } }); return foundElements; } // 模拟点击 function simulateClick(element, buttonName) { if (!element) return false; try { element.scrollIntoViewIfNeeded(); const events = [ new MouseEvent('mouseover', { bubbles: true }), new MouseEvent('mousemove', { bubbles: true }), new MouseEvent('mousedown', { bubbles: true }), new MouseEvent('mouseup', { bubbles: true }), new MouseEvent('click', { bubbles: true }) ]; events.forEach(event => { setTimeout(() => { element.dispatchEvent(event); }, 50); }); // 更新最后点击时间 state.lastClickTime = new Date(); return true; } catch (e) { showNotification(`点击 ${buttonName} 失败`, 'error'); return false; } } // 主点击函数 function autoClickButtons() { if (document.hidden) return; // 更新下次检测时间 state.nextCheckTime = new Date(Date.now() + config.intervalTime); const targetElements = findTargetElements(); if (targetElements.length > 0) { targetElements.forEach(({config: btnConfig, element}) => { if (simulateClick(element, btnConfig.name)) { showNotification(`✅ 已点击 ${btnConfig.name}`, 'success'); } else { showNotification(`⚠️ ${btnConfig.name} 点击未成功`, 'warning'); } }); } else { // 显示未找到按钮和运行时长 const now = new Date(); const sinceLastClick = now - state.lastClickTime; showNotification( `⌛ 上次点击 ${formatDuration(sinceLastClick)}前`, 'info' ); } } // 定时器控制 let intervalId = null; function startInterval() { stopInterval(); state.startTime = new Date(); state.lastClickTime = new Date(); state.nextCheckTime = new Date(Date.now() + config.intervalTime); initCountdownDisplay(); autoClickButtons(); intervalId = setInterval(autoClickButtons, config.intervalTime); showNotification(`🔄 自动点击已启动\n间隔: ${config.intervalTime/1000}秒`, 'info'); } function stopInterval() { if (intervalId) { clearInterval(intervalId); intervalId = null; if (state.countdownElement) { state.countdownElement.remove(); state.countdownElement = null; } showNotification('⏹️ 自动点击已停止', 'info'); } } // 初始化 document.addEventListener('visibilitychange', () => { if (!document.hidden) autoClickButtons(); }); if (document.readyState === 'complete' || document.readyState === 'interactive') { setTimeout(startInterval, 1000); } else { document.addEventListener('DOMContentLoaded', () => { setTimeout(startInterval, 1000); }); } // 全局API window.AutoClicker = { start: startInterval, stop: stopInterval, clickNow: autoClickButtons, setInterval: function(ms) { config.intervalTime = ms; startInterval(); }, toggleNotifications: function(show) { config.showNotifications = show !== false; showNotification(`通知已${config.showNotifications ? '开启' : '关闭'}`); }, toggleCountdown: function(show) { config.showCountdown = show !== false; if (show && intervalId && !state.countdownElement) { initCountdownDisplay(); } else if (!show && state.countdownElement) { state.countdownElement.remove(); state.countdownElement = null; } }, getStatus: function() { const now = new Date(); return { isRunning: intervalId !== null, nextCheck: state.nextCheckTime ? new Date(state.nextCheckTime) : null, lastClick: new Date(state.lastClickTime), runtime: formatDuration(now - state.startTime), sinceLastClick: formatDuration(now - state.lastClickTime) }; } }; })();