冰箱研会长e-3M 发表于 2021-1-10 22:41

论坛屏蔽功能的快捷方式脚本 1.0

本帖最后由 冰箱研会长e-3M 于 2021-1-12 19:52 编辑

1.0版本
如@nessaj 所建议的一般, 1.0版本使用Discuz本体的黑名单功能.
脚本的实质为快捷方式.
https://gitee.com/Arxher/ubb-img-links/raw/master/wikifiles/20210112194951.png

以前的代码和讨论放到第二页了, 如果有好奇的人可以点进去看, fork上也有历史版本> <


现已支持一键屏蔽...LINK
现在还不能管理被屏蔽的用户, 等我后续添加吧...
各位可以通过打开控制台来看到自己都屏蔽了谁..
预计在右上角加入一个input来实现直接管理


https://gitee.com/Arxher/ubb-img-links/raw/master/wikifiles/20210112172719.png


---------------

混用绝对相对XPath了, 因为XPath变动加入的冗余判断不需要了....

-------

好的吧... 没想到自己的帖子的XPATH会变化...
// ==UserScript==
// @name         S1 User Blocker
// @namespace    http://tampermonkey.net/
// @version      0.3
// @descriptionBlock certain user's content
// @author       冰箱研会长
// @match      https://bbs.saraba1st.com/2b/*
// ==/UserScript==

var User_Blocked = new Array(`要屏蔽的用户1`,`这里用的是键盘左上角的backtick符号`,`逗号分隔主体`);
var Correspond_Section = new Array(`和用户1对应的板块名称`,`PC数码`,`动漫论坛PC数码`);

function getElementByXpath(path) {
    return document.evaluate(path, document, null,
                           XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}


function S1_Reply_Blocker(){
    var PostLists = getElementByXpath(`/html/body/div/div/div`);
    if(PostLists){
      //check if exist
      if(PostLists.id == `mdly`){
            //if this is your thread, the xpath of threadlist will be 8 4 3
            //8 4 2 will have id "mdly"
            PostLists = getElementByXpath(`/html/body/div/div/div`);
            if(PostLists){
                //check if new postlists exist, if so, append normal procedure but for 842
                var PostCounter = 1;
                while(getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`)){
                  var PostAuthor = getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]/table/tbody/tr/td/div/div/div/a`);
                  if(PostAuthor){
                        if( User_Blocked.includes(PostAuthor.innerText) ){
                            var PostSection = getElementByXpath(`/html/body/div/div/div/a`).innerText;
                            if(Correspond_Section == ""){
                              getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`).style.display = `none`;
                            }else if(Correspond_Section.includes(PostSection)){
                              getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`).style.display = `none`;
                            }
                        }
                  }
                  PostCounter = PostCounter + 1;
                }
            }
      }else{
            //this is not your thread, so normal 842 will be active
            var PostCounter = 1;
            while(getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`)){
                var PostAuthor = getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]/table/tbody/tr/td/div/div/div/a`);
                if(PostAuthor){
                  if( User_Blocked.includes(PostAuthor.innerText) ){
                        var PostSection = getElementByXpath(`/html/body/div/div/div/a`).innerText;
                        if(Correspond_Section == ""){
                            getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`).style.display = `none`;
                        }else if(Correspond_Section.includes(PostSection)){
                            getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`).style.display = `none`;
                        }
                  }
                }
                PostCounter = PostCounter + 1;
            }
      }
    }

}

function S1_Sure_Blocker(){
    var SureList = getElementByXpath('/html/body/div/div/div/div/div/div/form/table');
    if(SureList){
      var SureCounter = 1;
      while(getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]`)){
            var SureAuthor = getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]/tr/td/cite/a`);
            if(SureAuthor){
                if(User_Blocked.includes(SureAuthor.innerText)){
                  var SureSection = getElementByXpath(`/html/body/div/div/div/a`).innerText;
                  if(Correspond_Section == ""){
                        getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]`).style.display = `none`;
                  }else if(Correspond_Section.includes(SureSection)){
                        getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]`).style.display = `none`;
                  }
                }
            }
            SureCounter = SureCounter + 1;
      }
    }
}

