// ==UserScript== // @name ns随机背景图片加载与反代图片链接 // @namespace http://tampermonkey.net/ // @version 0.01 // @license GPL-3.0 // @description 在 https://www.nodeseek.com/ 网站加载随机背景图片,并为加载失败的图片加反代链接;悬浮球开关功能并记住选择;添加切换背景图按钮。 // @author Your Name // @match https://www.nodeseek.com/* // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @downloadURL https://update.greasyfork.icu/scripts/535039/ns%E9%9A%8F%E6%9C%BA%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E4%B8%8E%E5%8F%8D%E4%BB%A3%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5.user.js // @updateURL https://update.greasyfork.icu/scripts/535039/ns%E9%9A%8F%E6%9C%BA%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E4%B8%8E%E5%8F%8D%E4%BB%A3%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5.meta.js // ==/UserScript== (function() { 'use strict'; const proxyUrl = 'https://proxy.自定.xyz/'; const placeholderBg = 'https://via.placeholder.com/1920x1080?text=Loading...'; // 占位符背景图 const cachedBgKey = 'cachedBackgroundImage'; // 缓存的背景图键名 const cachedTimeKey = 'cachedBgTime'; // 缓存时间的键名 const enableCacheKey = 'enableBgCache'; // 背景图缓存启用状态 const cacheTimeoutKey = 'cacheTimeout'; // 缓存有效时间 const apiSelectionKey = 'selectedBgApi'; // 用户选择的API // 从localStorage加载用户的设置 let enableBgLoading = localStorage.getItem('enableBgLoading') === 'true'; // 是否启用背景图加载 let enableBgCopy = localStorage.getItem('enableBgCopy') === 'true'; // 是否启用复制背景图链接 let enableBgCache = localStorage.getItem(enableCacheKey) === 'true'; // 是否启用背景图缓存 let cacheTimeout = parseInt(localStorage.getItem(cacheTimeoutKey)) || 60; // 缓存有效时间(默认60分钟) let selectedBgApi = localStorage.getItem(apiSelectionKey) || 'random'; // 默认选择随机API // API 列表 const apiUrls = { 'loli': 'https://www.loliapi.com/bg/?type=url', // LoliAPI 'alcy': 'https://t.alcy.cc/ycy/?json', // AlcyCC 'dmoe': 'https://www.dmoe.cc/random.php?return=json' // DMOE API }; // 创建一个侧边栏按钮,点击后弹出功能开关列表 function createSidebar() { const sidebar = document.createElement('div'); sidebar.style.position = 'fixed'; sidebar.style.top = '20px'; sidebar.style.left = '20px'; sidebar.style.backgroundColor = 'rgba(0, 0, 0, 0.8)'; sidebar.style.color = 'white'; sidebar.style.borderRadius = '8px'; sidebar.style.padding = '10px'; sidebar.style.zIndex = '1000'; sidebar.style.boxShadow = '0 4px 10px rgba(0, 0, 0, 0.2)'; sidebar.style.width = '250px'; sidebar.style.display = 'none'; // 初始隐藏侧边栏 // 反代图片功能开关 const proxyToggle = document.createElement('div'); proxyToggle.innerHTML = ` 反代图片`; proxyToggle.style.marginBottom = '10px'; proxyToggle.addEventListener('change', function() { enableBgCopy = !enableBgCopy; localStorage.setItem('enableBgCopy', enableBgCopy); // 保存设置 showNotification(`反代图片功能已${enableBgCopy ? '启用' : '禁用'}`); }); // 背景图加载功能开关 const bgToggle = document.createElement('div'); bgToggle.innerHTML = ` 加载背景图`; bgToggle.style.marginBottom = '10px'; bgToggle.addEventListener('change', function() { enableBgLoading = !enableBgLoading; localStorage.setItem('enableBgLoading', enableBgLoading); // 保存设置 showNotification(`背景图加载功能已${enableBgLoading ? '启用' : '禁用'}`); }); // 背景图缓存功能开关 const cacheToggle = document.createElement('div'); cacheToggle.innerHTML = ` 使用背景图缓存`; cacheToggle.style.marginBottom = '10px'; cacheToggle.addEventListener('change', function() { enableBgCache = !enableBgCache; localStorage.setItem(enableCacheKey, enableBgCache); // 保存设置 showNotification(`背景图缓存功能已${enableBgCache ? '启用' : '禁用'}`); }); // 缓存有效时间设置 const cacheTimeoutInput = document.createElement('div'); cacheTimeoutInput.innerHTML = ` `; cacheTimeoutInput.style.marginBottom = '10px'; cacheTimeoutInput.addEventListener('input', function() { cacheTimeout = parseInt(document.getElementById('cacheTimeout').value) || 60; localStorage.setItem(cacheTimeoutKey, cacheTimeout); // 保存设置 showNotification(`缓存有效时间已设置为 ${cacheTimeout} 分钟`); }); // 背景图API选择 const apiSelection = document.createElement('div'); apiSelection.innerHTML = ` `; apiSelection.style.marginBottom = '10px'; apiSelection.addEventListener('change', function() { selectedBgApi = document.getElementById('apiSelection').value; localStorage.setItem(apiSelectionKey, selectedBgApi); // 保存选择的API showNotification(`背景图API已切换为 ${selectedBgApi === 'random' ? '随机' : selectedBgApi === 'loli' ? 'LoliAPI' : selectedBgApi === 'alcy' ? 'AlcyCC' : 'DMOE API'}`); }); // 复制背景图链接按钮 const copyButton = document.createElement('div'); copyButton.innerHTML = ``; copyButton.addEventListener('click', function() { if (document.body.style.backgroundImage && document.body.style.backgroundImage !== 'none') { const bgUrl = document.body.style.backgroundImage.slice(5, -2); // 去掉url() GM_setClipboard(bgUrl); showNotification('背景图链接已复制'); } else { showNotification('没有背景图可复制'); } }); // 切换背景图按钮 const switchBgButton = document.createElement('div'); switchBgButton.innerHTML = ``; switchBgButton.addEventListener('click', function() { loadBackgroundImage(true); // 强制重新加载背景图 }); // 将各个功能项添加到侧边栏 sidebar.appendChild(proxyToggle); sidebar.appendChild(bgToggle); sidebar.appendChild(cacheToggle); sidebar.appendChild(cacheTimeoutInput); sidebar.appendChild(apiSelection); sidebar.appendChild(copyButton); sidebar.appendChild(switchBgButton); document.body.appendChild(sidebar); // 创建并绑定侧边栏显示/隐藏按钮 const toggleSidebarButton = document.createElement('button'); toggleSidebarButton.innerText = '功能菜单'; toggleSidebarButton.style.position = 'fixed'; toggleSidebarButton.style.top = '20px'; toggleSidebarButton.style.left = '300px'; toggleSidebarButton.style.padding = '10px'; toggleSidebarButton.style.backgroundColor = 'rgba(0, 0, 0, 0.8)'; toggleSidebarButton.style.color = 'white'; toggleSidebarButton.style.border = 'none'; toggleSidebarButton.style.borderRadius = '5px'; toggleSidebarButton.style.cursor = 'pointer'; toggleSidebarButton.style.zIndex = '1001'; toggleSidebarButton.addEventListener('click', function() { sidebar.style.display = sidebar.style.display === 'block' ? 'none' : 'block'; }); document.body.appendChild(toggleSidebarButton); } // 显示通知 function showNotification(message) { const notification = document.createElement('div'); notification.innerText = message; notification.style.position = 'fixed'; notification.style.bottom = '100px'; notification.style.left = '50%'; notification.style.transform = 'translateX(-50%)'; notification.style.backgroundColor = 'rgba(0, 0, 0, 0.8)'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.fontSize = '14px'; notification.style.zIndex = '999'; notification.style.boxShadow = '0 4px 10px rgba(0, 0, 0, 0.3)'; document.body.appendChild(notification); setTimeout(() => { notification.style.opacity = 0; setTimeout(() => document.body.removeChild(notification), 300); }, 3000); } // 请求随机背景图片URL function loadBackgroundImage(forceReload = false) { const currentTime = new Date().getTime(); const cachedTime = localStorage.getItem(cachedTimeKey); if (forceReload || !enableBgCache || !localStorage.getItem(cachedBgKey) || (cachedTime && (currentTime - cachedTime > cacheTimeout * 60000))) { const randomApi = selectedBgApi === 'random' ? Object.values(apiUrls)[Math.floor(Math.random() * 3)] : apiUrls[selectedBgApi]; GM_xmlhttpRequest({ method: 'GET', url: randomApi, // 根据选择的API获取图片 onload: function(response) { let imageUrl; if (randomApi === apiUrls.loli) { imageUrl = response.responseText; // LoliAPI返回图片URL } else if (randomApi === apiUrls.alcy) { imageUrl = response.responseText; // AlcyCC返回图片URL } else if (randomApi === apiUrls.dmoe) { const data = JSON.parse(response.responseText); // DMOE返回JSON数据 imageUrl = data.imgurl.replace(/\\/g, ''); // DMOE返回的图片URL需要处理 } if (imageUrl) { // 将图片URL缓存起来 localStorage.setItem(cachedBgKey, imageUrl); localStorage.setItem(cachedTimeKey, currentTime.toString()); // 更新缓存时间 // 等待背景图加载完成后再替换占位符背景 const img = new Image(); img.onload = function() { document.body.style.backgroundImage = `url(${imageUrl})`; document.body.style.backgroundSize = '35%'; // 设置背景图大小 document.body.style.backgroundAttachment = 'local'; // 设置背景图滚动方式 document.body.style.backgroundColor = 'rgba(255, 255, 255, 0.35)'; // 设置透明度 }; img.src = imageUrl; // 触发背景图加载 } }, onerror: function() { console.error('无法获取背景图片'); } }); } else { // 使用缓存的背景图 const cachedBg = localStorage.getItem(cachedBgKey); document.body.style.backgroundImage = `url(${cachedBg})`; document.body.style.backgroundSize = '35%'; document.body.style.backgroundAttachment = 'local'; document.body.style.backgroundColor = 'rgba(255, 255, 255, 0.35)'; } } // 页面加载完成后执行初始化 window.addEventListener('load', function() { createSidebar(); // 创建侧边栏 if (enableBgLoading) { loadBackgroundImage(); // 只有在启用背景图加载时才加载背景 } }); })();