您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Enable dark mode with a toggle button and automatically based on location
当前为
// ==UserScript== // @name Dark Mode Auto Toggle // @version 0.0.7 // @description Enable dark mode with a toggle button and automatically based on location // @namespace https://gf.qytechs.cn/en/users/28298 // @author https://gf.qytechs.cn/en/users/28298 // @homepage https://gf.qytechs.cn/en/scripts/523690 // @license MIT // @match *://*/* // @grant GM_getValue // @grant GM_setValue // ==/UserScript== // @grant none // original author: Michael Wang https://gf.qytechs.cn/en/scripts/472251-dark-mode/code // with help of claude ai (function() { 'use strict'; // Create style element for dark mode const darkStyle = document.createElement('style'); darkStyle.textContent = ` html { filter: invert(1) hue-rotate(180deg) contrast(0.8); } /** reverse filter for media elements */ img, video, picture, canvas, iframe, embed { filter: invert(1) hue-rotate(180deg); } `; // Initialize based on page's current state let darkMode = false; // Start with no filter // Function to detect if page is already dark function isPageDark() { const url = window.location.hostname; //////////////////////////////////////////////////////////////////// // manually tell domain's mode, because auto detection would fail const domainModes = { 'claude.ai': 'bright', 'chat.openai.com': 'dark', 'duckduckgo.com': 'dark', 'www.google.com': 'dark', 'gf.qytechs.cn': 'bright', '192.168.1.1': 'dark', }; /////////////////////////////////////////////////////////////////// // Check if domain is in our list for (const domain in domainModes) { if (url.includes(domain)) { return domainModes[domain] === 'dark'; } } // easy solution, but not always accurate return document.documentElement.classList.contains('dark') // const bodyBg = window.getComputedStyle(document.body).backgroundColor; // const htmlBg = window.getComputedStyle(document.documentElement).backgroundColor; // // Convert RGB/RGBA to brightness value (0-255) // function getBrightness(color) { // const rgb = color.match(/\d+/g); // if (!rgb) return 255; // Default to light if can't detect // // Use perceived brightness formula // return (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; // } // const bodyBrightness = getBrightness(bodyBg); // const htmlBrightness = getBrightness(htmlBg); // // Use the darker of the two values // const brightness = Math.min(bodyBrightness, htmlBrightness); // return brightness < 128; // Consider it dark if brightness is less than middle gray } // Initialize darkMode based on stored preference or page state const pageIsDark = isPageDark(); // Create toggle button const button = document.createElement('button'); button.innerHTML = pageIsDark ? '☼' : '☽'; button.style.position = 'fixed'; button.style.top = '5px'; button.style.right = '10px'; button.style.zIndex = '1000'; button.style.background = 'none'; button.style.border = 'none'; button.style.fontSize = '24px'; button.style.cursor = 'pointer'; button.style.color = 'inherit'; // Function to get location and store it async function setupLocation() { let location = GM_getValue('userLocation'); if (!location) { try { const position = await new Promise((resolve, reject) => { navigator.geolocation.getCurrentPosition(resolve, reject); }); location = { latitude: position.coords.latitude, longitude: position.coords.longitude, timestamp: Date.now() }; GM_setValue('userLocation', location); console.log('Location saved successfully'); } catch (error) { console.error('Error getting location:', error); // Default to a fallback location (e.g., UTC+0) location = { latitude: 51.5074, // London coordinates as fallback longitude: -0.1278, timestamp: Date.now() }; GM_setValue('userLocation', location); } } return location; } // Function to get sunrise/sunset times using stored location async function getSunTimes() { try { const location = await setupLocation(); const response = await fetch( `https://api.sunrise-sunset.org/json?lat=${location.latitude}&lng=${location.longitude}&formatted=0` ); const data = await response.json(); return { sunrise: new Date(data.results.sunrise), sunset: new Date(data.results.sunset) }; } catch (error) { console.error('Error getting sun times:', error); // Fallback to approximate times const now = new Date(); return { sunrise: new Date(now.setHours(6, 0, 0, 0)), sunset: new Date(now.setHours(18, 0, 0, 0)) }; } } // Function to toggle dark mode function toggleDarkMode(forceDark) { if (forceDark !== undefined) { // Auto dark mode (sunrise/sunset) if (pageIsDark) { // If page is already dark, don't change anything return; } darkMode = forceDark; } else { // Manual toggle - always allow regardless of pageIsDark darkMode = !darkMode; } if (darkMode) { document.head.appendChild(darkStyle); button.innerHTML = pageIsDark ? '☽' : '☼'; } else { if (darkStyle.parentNode) { document.head.removeChild(darkStyle); } button.innerHTML = pageIsDark ? '☼' : '☽'; } } // Function to check and update dark mode based on time async function updateDarkMode() { const sunTimes = await getSunTimes(); const now = new Date(); const isDark = now < sunTimes.sunrise || now > sunTimes.sunset; toggleDarkMode(isDark); } // Add settings button const settingsButton = document.createElement('button'); settingsButton.innerHTML = '⚙'; settingsButton.style.position = 'fixed'; settingsButton.style.top = '30px'; settingsButton.style.right = '15px'; settingsButton.style.zIndex = '1000'; settingsButton.style.background = 'none'; settingsButton.style.border = 'none'; settingsButton.style.fontSize = '12px'; settingsButton.style.cursor = 'pointer'; settingsButton.style.color = 'inherit'; // Settings panel to reset location settingsButton.addEventListener('click', () => { if (confirm('Reset location settings?')) { GM_setValue('userLocation', null); location.reload(); } }); // Initial update updateDarkMode(); // Update every hour setInterval(updateDarkMode, 3600000); // Manual toggle still works button.addEventListener('click', () => toggleDarkMode()); // Add buttons to page document.body.appendChild(button); document.body.appendChild(settingsButton); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址