S1_Reply_Blocker();
S1_Sure_Blocker();
--------------------

应坛友要求 增加了和板块的匹配, 拿大号测试了一下, 至少屏蔽回复的部分没什么问题.
link

之前在qq空间里抱怨了一下先前提到的JS的民工感, 一个一直很关照我的学长花了一个小时给我介绍了一下JS的现状.
然后拿出Xpath这个东西, 这次的脚本几乎是完全基于Xpath的, 虽然可读性差了很多, 但确实不需要人工便利HTML树了...


// ==UserScript==
// @name         S1 User Blocker
// @namespace    http://tampermonkey.net/
// @version      0.2
// @descriptionBlock certain user's content
// @author       冰箱研会长
// @match      https://bbs.saraba1st.com/2b/*
// ==/UserScript==

var User_Blocked = new Array(`要屏蔽的用户1`,`这里用的是键盘左上角的backtick符号`,`逗号分隔主体`);
var Correspond_Section = new Array(`和用户1对应的板块名称`,`PC数码`,`动漫论坛PC数码`);

function getElementByXpath(path) {
    return document.evaluate(path, document, null,
                           XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

function S1_Reply_Blocker(){
    var PostLists = getElementByXpath(`/html/body/div/div/div`);
    if(PostLists){
      var PostCounter = 1;
      while(getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`)){
            var PostAuthor = getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]/table/tbody/tr/td/div/div/div/a`);
            if(PostAuthor){
                if( User_Blocked.includes(PostAuthor.innerText) ){
                  var PostSection = getElementByXpath(`/html/body/div/div/div/a`).innerText;
                  if(Correspond_Section == ""){
                        getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`).style.display = `none`;
                  }else if(Correspond_Section.includes(PostSection)){
                        getElementByXpath(`/html/body/div/div/div/div[${PostCounter}]`).style.display = `none`;
                  }
                }
            }
            PostCounter = PostCounter + 1;
      }
    }
}

function S1_Sure_Blocker(){
    var SureList = getElementByXpath('/html/body/div/div/div/div/div/div/form/table');
    if(SureList){
      var SureCounter = 1;
      while(getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]`)){
            var SureAuthor = getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]/tr/td/cite/a`);
            if(SureAuthor){
                if(User_Blocked.includes(SureAuthor.innerText)){
                  var SureSection = getElementByXpath(`/html/body/div/div/div/a`).innerText;
                  if(Correspond_Section == ""){
                        getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]`).style.display = `none`;
                  }else if(Correspond_Section.includes(SureSection)){
                        getElementByXpath(`/html/body/div/div/div/div/div/div/form/table/tbody[${SureCounter}]`).style.display = `none`;
                  }
                }
            }
            SureCounter = SureCounter + 1;
      }
    }
}

S1_Reply_Blocker();
S1_Sure_Blocker();



--------------------------


考完研了, 开始清空日记里 "要做的事情" 列表.
10月中旬, 我写了 "不会JS, 写不出循环删除onedrive回收站的脚本".
虽然这个问题, 后来用一个.net体系下的dll解决了, 但JS "能操作网页" 这个吸引力还是保留下来了.
于是我开始尝试写一些DOM脚本了, 常逛S1, 就拿S1开刀吧.

因为S1好像没什么显式屏蔽用户的方式? 好像有人提到过一个要先发好友申请再屏蔽的方式, 然而申请好友... 向一些用户申请好友会导致我心理性呕吐,
所以不如写一个屏蔽回复和主题的脚本.
之前为了发AA在另一个帖子写了改样式的脚本, 这个脚本是其的简单修改.
下方是屏蔽用户的脚本本体, 可以在Tampermonkey里新建之后复制粘贴.
(link)


// ==UserScript==
// @name         S1 User Blocker
// @namespace    http://tampermonkey.net/
// @version      0.1
// @descriptionBlock certain user's content
// @author       冰箱研会长
// @match      https://bbs.saraba1st.com/2b/*
// ==/UserScript==

