Twitter过滤器

Twitter推特关键词、昵称过滤器。左下角隐藏按钮进入设置页面、显示当前页面过滤数量。可批量添加关键词,用英文逗号,分割。支持导入导出。

目前為 2021-07-06 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name           Twitter过滤器
// @description    Twitter推特关键词、昵称过滤器。左下角隐藏按钮进入设置页面、显示当前页面过滤数量。可批量添加关键词,用英文逗号,分割。支持导入导出。
// @version      2.9
// @namespace   https://space.bilibili.com/482343
// @author      古海沉舟
// @license     古海沉舟
// @match       https://twitter.com/*
// @exclude     https://twitter.com/i/*
// @exclude     https://twitter.com/intent/*
// @require      https://cdn.staticfile.org/jquery/1.12.4/jquery.min.js
// @grant       GM_getValue
// @grant       GM_setValue
// @grant       GM_deleteValue
// @grant GM_addValueChangeListener
// ==/UserScript==
var i, j, c, fl, fk, x, a, b, mo = 0,
     glzs = 0;

function debugx() {
     glzs++;
     $(".xfsz_sz").text(glzs);
     return 1; // 1 显示log; 0 隐藏log
}
var toObj = (arr) => {
     var obj = {};
     for (var temp in arr) {
          obj[arr[temp]] = true;
     }
     return obj;
};
var toArr = (obj) => {
     var arr = [];
     for (var temp in obj) {
          arr.push(temp);
     }
     return arr;
};
var together = (a, b) => {
     for (var temp = 0; temp < b.length; temp++) {
          if (b[temp] != null && b[temp] != "" && b[temp] != "null" && b[temp].length < 40) {
               a.push(b[temp] + "");
          }
     }
};
var getUniq = (arr) => Array.from(new Set(arr))
//dd 都屏蔽, bt 只屏蔽正文关键词, zz 只屏蔽昵称
var dd = GM_getValue("dd", new Array(""));
var bt = GM_getValue("golvci", new Array(""));
var zz = GM_getValue("zz", new Array(""));
var ddx = new Array();
var btx = new Array();
var zzx = new Array();
let glc = new Array(ddx, btx, zzx)
let glcx = new Array(dd, bt, zz)
let nglc = new Array();
let ml = new Array("dd", "golvci", "zz")
let xfz = 0;
together(ddx, dd);
together(btx, bt);
together(zzx, zz);

GM_addValueChangeListener('dd', function (name, old_value, new_value, remote) {
     dd = new_value;
     glc[0] = dd;
     bt.push.apply(bt, dd);
     zz.push.apply(zz, dd);
})
GM_addValueChangeListener('golvci', function (name, old_value, new_value, remote) {
     bt = new_value;
     glc[1] = bt;
     bt.push.apply(bt, dd);
})
GM_addValueChangeListener('zz', function (name, old_value, new_value, remote) {
     zz = new_value;
     glc[2] = zz;
     zz.push.apply(zz, dd);
})

function bc() {
     //保存
     for (var i = 0; i < 3; i++) {
          glc[i] = getUniq(glc[i]);
          glcx[i] = new Array();
          together(glcx[i], glc[i]);
          GM_setValue(ml[i], glcx[i]);
          glc[i] = new Array();
          together(glc[i], glcx[i]);
     }
     dd = glc[0].concat();
     bt = glc[1].concat();
     zz = glc[2].concat();
     bt.push.apply(bt, dd);
     zz.push.apply(zz, dd);
}
bc();

