// ==UserScript== // @name 微信文件传输助手 (科技蓝黑主题 - 终极完全体) // @namespace https://scriptcat.org/ // @version 3.0 // @description 使用深度 DOM 扫描,彻底消灭登录页和聊天页的所有白块,强制统一为科技蓝黑 // @author You // @match https://szfilehelper.weixin.qq.com/* // @grant none // @run-at document-end // ==/UserScript== (function() { 'use strict'; // ================= 1. 基础 CSS 增强覆盖 ================= const style = document.createElement('style'); style.innerHTML = ` :root { --tech-bg-main: #070b14; /* 最深背景 */ --tech-bg-card: #101726; /* 卡片/气泡背景 */ --tech-bg-hover: #1a253a; --tech-blue: #00d2ff; /* 科技蓝 */ --tech-blue-glow: rgba(0, 210, 255, 0.4); --tech-text-main: #e0e6ed; --tech-text-sub: #8a9bb8; --tech-border: rgba(0, 210, 255, 0.2); } /* 全局根节点底色 */ html, body, #app, .app { background-color: var(--tech-bg-main) !important; color: var(--tech-text-main) !important; } /* 聊天内容区、气泡、文件卡片 */ [class*="chat"], [class*="message"], [class*="bubble"], [class*="file"], [class*="content"] { border-color: var(--tech-border) !important; color: var(--tech-text-main) !important; } [class*="bubble"], [class*="file-card"], [class*="attachment"] { background-color: var(--tech-bg-card) !important; } /* 按钮样式重置 */ button, [class*="btn"] { background-color: var(--tech-bg-hover) !important; color: var(--tech-text-main) !important; border: 1px solid var(--tech-border) !important; transition: all 0.2s ease !important; } /* 精准定位发送按钮,去除亮蓝色,改为科技深色 */ [class*="send"], [class*="primary"] { background-color: var(--tech-blue) !important; color: #000 !important; border: none !important; box-shadow: 0 0 10px var(--tech-blue-glow) !important; font-weight: 600 !important; } /* 滚动条 */ ::-webkit-scrollbar { width: 6px !important; height: 6px !important; } ::-webkit-scrollbar-track { background: transparent !important; } ::-webkit-scrollbar-thumb { background: var(--tech-blue) !important; border-radius: 3px !important; } `; document.head.appendChild(style); // ================= 2. 终极 DOM 扫描与染色(核心) ================= function forceDarken() { // 处理登录页(上次的逻辑保留) const titleEl = Array.from(document.querySelectorAll('div, span, h1, h2')).find(el => el.textContent.trim() === '微信文件传输助手网页版'); if (titleEl) { let parent = titleEl.parentElement; for (let i = 0; i < 4; i++) { if (parent) { parent.style.setProperty('background-color', '#101726', 'important'); parent.style.setProperty('border', '1px solid rgba(0, 210, 255, 0.2)', 'important'); parent.style.setProperty('box-shadow', '0 10px 40px rgba(0, 0, 0, 0.8)', 'important'); parent = parent.parentElement; } } titleEl.style.setProperty('color', '#e0e6ed', 'important'); } const qrImg = document.querySelector('img[src*="qrcode"], canvas'); if (qrImg) { qrImg.style.setProperty('background-color', '#ffffff', 'important'); qrImg.style.setProperty('padding', '10px', 'important'); } // 处理聊天主界面(解决你截图里的白板) // 策略:找到包含提示文字的元素,向上遍历父节点,把白色的底全刷成深色 const tipEl = Array.from(document.querySelectorAll('div, span')).find(el => el.textContent.includes('与电脑互传文件')); if (tipEl) { let parent = tipEl.parentElement; // 向上遍历 6 层,确保覆盖到最外层的白色容器 for (let i = 0; i < 6; i++) { if (parent && parent.tagName !== 'BODY') { parent.style.setProperty('background-color', '#070b14', 'important'); parent.style.setProperty('border-color', 'rgba(0, 210, 255, 0.2)', 'important'); parent = parent.parentElement; } } tipEl.style.setProperty('color', '#8a9bb8', 'important'); } // 强制查找所有背景色为纯白的内联样式或无类名大容器并染黑 // 注意:这步很暴力,但针对微信这种写死样式的非常有效 const allDivs = document.querySelectorAll('div'); allDivs.forEach(div => { const bgColor = window.getComputedStyle(div).backgroundColor; // 如果背景色是纯白,且高度大于 50px(排除掉小图标),就染黑 if (bgColor === 'rgb(255, 255, 255)' && div.clientHeight > 50) { div.style.setProperty('background-color', '#070b14', 'important'); } }); // 专门针对底部的输入区 const sendBtn = document.querySelector('[class*="send"], [class*="primary"], button'); if (sendBtn) { let inputArea = sendBtn.parentElement; // 将输入区及其包裹层涂成卡片色 for (let i = 0; i < 3; i++) { if (inputArea && inputArea.tagName !== 'BODY') { // 如果它是发送按钮的父级(通常是底栏),涂深色 inputArea.style.setProperty('background-color', '#101726', 'important'); inputArea.style.setProperty('border-top', '1px solid rgba(0, 210, 255, 0.2)', 'important'); inputArea = inputArea.parentElement; } } } // 找到输入框,强制文字变白 const inputs = document.querySelectorAll('textarea, div[contenteditable="true"], input'); inputs.forEach(input => { input.style.setProperty('background-color', 'transparent', 'important'); input.style.setProperty('color', '#e0e6ed', 'important'); // 尝试寻找输入框的父级,给一个边框 if (input.parentElement) { input.parentElement.style.setProperty('border', '1px solid rgba(0, 210, 255, 0.2)', 'important'); input.parentElement.style.setProperty('background-color', '#070b14', 'important'); } }); } // ================= 3. 监听并执行 ================= // 页面首次加载 setTimeout(forceDarken, 500); setTimeout(forceDarken, 1500); // 防止异步加载慢 // 监听 DOM 变化(如果用户切页面、收发消息) const observer = new MutationObserver(() => { forceDarken(); }); // 开始监听整个文档 observer.observe(document.body, { childList: true, subtree: true }); })();