网页水印隐藏

去除通过在元素中使用background-image属性,通过插入背景图片生成的水印

目前为 2023-02-25 提交的版本。查看 最新版本

// ==UserScript==
// @name         网页水印隐藏
// @namespace    https://www.bilibili.com/
// @version      1.1
// @description  去除通过在元素中使用background-image属性,通过插入背景图片生成的水印
// @author       Pick
// @match        */*
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant        none
// ==/UserScript==
/**
 * 非强力模式(默认模式):只在页面进入时,进行一次消除水印
 * 强力模式:在页面动态变化时,也可以消除水印,多数用户不会有此需求
 * @type {boolean}
 */
let POWER_MODE = false;
let DEBUG = false;
/**
 * 无法进行消除水印的元素
 * @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或关注我们的公众号极客氢云获取最新地址