AI大模型教程
一起来学习

反色情油猴脚本开源(支持含js的html)

// ==UserScript==
// @name         戒色提醒助手(增强版)
// @namespace    http://tampermonkey.net/
// @version      0.8
// @description  识别色情内容并提醒,支持处理嵌入在JS中的内容,确保页面正常交互,新增Base64解码功能
// @author       Your Name
// @match        *://*/*
// @grant        GM_xmlhttpRequest
// @connect      *
// ==/UserScript==

(function() {
    'use strict';

    // Base64解码函数
    function base64Decode(encodedString) {
        try {
            // 处理URL安全的Base64
            encodedString = encodedString.replace(/-/g, '+').replace(/_/g, '/');
            // 解码并转换为UTF-8
            const decodedBytes = atob(encodedString);
            const decodedString = decodeURIComponent(escape(decodedBytes));
            return decodedString;
        } catch (e) {
            console.error('Base64解码失败:', e);
            return '';
        }
    }

    // 配置部分
    const config = {
        // 白名单网站(完整域名,优先匹配)
        whitelist: [
            "baidu.com", "google.com", "bing.com",
            "zhihu.com", "github.com", "stackoverflow.com",
            "wikipedia.org", "youtube.com", "bilibili.com",
            "weibo.com", "taobao.com", "jd.com"
        ],


        // 敏感词汇列表(Base64编码)
        sensitiveWordsEncoded: "WwogICAgICAgICAgICAi5Y+j5LqkIiwi5Zu95LqnIiwi5ZCD55Oc6buR5paZIiwiOTjloIIiLCLml6Xpn6nnsr7lk4EiLCLml6DnoIEiLCLniLHniLHnvZEiLCI1OOWggiIsIuacieeggSIsCiAgICAgICAgICAgICLkuK3mloflrZfluZUiLCLmrKfnvo7op4bpopEiLCLmnIDmlrDlnLDlnYDlj5HluIMiLCLkuInnuqciLCLlvLrlpbgiLCLkubHkvKYiLCLov7foja8iLCLmt6siLCJwb3JuIiwKICAgICAgICAgICAgIuWls+S8mCIsIuS4neiinCIsIuavjeWtkCIsIuiHquaFsCIsIumfqea8qyIsIuemgea8qyIsIueci+eJhyIsIuaSuOeuoSIsIuawuOS5hee9keWdgCIsIlNXQUciLAogICAgICAgICAgICAi5Y+R5biD6aG1Iiwi57OW5b+DIiwi55qH5a62Iiwi6bq76LGGIiwi5aup6I2JIiwi5b+r54yrIiwi6Jyc5qGDIiwi5aWz5YSqIiwi5Lym55CGIiwi5rapIiwi5o2i6IS4IiwKICAgICAgICAgICAgIuasp+e+jiIsIuS6mua0siIsIue+juWlsyIsIuWBt+aLjSIsIuS8oOWqkiIsIuaAp+eIsSIsIueyvuS4nCIsIjkx5aSn56WeIiwiOTHmj63pnLIiLCLmmpfnvZEiLAogICAgICAgICAgICAi5ZCD55OcIiwi5q+P5pel5aSn6LWbIiwiMTjnpoEiLCLlhoXlsIQiLCLokJ3ojokiLCLpu5HkuJ0iLCLnmb3kuJ0iLCLmgKfmhJ8iLCLlhZTlrZDlhYjnlJ8iLAogICAgICAgICAgICAiOTHliLbniYciLCLlpKnnvo4iLCLmjqLoirEiLCLlkI7lhaUiLCLnpoHniYciLCLkuYXkuYUiLCLmnoHlk4EiLCLogo8iLCLojYnmprQiLCLlpbPnpZ4iLCLpu4ToibIiLAogICAgICAgICAgICAi5oOF6ImyIiwgIuaIkOS6uiIsIuWBmueIsSIsICLoibLmg4UiLCLpqpoiLCAi5ZWq5ZWqIiwgIuiCm+S6pCIsICLlkJ7nsr4iLCLor7Hmg5EiLCAi5YWo6KO4IiwKICAgICAgICAgICAgIuS5s+S6pCIsICLlsITnsr4iLCAi5Y+N5beuIiwgIuiwg+aVmSIsICLmgKfkuqQiLCLmgKflpbQiLCAi6auY5r2uIiwgIueZveiZjiIsICLlsJHlpbMiLCAi5aWz5Y+LIiwKICAgICAgICAgICAgIueLguaTjSIsICLmjYbnu5EiLCAi57qm54KuIiwgIum4oeWQpyIsIumYtOiMjiIsICLpmLTpgZMiLCLoo7jkvZMiLCAi55S35LyYIiwgIuWBt+aDhSIsIuavjeeLlyIsCiAgICAgICAgICAgICLllrfmsLQiLCLmva7lkLkiLCAi6L2u5aW4IiwgIuWwkeWmhyIsIueGn+WlsyIsIumUgOmtgiIsIumUgOWlsyIsIumUgOi0pyIsIumUgOmAvCIsIumUgOi0sSIsIumUgOiNoSIsCiAgICAgICAgICAgICLpqprprYIiLCLpqprlpbMiLCLpqprotKciLCLpqprpgLwiLCLpqprotLEiLCLpqprojaEiLCLmtarprYIiLCLmtarlpbMiLCLmtarotKciLCLmtarpgLwiLCLmtarotLEiLAogICAgICAgICAgICAi5rWq6I2hIiwi5rer6a2CIiwi5rer5aWzIiwi5rer6LSnIiwi5rer6YC8Iiwi5rer6LSxIiwi5rer6I2hIiwi6IiU56m0Iiwi6IiU6YC8Iiwi6IiU5bGEIiwi6IiU6Zi0IiwKICAgICAgICAgICAgIuiIlOicnCIsIuiIlOiPiiIsIuiIlOWxjCIsIuiIlOm4oSIsIuiIlOiCiSIsIuWQuOeptCIsIuWQuOmAvCIsIuWQuOWxhCIsIuWQuOmYtCIsIuWQuOicnCIsIuWQuOiPiiIsCiAgICAgICAgICAgICLlkLjlsYwiLCLlkLjpuKEiLCLlkLjogokiLCLlkK7nqbQiLCLlkK7pgLwiLCLlkK7lsYQiLCLlkK7pmLQiLCLlkK7onJwiLCLlkK7oj4oiLCLlkK7lsYwiLCLlkK7puKEiLAogICAgICAgICAgICAi5ZCu6IKJIiwi5o+S56m0Iiwi5o+S6YC8Iiwi5o+S5bGEIiwi5o+S6Zi0Iiwi5o+S6JycIiwi5o+S6I+KIiwi5o+S5bGMIiwi5o+S6bihIiwi5o+S6IKJIiwi5bmy56m0IiwKICAgICAgICAgICAgIuW5sumAvCIsIuW5suWxhCIsIuW5sumYtCIsIuW5suicnCIsIuW5suiPiiIsIuW5suWxjCIsIuW5sum4oSIsIuW5suiCiSIsIuaTjeeptCIsIuaTjemAvCIsIuaTjeWxhCIsCiAgICAgICAgICAgICLmk43pmLQiLCLmk43onJwiLCLmk43oj4oiLCLmk43lsYwiLCLmk43puKEiLCLmk43ogokiLCLojYnnqbQiLCLojYnpgLwiLCLojYnlsYQiLCLojYnpmLQiLCLojYnonJwiLAogICAgICAgICAgICAi6I2J6I+KIiwi6I2J5bGMIiwi6I2J6bihIiwi6I2J6IKJIiwi5beo5LmzIiwi5beo6IeAIiwi5beo6IO4Iiwi5aSn5LmzIiwi5aSn6IeAIiwi5aSn6IO4Iiwi5bCP5LmzIiwKICAgICAgICAgICAgIuWwj+iHgCIsIuWwj+iDuCIsIue/mOS5syIsIue/mOiHgCIsIue/mOiDuCIsIueZveS5syIsIueZveiHgCIsIueZveiDuCIsIuiCpeS5syIsIuiCpeiHgCIsIuiCpeiDuCIsCiAgICAgICAgICAgICLogonmo5IiLCLogonmoLkiLCLogonnqbQiLCLogonnvJ0iLCLogonoh4AiLCLogonlpbYiLCLogonkvZMiLCLogonmrLIiLCAi5rer56e9Iiwi5rer6I2hIiwi5rer5LmxIiwKICAgICAgICAgICAgIua3q+i0sSIsIua3q+a2siIsIua3q+eptCIsIua3q+awtCIsIua2qea2qSIsICLmtqnlm74iLCAi5rap5rCUIiwgIuiJsuaJuSIsICLoibLlm74iLCAi57qmcCIsICLnuqbllaoiLAogICAgICAgICAgICAi6ICB5biIIiwi5pWZ5biIIiwi5biI55SfIiwi5a625pWZIiwi54af5aWzIiwi5bCE57K+Iiwi5oyJ5pGpIiwi5L+d5aeGIiwi572R57qiIiwi5Lmx5LymIiwi6YeO5aSWIiwKICAgICAgICAgICAgIui3r+S6uiIsIue0oOS6uiIsIue+juiEmiIsIuegtOWkhCIsIuaKlumYtCIsIuaKluiNqyIsIuWFjei0ueinhumikSIsIuWFqOWbveepuumZjSIsIumYv+WnqCIsICLmjInmkakiLAogICAgICAgICAgICAi55m96JmOIiwgIueZvemihiIsICLnmb3kuJ0iLCAi54iG5LmzIiwgIuiiq+WKqCIsICLlj6PniIYiLCAi6Ieq5ouNIiwgIuWBt+aLjSIsCiAgICAgICAgICAgICLmjYbnu5EiLCAi6L2m6ZyHIiwgIuiQneiOiSIsICLli77lvJUiLCAi5Y+N5beuIiwgIuaXoOavmyIsICLlpJrkuroiLCAi6aqa6LSnIiwgIuW+oeWnkCIsCiAgICAgICAgICAgICLlkJ7nsr4iLCAi5YG35oOFIiwgIuiAgeW4iCIsICLlpbPku4YiLCAi576O5LmzIiwgIuaDheS+oyIsICLph47lpJYiLCAi5pCt6K6qIiwgIuenmOS5piIsICLnvo7ohJoiLAogICAgICAgICAgICAi57u/5bi9IiwgIuS4iuS9jSIsICLpopzlsIQiLCAi6ZW/6IW/IiwgIuminOWAvCIsICLlpKflpbYiLCAi5a2m5aa5IiwgIuiHquaFsCIsICLpl7ronJwiLCAKICAgICAgICAgICAgIuiJr+WutiIsICLpq5jot58iLCAi5LiK5Y+4IiwgIua3q+WmuyIsICLlq6nmqKEiLCAi5aSE5aWzIiwgIua3seWWiSIsICLpq5jmva4iLCAKICAgICAgICAgICAgIuaIt+WkliIsICLkuJ3oopwiLCAi5re36KGAIiwgIum7keS4nSIsICLlsKTniakiLCAi54m55YaZIiwgIue0oOS6uiIsICLplIDllK4iLAogICAgICAgICAgICAi55Gc5Ly9IiwgIuWmqeWqmiIsICLlt6jkubMiLCAi5peg5aWXIiwgIua4lOe9kSIsICLlr7nnmb0iLCAi57OW5b+DIiwgIui2s+S6pCIsCiAgICAgICAgICAgICLkurrlprsiLCAi546p5YG2IiwgIuWls+elniIsICLmnoHlk4EiLCAi54af5aWzIiwgIueyieWrqSIsICLokIzlprkiLCAi5Y+j5LqkIiwKICAgICAgICAgICAgIuWHuui9qCIsICLliLbmnI0iLCAi56C05aSEIiwgIuengeaLjSIsICLogonmhJ8iLCAi576O6bKNIiwgIuWwkeWmhyIsCiAgICAgICAgICAgICLnqbrlp5AiLCAi5rOE5a+GIiwgIue6pueCriIsICLnl4nmjJsiLCAi5by65aW4IiwgIue+jueptCIsICLmjqLoirEiLAogICAgICAgICAgICAi6L+35aW4IiwgIumBk+WFtyIsICLlj4zpo54iLCAi5Lmx5LymIiwgIuS8muaJgCIsICLnl7TlpbMiLCAi5YaF5bCEIiwgIuWJp+aDhSIsICLml5fooo0iXQ==",        // 解码后的敏感词列表
        sensitiveWords: [],

        // 网站黑名单检测
        blacklist: [
            "porn", "sex", "xxx", "xvideos", "xhamster",
            "pornhub", "youporn", "erotic", "hentai",
            "jav", "adult", "tube8", "redtube"
        ],

        // 内容处理方式: "hide" 隐藏, "blur" 模糊, "replace" 替换
        contentHandling: "replace",

        // 替换文本
        replacementText: "[敏感内容已屏蔽]",

        // 提示框样式
        noticeStyle: {
            backgroundColor: "rgba(255, 68, 68, 0.9)",
            color: "white",
            padding: "8px 12px",
            borderRadius: "4px",
            fontSize: "12px",
            margin: "3px 0",
            display: "inline-block"
        },

        // 全局警告框(仅黑名单网站显示)
        globalWarning: {
            enable: true,
            message: "检测到可能包含不良内容的网站,请注意保护身心健康!",
            style: {
                position: "fixed",
                top: "20px",
                left: "50%",
                transform: "translateX(-50%)",
                backgroundColor: "#ff4444",
                color: "white",
                padding: "15px 20px",
                borderRadius: "8px",
                zIndex: "999999",
                fontSize: "14px",
                boxShadow: "0 2px 10px rgba(0,0,0,0.3)",
                maxWidth: "90%"
            },
            closeBtn: {
                marginLeft: "15px",
                padding: "3px 8px",
                backgroundColor: "rgba(255,255,255,0.3)",
                border: "none",
                color: "white",
                borderRadius: "4px",
                cursor: "pointer",
                fontSize: "12px"
            }
        },

        // 增强扫描配置
        enhancedScanning: {
            // 扫描script标签中的文本内容
            scanScripts: true,
            // 监控AJAX请求
            monitorAjax: true,
            // 处理JSON数据
            processJson: true,
            // 扫描延迟(毫秒)
            scanDelay: 500
        }
    };

    // 解码敏感词列表
    function decodeSensitiveWords() {
        try {
            const decodedStr = base64Decode(config.sensitiveWordsEncoded);
            if (decodedStr) {
                config.sensitiveWords = JSON.parse(decodedStr);
                console.log(`成功解码敏感词列表,共 ${config.sensitiveWords.length} 个敏感词`);
            }
        } catch (e) {
            console.error('解析敏感词列表失败:', e);
            // 解码失败时使用默认的几个敏感词作为备用
            config.sensitiveWords = ['色情', '低俗', '淫秽', '色情图片', '色情视频'];
        }
    }

    // 初始化时解码敏感词
    decodeSensitiveWords();

    // 检查是否在白名单内
    function isWhitelisted() {
        const hostname = window.location.hostname.toLowerCase();
        return config.whitelist.some(domain =>
            hostname.includes(domain.toLowerCase())
        );
    }

    // 检查是否在黑名单内
    function isBlacklisted() {
        const url = window.location.href.toLowerCase();
        const hostname = window.location.hostname.toLowerCase();
        return config.blacklist.some(keyword =>
            url.includes(keyword) || hostname.includes(keyword)
        );
    }

    // 检查文本是否包含敏感词
    function hasSensitiveWord(text) {
        if (!text || typeof text !== 'string') return false;
        const lowerText = text.toLowerCase();
        return config.sensitiveWords.some(word =>
            lowerText.includes(word.toLowerCase())
        );
    }

    // 获取文本中的敏感词
    function getSensitiveWords(text) {
        if (!text || typeof text !== 'string') return [];
        const lowerText = text.toLowerCase();
        return config.sensitiveWords.filter(word =>
            lowerText.includes(word.toLowerCase())
        );
    }

    // 处理敏感内容元素
    function handleSensitiveElement(element) {
        if (element.dataset.processed) return;
        element.dataset.processed = "true";

        const content = element.textContent;
        const sensitiveWords = getSensitiveWords(content);

        if (sensitiveWords.length === 0) return;

        switch(config.contentHandling) {
            case "hide":
                // 只隐藏内容,不影响布局
                element.style.visibility = "hidden";
                break;

            case "blur":
                element.style.filter = "blur(4px)";
                element.title = `包含敏感词: ${sensitiveWords.join(', ')}`;
                break;

case "replace":
                // 替换内容但保留元素结构,同时显示识别到的词语
                const replacement = document.createElement('span');
                // 确保配置正确加载,使用默认样式作为备选
                const noticeStyle = config.noticeStyle || {
                    backgroundColor: "rgba(255, 68, 68, 0.9)",
                    color: "white",
                    padding: "8px 12px",
                    borderRadius: "4px",
                    fontSize: "12px",
                    margin: "3px 0",
                    display: "inline-block"
                };
                replacement.style.cssText = `
                    background: ${noticeStyle.backgroundColor};
                    color: ${noticeStyle.color};
                    padding: ${noticeStyle.padding};
                    border-radius: ${noticeStyle.borderRadius};
                    font-size: ${noticeStyle.fontSize};
                    margin: ${noticeStyle.margin};
                    display: ${noticeStyle.display};
                `;
                // 在屏蔽提示后添加识别到的词语
                replacement.textContent = `${config.replacementText || '[敏感内容已屏蔽]'} [识别到: ${sensitiveWords.join(', ')}]`;

                // 保存原始内容到数据集,便于调试
                element.dataset.originalContent = content;

                // 清空并替换内容
                element.innerHTML = '';
                element.appendChild(replacement);
                break;
                // 在屏蔽提示后添加识别到的词语
                replacement.textContent = `${config.replacementText} [识别到: ${sensitiveWords.join(', ')}]`;

                // 保存原始内容到数据集,便于调试
                element.dataset.originalContent = content;

                // 清空并替换内容
                element.innerHTML = '';
                element.appendChild(replacement);
                break;
        }
    }

    // 从JS文本中提取可能的内容并处理
    function processScriptContent(scriptText) {
        if (!config.enhancedScanning.scanScripts || !scriptText) return;

        // 尝试从JS中提取可能的文本内容
        // 匹配字符串模式
        const stringPattern = /(["'])(.*?)1/g;
        let match;
        const extractedStrings = [];

        while ((match = stringPattern.exec(scriptText)) !== null) {
            if (match[2] && match[2].length > 5) { // 忽略过短的字符串
                extractedStrings.push(match[2]);
            }
        }

        // 检查提取的字符串是否包含敏感词
        extractedStrings.forEach(str => {
            if (hasSensitiveWord(str)) {
                // 这里我们不能直接修改脚本内容,但可以记录并在控制台提示
                console.log(`检测到脚本中包含敏感内容: ${getSensitiveWords(str).join(', ')}`);

                // 尝试找到使用这些字符串的DOM元素并处理
                setTimeout(() => {
                    findAndProcessElementsWithText(str);
                }, config.enhancedScanning.scanDelay);
            }
        });
    }

    // 查找并处理包含特定文本的元素
    function findAndProcessElementsWithText(text) {
        const xpath = `//*[contains(text(), '${escapeXpathString(text)}')]`;
        const result = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

        for (let i = 0; i  {
            const elements = document.getElementsByTagName(tag);
            // 限制单次扫描数量,避免阻塞
            const maxScan = 200;
            const scanCount = Math.min(elements.length, maxScan);

            for (let i = 0; i  {
            warning.style[key] = config.globalWarning.style[key];
        });

        // 警告信息
        const message = document.createElement('span');
        message.textContent = config.globalWarning.message;
        warning.appendChild(message);

        // 关闭按钮
        const closeBtn = document.createElement('button');
        closeBtn.textContent = '关闭';
        Object.keys(config.globalWarning.closeBtn).forEach(key => {
            closeBtn.style[key] = config.globalWarning.closeBtn[key];
        });
        closeBtn.addEventListener('click', () => {
            warning.remove();
        });
        warning.appendChild(closeBtn);

        // 添加到页面
        document.body.appendChild(warning);
    }

    // 监控AJAX请求
    function monitorAjaxRequests() {
        if (!config.enhancedScanning.monitorAjax || isWhitelisted()) return;

        // 重写XMLHttpRequest
        const originalXhrOpen = XMLHttpRequest.prototype.open;
        XMLHttpRequest.prototype.open = function(method, url) {
            this.addEventListener('load', function() {
                try {
                    // 尝试处理响应内容
                    if (this.responseText) {
                        // 检查响应文本是否包含敏感词
                        if (hasSensitiveWord(this.responseText)) {
                            console.log(`检测到AJAX响应中包含敏感内容: ${url}`);
                            processJsonData(this.responseText);

                            // 延迟扫描,等待数据渲染到DOM
                            setTimeout(scanContent, config.enhancedScanning.scanDelay);
                        }
                    }
                } catch (e) {
                    console.error('处理AJAX响应时出错:', e);
                }
            });
            return originalXhrOpen.apply(this, arguments);
        };

        // 监控fetch请求
        const originalFetch = window.fetch;
        window.fetch = async function(input, init) {
            const response = await originalFetch.apply(this, arguments);

            // 克隆响应以便处理
            const clonedResponse = response.clone();

            try {
                // 尝试解析为文本
                const text = await clonedResponse.text();
                if (hasSensitiveWord(text)) {
                    console.log(`检测到Fetch响应中包含敏感内容: ${input}`);
                    processJsonData(text);

                    // 延迟扫描,等待数据渲染到DOM
                    setTimeout(scanContent, config.enhancedScanning.scanDelay);
                }
            } catch (e) {
                console.error('处理Fetch响应时出错:', e);
            }

            return response;
        };
    }

    // 初始化
    function init() {
        // 白名单网站不执行任何操作
        if (isWhitelisted()) return;

        // 1. 显示全局警告(如果是黑名单网站)
        if (isBlacklisted()) {
            showGlobalWarning();
        }

        // 2. 监控AJAX请求
        monitorAjaxRequests();

        // 3. 初始扫描
        scanContent();

        // 4. 延迟再次扫描,确保所有内容加载完成
        setTimeout(scanContent, 1000);
        setTimeout(scanContent, 3000);

        // 5. 增强版DOM监听
        const observer = new MutationObserver((mutations) => {
            // 限制监听频率
            observer.disconnect();

            let needRescan = false;

            mutations.forEach(mutation => {
                // 处理新增节点
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === 1) { // 元素节点
                        if (!node.dataset.processed) {
                            // 检查元素本身
                            if (hasSensitiveWord(node.textContent)) {
                                handleSensitiveElement(node);
                            }

                            // 如果是script标签,处理其内容
                            if (config.enhancedScanning.scanScripts && node.tagName === 'SCRIPT' && node.textContent) {
                                processScriptContent(node.textContent);
                            }

                            needRescan = true;
                        }
                    } else if (node.nodeType === 3) { // 文本节点
                        if (hasSensitiveWord(node.textContent)) {
                            needRescan = true;
                        }
                    }
                });

                // 处理文本内容变化
                if (mutation.type === 'characterData' && mutation.target.nodeType === 3) {
                    if (hasSensitiveWord(mutation.target.textContent)) {
                        needRescan = true;
                    }
                }
            });

            // 如果需要,重新扫描
            if (needRescan) {
                setTimeout(scanContent, config.enhancedScanning.scanDelay);
            }

            // 重新启用监听
            setTimeout(() => {
                observer.observe(document.body, {
                    childList: true,
                    subtree: true,
                    characterData: true,
                    attributes: false
                });
            }, config.enhancedScanning.scanDelay);
        });

        // 启动监听
        observer.observe(document.body, {
            childList: true,
            subtree: true,
            characterData: true,
            attributes: false
        });
    }

    // 确保页面加载完成后执行
    if (document.readyState === 'complete') {
        init();
    } else {
        window.addEventListener('load', init);
    }
})();

如图添加白名单。

文章来源于互联网:反色情油猴脚本开源(支持含js的html)

相关推荐: 提前购|基于SSM+vue的创新型产品提前购平台(源码+数据库+文档)

创新型产品提前购平台 基于SSM+vue的创新型产品提前购平台 一、前言 二、系统设计 三、系统功能设计  系统功能实现 后台模块实现 管理员模块实现 发布企业管理实现 个体管理实现 投资企业管理实现 四、数据库设计  五、核心代码  六、论文参考 七、最新计…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » 反色情油猴脚本开源(支持含js的html)
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们