Greasemonkey亵渎过滤器脚本可用于Youtube评论

时间:2015-09-23 23:21:58

标签: filter youtube greasemonkey profanity

我不知道我在这里谈论的是什么。

在某些网页上,它会过滤掉它们,其他像Youtube评论则无法正常工作。 需要更改哪些代码才能在这些网站中运行?

// ==UserScript==
// @name        profanity_filter
// @namespace   localhost
// @description Profanity filter
// @include     *
// @version     1
// @grant       none
// ==/UserScript==

function recursiveFindTextNodes(ele) {
  var result = [];
  result = findTextNodes(ele,result);
  return result;
}

function findTextNodes(current,result) {
  for(var i = 0; i < current.childNodes.length; i++) {
    var child = current.childNodes[i];
    if(child.nodeType == 3) {
      result.push(child);
    }
    else {
      result = findTextNodes(child,result);
    }
  }
  return result;
}

var l = recursiveFindTextNodes(document.body);

for(var i = 0; i < l.length; i++) {
  var t = l[i].nodeValue;
  t = t.replace(/badword1|badword2|badword3/gi, "****");
  t = t.replace(/badword4/gi, "******");
  t = t.replace(/badword5|badword6|badword7/gi, "*****");
  t = t.replace(/badword8/gi, "******");
  l[i].nodeValue = t;
}

*将代码中的亵渎语言替换为badword

1 个答案:

答案 0 :(得分:-1)

Youtube注释是异步加载的,在页面加载后很长一段时间(默认情况下,用户脚本在DOMContentLoaded事件处执行),因此您需要将代码包装为waitForKeyElements的回调函数使用评论容器的选择器或MutationObserversetInterval

replaceNodes(); // process the page
waitForKeyElements('.comment-text-content', replaceNodes);

function replaceNodes() {
    ..............
    ..............
}

使用setInterval代替waitForKeyElements:

replaceNodes(); // process the page
var interval = setInterval(function() {
    if (document.querySelector('.comment-text-content')) {
        clearInterval(interval);
        replaceNodes();
    }
}, 100);

function replaceNodes() {
    ..............
    ..............
}

P.S。不要盲目地将值分配给节点,首先检查它是否已更改以避免布局重新计算:

if (l[i].nodeValue != t) {
    l[i].nodeValue = t;
}