// ==UserScript== // @name 图多功能寻眨眼模式 // @namespace http://tampermonkey.net/ // @version 1.52 // @description 进入游戏后1秒自动隐藏全景图像,按空格键刷新页面并翻页 // @author 宇宙百科君 // @match https://tuxun.fun/* // @run-at document-start // @grant none // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 从localStorage初始化眨眼模式状态 var blinkMode = localStorage.getItem('blinkMode') !== 'false'; // 初始化刷新状态 let refreshEnabled = false; // 第1部分:进入游戏后1秒自动隐藏全景图像 let isObserverActive = true; // 添加一个标志来跟踪观察者的状态 let observer = new MutationObserver((mutations) => { if (blinkMode && isObserverActive) { let mapRoot = document.querySelector('.widget-scene-canvas'); if (mapRoot && getComputedStyle(mapRoot).display !== 'none' && getComputedStyle(mapRoot).opacity !== '0') { mapRoot.style.opacity = '0'; isObserverActive = false; // 设置观察者标志为false setTimeout(() => { mapRoot.style.opacity = '1'; // 3秒后显示全景图 setTimeout(() => { mapRoot.style.opacity = '0'; // 再经过3秒隐藏全景图 }, 500); }, 2000); } } }); observer.observe(document.body, { attributes: true, attributeFilter: ['style', 'width', 'height'], subtree: true }); // 第2部分:按空格键刷新页面 async function handleKeyPressForRefresh(e) { // 检查是否按下的是空格键(键码32) if (e.keyCode === 32 && blinkMode) { // 刷新页面前等待0.5秒 await new Promise(resolve => setTimeout(resolve, 500)); // 检查特定DOM元素是否存在 var specificDomElement = document.querySelector('.round_result_center'); if (!specificDomElement && refreshEnabled) { // 如果特定DOM元素不存在且已启用刷新,则刷新页面 location.reload(); } else if (specificDomElement) { // 如果特定DOM元素存在,启用刷新 refreshEnabled = true; } } } // 更改父级容器的高度 let urlPattern = /^https:\/\/tuxun\.fun\/maps-start\?mapsId=\d+$/; if (urlPattern.test(window.location.href)) { // 创建眨眼模式切换按钮 document.addEventListener("DOMContentLoaded", function() { // 创建开关容器元素 var switchContainer = document.createElement('div'); switchContainer.style.position = "relative"; // 设置绝对定位 switchContainer.style.top = "39.5%"; // 设置顶部距离 switchContainer.style.left = "50%"; // 设置左侧距离 switchContainer.style.transform = "translate(-50%, -50%)"; // 将元素居中 switchContainer.style.zIndex = "9999"; // 设置 z-index 层级 switchContainer.style.width = "40px"; // 设置宽度 switchContainer.style.height = "20px"; // 设置高度 switchContainer.style.border = "0px solid rgb(19, 206, 102)"; // 设置边框 switchContainer.style.borderRadius = "25px"; // 设置圆角 switchContainer.style.overflow = ""; // 隐藏溢出内容 switchContainer.style.cursor = "pointer"; // 添加点击指针样式 // 创建一个包含“眨眼模式”文字的元素 var switchLabel = document.createElement('div'); switchLabel.innerText = "眨眼模式"; // 设置文本内容 switchLabel.style.color = "#fff"; // 设置字体颜色为白色 switchLabel.style.backgroundColor = "rgba(0, 0, 0, 0)"; // 添加半透明的黑色背景 switchLabel.style.padding = "0"; // 添加一些内边距 switchLabel.style.borderRadius = "4px"; // 圆角 switchLabel.style.position = "absolute"; // 定位 switchLabel.style.bottom = "100%"; // 放置在开关容器的上方 switchLabel.style.left = "50%"; // 水平居中 switchLabel.style.transform = "translateX(-50%)"; // 调整为从中心点向左偏移,使其完全居中 switchLabel.style.fontFamily = "Arial, sans-serif"; // 字体样式 switchLabel.style.fontSize = "18px"; // 字体大小 switchLabel.style.writingMode = "horizontal-tb"; switchLabel.style.width = "120px"; // 显式设置宽度 switchLabel.style.whiteSpace = "nowrap"; // 防止文本换行 switchLabel.style.textAlign = "center"; // 添加文本居中属性 switchLabel.style.marginBottom = "0"; // 与开关之间的距离 switchContainer.appendChild(switchLabel); // 将标签添加到开关容器中 switchLabel.style.cursor = "text"; // 创建开关背景元素 var switchBackground = document.createElement('div'); switchBackground.style.width = "100%"; // 设置宽度为 100% switchBackground.style.height = "100%"; // 设置高度为 100% switchBackground.style.backgroundColor = blinkMode ? "rgb(19, 206, 102)" : "red"; // 初始状态为反转颜色 switchBackground.style.transition = "background-color 0.2s"; // 减小背景颜色过渡时间 switchContainer.appendChild(switchBackground); switchBackground.style.borderRadius = "25px"; // 设置圆角 // 创建白色按钮元素 var switchButton = document.createElement('div'); switchButton.style.width = "16px"; // 设置宽度 switchButton.style.height = "16px"; // 设置高度 switchButton.style.top = "12%"; // 设置垂直居中 switchButton.style.backgroundColor = "#fff"; // 设置背景颜色为白色 switchButton.style.borderRadius = "50%"; // 设置圆角 switchButton.style.position = "absolute"; // 设置绝对定位 switchButton.style.transition = "left 0.3s"; // 减小按钮平滑移动的过渡时间 switchButton.style.left = blinkMode ? "20px" : "0"; // 初始位置为反转按钮位置 switchBackground.appendChild(switchButton); switchButton.style.borderRadius = "50%"; // 设置圆角 let targetLeft = blinkMode ? 0 : 20; // 初始位置目标值为反转位置 let isAnimating = false; // 添加点击事件监听器 switchContainer.addEventListener("click", function() { if (!isAnimating) { isAnimating = true; blinkMode = !blinkMode; // 保存新的blinkMode状态到localStorage localStorage.setItem('blinkMode', blinkMode); switchBackground.style.backgroundColor = blinkMode ? "rgb(19, 206, 102)" : "red"; // 反转颜色 targetLeft = blinkMode ? 20 : 0; animateButton(); } }); // 创建按钮动画函数 function animateButton() { const currentLeft = parseFloat(getComputedStyle(switchButton).left); const step = (targetLeft - currentLeft); if (Math.abs(targetLeft - currentLeft) > 0.5) { switchButton.style.left = currentLeft + step + "px"; requestAnimationFrame(animateButton); } else { switchButton.style.left = targetLeft + "px"; isAnimating = false; } } switchLabel.addEventListener("click", function(event) { event.stopPropagation(); // 阻止事件冒泡 }); // 将状态保存到loclStorage localStorage.setItem('blinkMode', blinkMode); // 尝试将按钮插入到指定位置 setTimeout(function() { let targetElement = document.querySelector('div[data-v-515b103e][style="padding-top: 2rem;"]'); if(targetElement) { targetElement.appendChild(switchContainer); targetElement.style.height = "80px"; // 这里更改目标元素的高度 } else { document.body.appendChild(switchContainer); } }, 400); // 延迟2秒 let elementToChange = document.querySelector('div[data-v-515b103e][style="padding-top: 2rem;"]'); if (elementToChange) { elementToChange.style.height = "500px"; } }); } // 第3部分:按空格键翻页 function handleKeyPressForNextPage(e) { // 检查是否按下的是空格键(键码32) if (e.keyCode === 32) { // 查找“下一页”按钮并点击它 var nextPageButton = document.querySelector('.confirm .el-button.el-button--default.el-button--medium.is-round'); if (nextPageButton) { nextPageButton.click(); } } } // 第4部分:按空格键触发另一个选择器 function handleKeyPressForAnotherSelector(e) { // 检查是否按下的是空格键(键码32) if (e.keyCode === 32) { // 查找另一个选择器并执行相应操作 var buttons = document.querySelectorAll('button'); var startButton; var replayButton; var preserveButton; for (var i = 0; i < buttons.length; i++) { if (buttons[i].textContent == '开始') { startButton = buttons[i]; } if (buttons[i].textContent == '再来一局') { replayButton = buttons[i]; } if (buttons[i].textContent == '保留') { preserveButton = buttons[i]; } } if (startButton) { startButton.click(); } if (replayButton) { replayButton.click(); } if (preserveButton) { preserveButton.click(); } } } // 每隔500ms检查"下一题"按钮是否已经出现 var checkExist = setInterval(function() { var nextPageButton = document.querySelector('.confirm .el-button.el-button--default.el-button--medium.is-round'); if (nextPageButton) { // 如果"下一题"按钮已经出现,添加键盘按键事件监听器,并停止定时器 document.addEventListener('keydown', handleKeyPressForNextPage); clearInterval(checkExist); } }, 500); // 监听DOM变化的函数看是否或出现比赛 function observeDOMChanges() { // 配置observer的选项: 添加或删除的子节点 var config = { childList: true, subtree: true }; // 当DOM发生变化时调用的回调函数 var callback = function(mutationsList, observer) { for(var mutation of mutationsList) { // 如果有子节点被添加 if(mutation.addedNodes.length) { mutation.addedNodes.forEach(function(node) { // 检查该节点是否是你想要的元素 if(node.nodeType === Node.ELEMENT_NODE && node.classList.contains("van-toast") && node.classList.contains("van-toast--middle") && node.classList.contains("van-toast--text")) { var innerDiv = node.querySelector('.van-toast__text'); if(innerDiv && innerDiv.textContent === "比赛已经开始或者这一轮游戏还未结束") { node.style.transition = 'none'; node.style.animation = 'none'; node.style.opacity = '0'; } } }); } } }; // 创建一个observer实例与回调函数关联 var observer = new MutationObserver(callback); // 在整个document上开始观察DOM的变化 observer.observe(document, config); } // 调用上面的函数以开始监听DOM变化 observeDOMChanges(); let elementToChange = document.querySelector('div[data-v-515b103e][style="padding-top: 2rem;"]'); if (elementToChange) { elementToChange.style.height = "500px"; } // 监听按键事件 document.addEventListener('keydown', handleKeyPressForRefresh); document.addEventListener('keydown', handleKeyPressForAnotherSelector); })();