function glyc() {
     //console.log("开始过滤");
     $("div.css-1dbjc4n.r-1awozwy.r-18u37iz.r-dnmrzs > div.css-901oao.css-bfa6kz.r-1fmj7o5.r-37j5jr.r-ubezar.r-b88u0q.r-rjixqe.r-bcqeeo.r-1udh08x.r-3s2u2q.r-qvutc0 > span > span:not([fil])").each(function () {
          var x = 0;
          var y = $(this).text().toLowerCase().replace(/\n/g, " ").replace(/\s\s/g, " ");
          if (y.length < 2) return;
          //console.log("判断 ", "  :  ", y);
          $(this).attr('fil', '1');
          for (var j = 0; j < zz.length; j++) {
               if (zz[j] != "" && y.indexOf(zz[j]) > -1) {
                    x = 1;
                    break;
               }
          }
          if (x == 1) {
               console.log("删除 昵称 [ ", zz[j], " ]  :  ", y);
               glzs++;
               var zd = 0;
               $(".xfsz_sz").text(glzs);
               //topics[i].remove();
               var pa = $(this).parent();
               for (var i = 0; i < 20; i++) {
                    pa = $(pa).parent();
                    if ($(pa)[0].className == null) continue;
                    if ($(pa)[0].className.toLowerCase() == "css-1dbjc4n r-1igl3o0 r-qklmqi r-1adg3ll r-1ny4l3l") {
                         zd = 1;
                         break;
                    }
               }
               if (zd == 1) {
                    $(pa).html("");
               }
               //$(this).parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().parent().html("");
          }
     });
     $(`article div[dir="auto"][lang]:not([fil])`).each(function () {

          var x = 0;
          var y = $(this).text().toLowerCase().replace(/\n/g, " ").replace(/\s\s/g, " ").split("---")[0];
          if (y.length < 2) return;
          $(this).attr('fil', '1');
          //console.log("判断 ", "  :  ", y);
          for (var j = 0; j < bt.length; j++) {
               if (bt[j] != "" && y.indexOf(bt[j]) > -1) {
                    x = 1;
                    break;
               }
          }
          if (x == 1) {
               console.log("删除关键词 [ ", bt[j], " ]  :  ", y);
               glzs++;
               $(".xfsz_sz").text(glzs);
               //topics[i].remove();
               $(this).parent().parent().parent().parent().parent().parent().parent().parent().parent().html("");
          }
     });
     return true;
}

var wz = location.href;
var xh;
glyc();
var aaa = new Date();
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
var observer = new MutationObserver(function (records) {
     var bbb = new Date();
     if (bbb - aaa > 200) {
          aaa = bbb;
          records.map(function (record) {
               if (record.addedNodes) {
                    glyc();
               }
          });
     }
});
var option = {
     childList: true,
     subtree: true,
};
observer.observe(document.body, option);


//--------------左下角按钮--设置界面-------------
let wdstyle = document.createElement('style');
wdstyle.innerHTML = `
.xfsz {
    height: 80px;
    width: 80px;
    position: fixed;
    transition: 0.5s;
    z-index: 9999;
    opacity: 0;
    left: 0px;
    bottom: 0px;
  }
  .xfsz:hover {
    opacity: 1;
  }
  .xfsz_an {
    left: 1vw;
    bottom: 1vw;
    background-color: rgb(29, 161, 242);
    border-radius: 19px;
    color: #fff;
    cursor: pointer;
    font-size: 20px;
    height: 38px;
    width: 38px;
    line-height: 38px;
    position: absolute;
    text-align: center;
    z-index: 99999;
    user-select: none;
    display: block;
  }
  .xfsz_sz{
    left: 30px;
    bottom: 0px;
    background-color: #333;
    border-radius: 25px;
    color: #fff;
    cursor: pointer;
    font-size: 10px;
    height: 25px;
    width: 25px;
    line-height: 25px;
    position: absolute;
    text-align: center;
    z-index: 99999;
    user-select: none;
    display: block;
  }
  .xfck {
    display: none;
    background: #222;
    width: 700px;
    height: 640px;
    text-align: center;
    position: fixed;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    color: #fff;
    z-index: 99999;
    border: solid 3px #000000;
  }
  .xfsc {
    background: #444;
    right: 20px;
    border-radius: 35px;
    margin-bottom: 13px;
    margin-right: 10px;
    margin-left: 10px;
    cursor: pointer;
    border: solid 5px #444;
    white-space: nowrap;
    float: left;
  }
  .xfsc:hover {
    background: #000;
    border: solid 5px #000;
  }
  .xfan {
    width: 100px;
    height: 40px;
  }
  .xfyy {
    overflow: auto;
    width: 700px;
    height: 430px;
    margin: auto;
  }
  #xf_sr {
    width: 580px;
    height: 32px;
    margin: auto;
  }
  #xf_dc {
    margin-left: 40px;
    margin-right: 40px;
  }
  .xfgb {
    position: absolute;
    right: 3px;
    top: 3px;
    cursor: pointer;
    font-size: 40px;
    width: 40px;
    height: 40px;
    line-height: 40px;
  }
  .xfgb:hover {
    background: #f00;
  }
  .tabbox ul {
    list-style: none;
    display: table;
    margin: 0;
    padding-left: 70px;
    width: 1000px;
  }
  .tabbox ul li {
    float: left;
    width: 120px;
    height: 50px;
    line-height: 50px;
    font-size: 12px;
    border: 1px solid #aaccff;
    cursor: pointer;
    margin-left: 10px;
    margin-right: 10px;
  }

  .tabbox ul li:hover{
    background-color: #111;
    color: white;
    font-weight: bold;
  }
  .tabbox ul li.active {
    background-color: #004f69;
    color: white;
    font-weight: bold;
  }
  .xfan,
  #xf_sr {
    background: #333;
    color: #ddd;
  }
  .xfan:hover,
  #xf_sr:focus {
    background: #111;
    color: #fff;
  }

  `;
