// ==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的创新型产品提前购平台 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 发布企业管理实现 个体管理实现 投资企业管理实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计…
5bei.cn大模型教程网










