// ==UserScript==
// @name Bangumi Anti-敏感词
// @description 自动在敏感词中间插入零宽空格。
// @version 1.0.3
// @author wataame
// @match *://bgm.tv/*
// @match *://chii.in/*
// @match *://bangumi.tv/*
// @grant none
// @license MIT
// @namespace https://greasyfork.org/users/1389779
// ==/UserScript==
(function() {
'use strict';
// 内置敏感词库
const DEFAULT_WORDS = [
"白粉", "香艳", "习近平", "服务中心", "李克强", "支那", "前列腺",
"办证", "辦證", "毕业证", "畢業證", "冰毒", "安乐死", "腾讯", "隐形眼镜",
"聊天记录", "枪", "电动车", "医院", "烟草", "早泄", "精神病", "毒枭",
"春节", "当场死亡", "步枪", "步槍", "春药", "春藥", "大发", "大發",
"大麻", "代开", "代開", "迷药", "代考", "贷款", "貸款", "发票", "發票",
"海洛因", "妓女", "可卡因", "批发", "批發", "皮肤病", "皮膚病", "嫖娼",
"窃听器", "竊听器", "上门服务", "上門服务", "商铺", "商鋪", "手枪", "手槍",
"铁枪", "鐵枪", "钢枪", "鋼枪", "特殊服务", "特殊服務", "騰訊", "罂粟",
"牛皮癣", "甲状腺", "假钞", "香烟", "香煙", "学位证", "學位證",
"摇头丸", "搖頭丸", "援交", "找小姐", "找小妹", "作弊", "v信",
"医疗政策", "迷魂药", "迷情粉", "迷藥", "麻醉药", "肛门", "麻果", "麻古",
"假币", "私人侦探", "提现", "借腹生子", "代孕", "客服电话", "刻章",
"套牌车", "麻将机", "走私"
];
// 零宽空格字符
const ZERO_WIDTH_SPACE = '\u200B';
// 直接使用内置词库
const sensitiveWords = DEFAULT_WORDS;
// 处理敏感词
function processSensitiveWords(text) {
let result = text;
if (!Array.isArray(sensitiveWords)) {
console.warn('Sensitive words list is not an array.');
return text; // Return original text if words list is invalid
}
sensitiveWords.forEach(word => {
if (typeof word === 'string' && word.length > 1) {
try {
const mid = Math.floor(word.length / 2);
const replacement = word.slice(0, mid) + ZERO_WIDTH_SPACE + word.slice(mid);
// 确保word中的特殊正则字符被转义
const escapedWord = word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
result = result.replace(new RegExp(escapedWord, 'g'), replacement);
} catch (e) {
console.error(`Error processing word "${word}":`, e);
}
}
});
return result;
}
// 监听输入框
function bindInputs() {
const selectors = [
'#title', '#content', '#tpc_content',
'#comment', 'textarea', 'input[type="text"]'
];
selectors.forEach(selector => {
document.querySelectorAll(selector).forEach(element => {
if (element.dataset.sensitiveProcessed) return; // 避免重复绑定
element.dataset.sensitiveProcessed = 'true';
element.addEventListener('blur', function() {
const processed = processSensitiveWords(this.value);
if (processed !== this.value) {
this.value = processed;
}
});
});
});
}
// 监听页面变化
function observeChanges() {
const observer = new MutationObserver(() => bindInputs());
observer.observe(document.body, { childList: true, subtree: true });
}
// 初始化
function init() {
bindInputs();
observeChanges();
}
// 启动
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();