var User_Blocked = new Array("要屏蔽的用户","用半角逗号分开","还要用双引号括起来");

function S1_Reply_Blocker(NodeRoot){
    var PostLists = NodeRoot.getElementById("postlist");
    if(PostLists){
      var PostTables = PostLists.getElementsByClassName("plhin");
      for (var i=0;i< PostTables.length;i++){
            var PostTable = PostTables;
            if(User_Blocked.includes( PostTable.getElementsByClassName("pls favatar").
                                     getElementsByClassName("authi").
                                     getElementsByTagName("a").
                                     innerText)){
                PostTable.parentElement.style.display = "none";
            }
      }
    }
}

function S1_Sure_Blocker(NodeRoot){
    var SureList = NodeRoot.getElementById("threadlisttableid");
    if(SureList){
      var SureAuthors = SureList.getElementsByClassName("by");
      for (var counter = 0;counter < SureAuthors.length;counter=counter + 2){
            var SureAuthor = SureAuthors;
            if(User_Blocked.includes(SureAuthor.
                                     getElementsByTagName("a").
                                     innerText)){
                SureAuthor.parentElement.parentElement.style.display = "none";
            }
      }
    }

}

S1_Reply_Blocker(document);
S1_Sure_Blocker(document);

应该是可以用的, 我个人测试没啥问题. 希望能帮到人(?).

说起来在学习DOM的时候, 我看到了一个叫TypeScript的东西.
我对前端技术的了解, 除了.net的blazor以外, 就只剩下基础的html和css, js也才是刚上手,
这个ts好像热度还蛮高的, 看介绍是基于JS的超集而且可以编译到纯JS?
我看好多专业的开发人员都说 "终于可以看懂代码了", 是说TS语法的可读性要高还是说有易于维护的地方呢?
TS官方文档的DOM部分我才刚看一小点, 看上去和JS没啥不一样的, 有学过的经验者说说TS解决了什么痛点么....

另外, 在操作DOM的时候...怎么说...民工感好强啊...
自己好像一直在捋HTML的层级, 感觉这样很快就腻了...JS应该有一些我不知道的特殊技巧吧...

噗(/≧▽≦)/
顺便看了眼站上其他脚本
https://gitee.com/Arxher/ubb-img-links/raw/master/wikifiles/20210110225418.png
这个人脚本名字和描述都好有意思



EraserKing 发表于 2021-1-10 23:01

TS你就理解成强类型的JS
不然十个参数一传你根本不知道发生了什么

— from Xiaomi MIX 2S, Android 10 of S1 Next Goose v2.4.4

Herreimu 发表于 2021-1-10 23:04

截图里这人还有个屏蔽华为用户的脚本

lwa190212 发表于 2021-1-10 23:08

虽然我也自己写了一个,但是s1屏蔽功能还是有的啊
https://p.sda1.dev/0/f8ca397e6613f28b209ae4dfe7f66394/chrome_2021-01-10_23-07-08.png

冰箱研会长 发表于 2021-1-10 23:09

本帖最后由 冰箱研会长 于 2021-1-10 23:11 编辑

lwa190212 发表于 2021-1-10 23:08
虽然我也自己写了一个,但是s1屏蔽功能还是有的啊
诶诶诶。。。

又一段人生变得没意义了。。。
小丑原来就是我.jpg

Prushka 发表于 2021-1-10 23:24

这个屏蔽功能能屏蔽主题帖和回复,电脑端已经很好用了吧

Magnesium 发表于 2021-1-10 23:35

TypeScript 就是带类型注解的 js 啦
js 刚入门的话是理解不了 ts 的好的
js 业务写的多的前端狗才能深刻体会到 ts 解决了什么痛点,lz 没必要强行理解的。

[皆神孝介] 发表于 2021-1-11 17:06

冰箱研会长 发表于 2021-1-10 23:09
诶诶诶。。。

又一段人生变得没意义了。。。


