您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动在指定网站模拟鼠标活跃,支持设置面板与快捷键自定义
// ==UserScript== // @name 网课防挂机鼠标自动活跃(带设置面板) // @namespace http://tampermonkey.net/ // @version 2.3 // @description 自动在指定网站模拟鼠标活跃,支持设置面板与快捷键自定义 // @author heyuanwai // @match https://zxpx.mr.mct.gov.cn/* // @match *://*/* // @grant none // @license MIT // ==/UserScript== (function() { // 属性伪装 try { Object.defineProperty(document, 'hidden', { get: () => false }); Object.defineProperty(document, 'visibilityState', { get: () => 'visible' }); } catch (e) {} // 代理addEventListener阻断 const blockEvents = ['blur', 'visibilitychange', 'pagehide']; window.addEventListener = new Proxy(window.addEventListener, { apply(target, thisArg, args) { if(blockEvents.includes(args[0])) return; return Reflect.apply(target, thisArg, args); } }); document.addEventListener = new Proxy(document.addEventListener, { apply(target, thisArg, args) { if(blockEvents.includes(args[0])) return; return Reflect.apply(target, thisArg, args); } }); // 定时清理“属性式”监听 setInterval(function(){ try { window.onblur = null; window.onfocus = null; window.onpagehide = null; window.onvisibilitychange = null; document.onvisibilitychange = null; document.onwebkitvisibilitychange = null; } catch (e) {} }, 2000); })(); (function() { 'use strict'; // --- 设置存储 --- const STORAGE_KEY = 'autoMouseActiveSites'; const TIMEOUT_KEY = 'autoMouseActiveTimeout'; // 预置生效站点 const PRESET_SITES = [ 'zxpx.mr.mct.gov.cn' ]; // 默认参数 let idleTimeout = Number(localStorage.getItem(TIMEOUT_KEY)) || 60000; // 默认1分钟 let minMoveInterval = 1000; let maxMoveInterval = 3000; // 读取已设置的网站 function getSites() { try { const stored = JSON.parse(localStorage.getItem(STORAGE_KEY)); if (stored && stored.length) { // 合并预置 return Array.from(new Set([...PRESET_SITES, ...stored])); } else { return PRESET_SITES.slice(); } } catch (e) { return PRESET_SITES.slice(); } } function setSites(arr) { // 只存储用户自定义,预置在代码中 const userArr = arr.filter(site => !PRESET_SITES.includes(site)); localStorage.setItem(STORAGE_KEY, JSON.stringify(userArr)); } // 判断当前站点是否需要激活 function isSiteActive() { const sites = getSites(); return sites.some(site => window.location.hostname.includes(site)); } // ========== 设置面板 ========== function createPanel() { if (document.getElementById('amap-panel')) return; const panel = document.createElement('div'); panel.id = 'amap-panel'; panel.style = ` position: fixed; z-index: 99999; top: 80px; right: 30px; background: #fff; border: 1px solid #ccc; box-shadow: 0 2px 12px rgba(0,0,0,0.13); border-radius: 10px; padding: 18px 20px 16px 20px; min-width: 350px; font-size: 15px; font-family: sans-serif; color: #333; transition: opacity 0.2s;`; panel.innerHTML = ` <div style="font-size:18px;font-weight:bold;margin-bottom:10px;">自动鼠标活跃 - 网站管理</div> <div style="margin-bottom:6px;">当前名单:</div> <ul id="amap-site-list" style="max-height:120px;overflow-y:auto;padding:0 0 0 15px;margin-bottom:12px;"></ul> <div> <input id="amap-site-input" style="width:200px;" placeholder="输入域名,如 example.com"> <button id="amap-add-btn">添加</button> <button id="amap-add-cur-btn">添加当前网站</button> </div> <div style="margin-top:10px;"> <label>无操作多少秒后恢复自动模拟:</label> <input id="amap-timeout" type="number" min="5" max="600" value="${Math.round(idleTimeout/1000)}" style="width:60px;"> 秒 </div> <div style="margin-top:10px;text-align:right;"> <button id="amap-close-btn">关闭</button> </div> `; document.body.appendChild(panel); function renderSiteList() { const ul = document.getElementById('amap-site-list'); ul.innerHTML = ''; getSites().forEach(site => { const li = document.createElement('li'); li.style = "margin-bottom:2px;"; li.textContent = site + ' '; // 预置站点不能删 if (!PRESET_SITES.includes(site)) { const delBtn = document.createElement('button'); delBtn.textContent = '删除'; delBtn.style = 'font-size:13px;color:#fff;background:#c44;border:none;padding:1px 5px;border-radius:4px;cursor:pointer;'; delBtn.onclick = function() { const arr = getSites().filter(function(s){ return s !== site; }); setSites(arr); renderSiteList(); }; li.appendChild(delBtn); } else { const tag = document.createElement('span'); tag.textContent = '(预置)'; tag.style = 'color:#888;font-size:12px;'; li.appendChild(tag); } ul.appendChild(li); }); } renderSiteList(); document.getElementById('amap-add-btn').onclick = function() { const val = document.getElementById('amap-site-input').value.trim(); if (!val) return; const arr = getSites(); if (!arr.includes(val)) arr.push(val); setSites(arr); document.getElementById('amap-site-input').value = ''; renderSiteList(); }; document.getElementById('amap-add-cur-btn').onclick = function() { const host = window.location.hostname; if (!host) return; const arr = getSites(); if (!arr.includes(host)) arr.push(host); setSites(arr); renderSiteList(); }; document.getElementById('amap-timeout').onchange = function(e) { let sec = Number(e.target.value); if (!sec || sec < 5) sec = 5; if (sec > 600) sec = 600; idleTimeout = sec * 1000; localStorage.setItem(TIMEOUT_KEY, idleTimeout); }; document.getElementById('amap-close-btn').onclick = function() { panel.remove(); }; } // 面板快捷键:Ctrl+Alt+H window.addEventListener('keydown', function(e){ if(e.ctrlKey && e.altKey && e.code === 'KeyH'){ if (!document.getElementById('amap-panel')) createPanel(); } }); // ========== 模拟鼠标活跃 ========== if (!isSiteActive()) return; // 不在名单内则不运行 let userActive = false; let idleTimer = null; let autoMoveTimer = null; function getArea() { return {width: window.innerWidth, height: window.innerHeight}; } function getRandomPosition() { const area = getArea(); return { x: Math.floor(Math.random() * area.width), y: Math.floor(Math.random() * area.height) }; } function triggerMousemove() { const pos = getRandomPosition(); const evt = new MouseEvent('mousemove', { bubbles: true, cancelable: true, clientX: pos.x, clientY: pos.y, screenX: pos.x, screenY: pos.y }); document.dispatchEvent(evt); scheduleAutoMove(); } function scheduleAutoMove() { clearTimeout(autoMoveTimer); autoMoveTimer = setTimeout(triggerMousemove, randomInt(minMoveInterval, maxMoveInterval)); } function onUserActive() { userActive = true; clearTimeout(autoMoveTimer); clearTimeout(idleTimer); idleTimer = setTimeout(function() { userActive = false; triggerMousemove(); }, idleTimeout); } function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } ['mousemove', 'mousedown', 'keydown', 'touchstart'].forEach(function(evtType){ window.addEventListener(evtType, onUserActive, true); }); // 启动 scheduleAutoMove(); // 提示热键 if (window === window.top) { setTimeout(function(){ if (!localStorage.getItem('_amap_tip')) { alert('【自动鼠标活跃】设置面板:\n按下 Ctrl+Alt+H 打开/关闭设置。'); localStorage.setItem('_amap_tip', '1'); } }, 600); } })();