您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
去除通过在元素中使用background-image属性,通过插入背景图片生成的水印
当前为
// ==UserScript== // @name 网页水印隐藏 // @namespace https://www.bilibili.com/ // @version 0.1 // @description 去除通过在元素中使用background-image属性,通过插入背景图片生成的水印 // @author Pick // @match */* // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // ==/UserScript== /** * 非强力模式(默认模式):只在页面进入时,进行一次消除水印 * 强力模式:在页面动态变化时,也可以消除水印,多数用户不会有此需求 * @type {boolean} */ let POWER_MODE = true; let DEBUG = true; /** * 无法进行消除水印的元素 * @type {Map<any, any>} */ let badMap = new Map(); let SLEEP = (time) => new Promise((resolve) => { if (time == null || time === 0) { resolve(); } else { setTimeout(resolve, time); } }); window.addEventListener("load", function (event){ console.log("水印去除-load"); sleepHelp([1000], () => { process(document.body); }); if(POWER_MODE){ fullMonitor(); } }); function eleProcess(ele) { if(ele == null){ return; } let style = ele.getAttribute("style"); if (style != null && style.indexOf("background-image") !== -1) { let cnt = badMap.get(ele); if(cnt == null){ cnt = 1; }else{ cnt = cnt + 1; } badMap.set(ele, cnt); console.log("水印去除-DEBUG", cnt); if(cnt > 10){ console.log("水印去除-无法hack的元素", ele); return; } ele.style["background-size"] = "0px, 0px"; if(DEBUG){ console.log("水印去除-DEBUG", ele); } } } function process(ele) { let querySelectorAll = ele.querySelectorAll("[style]"); for (let i = 0; i < querySelectorAll.length; i++) { eleProcess(querySelectorAll[i]); } if (ele.getAttribute("style") !== -1) { eleProcess(ele); } } function sleepHelp(sleepTime, func, ...args) { let sleepArray; if (Array.isArray(sleepTime)) { sleepArray = sleepTime; } else { sleepArray = new Array(); sleepArray[0] = sleepTime; } for (let i = 0; i < sleepArray.length; i++) { SLEEP(sleepArray[i]).then(() => func(sleepArray[i], ...args)); } } function fullMonitor(){ // 选择需要观察变动的节点 const targetNode = document.body; // 观察器的配置(需要观察什么变动) const config = { attributes: true, childList: true, subtree: true }; // 当观察到变动时执行的回调函数 const callback = function(mutationsList, observer) { for(const mutation of mutationsList) { if (mutation.type === 'childList') { // 如果新增节点包含style属性 const addedNodes = mutation.addedNodes; for (let i = 0; i < addedNodes.length; i++) { const node = addedNodes[i]; if (node.nodeType === 1) { eleProcess(node); } } } else if (mutation.type === 'attributes' && mutation.attributeName === 'style') { // 如果修改的节点原来不包含style属性,现在包含了 const target = mutation.target; if (target.nodeType === 1) { eleProcess(target); } } } }; // 创建一个观察器实例并传入回调函数 const observer = new MutationObserver(callback); // 以上述配置开始观察目标节点 observer.observe(targetNode, config); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址