有没有办法做个在特定版块屏蔽特定ID的脚本?出了这个特定版块就解除的

冰箱研会长 发表于 2021-1-11 17:10

[皆神孝介] 发表于 2021-1-11 17:06
有没有办法做个在特定版块屏蔽特定ID的脚本?出了这个特定版块就解除的
...

可以,我加工一下。。。

kll85757 发表于 2021-1-11 17:13

冰箱研会长e-3M 发表于 2021-1-11 20:03

[皆神孝介] 发表于 2021-1-11 17:06
有没有办法做个在特定版块屏蔽特定ID的脚本?出了这个特定版块就解除的
...
兄弟 写完了... 见主楼

兮嘉 发表于 2021-1-11 20:45

想问问这个脚本能实现禁止被拉黑用户回复楼层的功能吗

冰箱研会长e-3M 发表于 2021-1-11 20:58

兮嘉 发表于 2021-1-11 20:45
想问问这个脚本能实现禁止被拉黑用户回复楼层的功能吗

不能... 但是你看不见他回复了什么

01一14 发表于 2021-1-11 21:10

本帖最后由 01一14 于 2021-2-2 11:14 编辑

编辑

冰箱研会长e-3M 发表于 2021-1-12 17:31

更新了, 自定一下

nessaj 发表于 2021-1-12 18:28

冰箱研会长e-3M 发表于 2021-1-12 18:32

nessaj 发表于 2021-1-12 18:28
既然论坛本身就有黑名单功能只是不方便,那你的脚本不是只需要放一个按钮,点了之后添加到自带黑名单就行了 ...
"原生的不能按板块屏蔽"

要找正当理由的话就是这句话, 真实原因就是 "想写". (需要一个理由)
玩腻了之后我就会按照你说的这种重写一个.

nessaj 发表于 2021-1-12 18:56

黑夜守望者 发表于 2021-1-13 09:11

本帖最后由 黑夜守望者 于 2021-1-13 09:17 编辑

冰箱研会长 发表于 2021-1-10 23:09
诶诶诶。。。

又一段人生变得没意义了。。。

不是吧,您真的不知道有黑名单功能啊而且早就有s1black这个脚本了,两个搭配一起可以让你永远看不见你不想看见的人(想恢复还麻烦)

不过能按板块屏蔽听上去不错,虽然对大部分人来说讨厌一个人根本不会再想看他的其他言论是否理客中了吧......

凶手 发表于 2021-1-13 10:48

Magnesium 发表于 2021-1-10 23:35
TypeScript 就是带类型注解的 js 啦
js 刚入门的话是理解不了 ts 的好的
js 业务写的多的前端狗才能深刻体 ...

现在的趋势是 ts 被采用的越来越多 所以不能够体会 ts 不好地方的人也在变多
https://medium.com/javascript-scene/the-typescript-tax-132ff4cb175b

自己是 c# js ts 这个顺序 对 ts 带来的 mind burden 体会的比较多
当然综合考虑它肯定是目前同类解决方案里最合适的了

凶手 发表于 2021-1-13 10:50

kll85757 发表于 2021-1-11 17:13
毕竟是用来写ui的技术ios安卓开发同理gui开发也是开发做的人多给人感觉就廉价   毕竟技术还是看人怎 ...

ui 方面的开发一点不比其他领域容易 同样非常复杂艰难
https://iqkui.com/the-elements-of-ui-engineering/

国内的情况就是简单的市场选择 对 ui/ux 带来的价值不认可 所以要求低 水平自然也就不会好到哪了

kll85757 发表于 2021-1-13 11:11

ulysses 发表于 2021-1-13 12:46

以前的脚本也能按照版块屏蔽吧,把match那个改成相应的url

https://greasyfork.org/zh-CN/scripts/26644-s1black

https://greasyfork.org/zh-CN/scripts/376819-s1%E5%B8%96%E5%AD%90%E5%B1%8F%E8%94%BD%E5%99%A8
页: [1]
查看完整版本: 论坛屏蔽功能的快捷方式脚本 1.0