let wddiv = `
<div class="xfsz">
    <span class="xfsz_an" title="过滤设置">
    滤
    <span class="xfsz_sz">0
    </span>
    </span>
</div>
<div class="xfck">
    <div>Twitter过滤设置</div>
    <div class="xfgb">X
    </div>
    <div>
        <textarea type="text" name="textfield" id="xf_sr" width="auto"></textarea>
        <br>
        不同过滤词用英文 , 分隔;导入会清空已有的,替换为导入的,导入空白等于删除全部过滤词。
        <br>
        <input type="submit" name="submit" id="xf_zj" class="xfan" value="增加">
        <input type="submit" name="submit" id="xf_dc" class="xfan" value="导出">
        <input type="submit" name="submit" id="xf_dr" class="xfan" value="导入">
    </div>
    <div class="tabbox">
          <ul>
                <li class="active">关键词+昵称</li>
                <li>关键词</li>
                <li>昵称</li>
              </ul>
        <br>
        <div class="xfyy"></div>
    </div>
</div>
`;
document.body.appendChild(wdstyle);
setTimeout(() => {
     document.querySelector("body").innderHTML += wddiv;
     $(wddiv).appendTo($("body"));
     //关闭
     $(".xfgb").click(function () {
          $(".xfck").toggle();
     })
     $(".xfsz_an").click(function () {
          sc();
          $(".xfck").toggle();
     });

     $(".tabbox ul li").click(function () {
          $(this).addClass("active").siblings().removeClass("active");
          //获取选中元素的下标
          var index = $(this).index();
          $(this).parent().siblings().children().eq(index).addClass("active")
               .siblings().removeClass("active");
          xfz = index;
          sc();
     })
     //删除
     function sc() {
          $(".xfyy").empty();
          glc[xfz].forEach(glcc => {
               let a = document.createElement("span");
               $(a).text(glcc).addClass("xfsc");
               $(a).click(function () {
                    glc[xfz] = glc[xfz].filter(item => {
                         return item != $(a).text();
                    })
                    bc();
                    sc();
               })
               $(a).appendTo($(".xfyy"));
          });
     }
     sc();

     //增加
     $("#xf_zj").click(function () {
          nglc = $("#xf_sr").val().split(",");
          together(glc[xfz], nglc);
          glc[xfz] = getUniq(glc[xfz]);
          bc();
          sc();
          $("#xf_sr").val("")
     });

     //导出
     $("#xf_dc").click(function () {
          let s = "";
          glc[xfz].forEach((x) => {
               s += x + ","
          })
          $("#xf_sr").val(s).select();
     });
     //导入
     $("#xf_dr").click(function () {
          glc[xfz] = $("#xf_sr").val().split(",");
          bc();
          sc();
          $("#xf_sr").val("");
     });

     function glsjy() {

     }
}, 1000);