Greasy Fork

Greasy Fork is available in English.

自动屏蔽三无用户点赞超过50%的回答

自动屏蔽知乎三无用户点赞数>=50%的回答

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         自动屏蔽三无用户点赞超过50%的回答
// @namespace    http://bingkubei.cn/
// @version      0.93
// @description  自动屏蔽知乎三无用户点赞数>=50%的回答
// @author       flowfire
// @match        https://www.zhihu.com/question/*
// @match        https://www.zhihu.com/settings/filter
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

/*
依次获取每个回答的点赞用户
取前50位(太多怕卡,可以自己定义)
没有头像,0赞同,0感谢,0提问,0回答
只要其中超过三样,就算做三无用户
三无用户点赞数超过样本的一半则自动屏蔽
*/
(function() {
    "use strict";
    /*
    var maxcount = 50;//检查数量,默认50,如果网好可以多设一点、最大可以设置成Infinity
    var timer = 1000;//循环检查的时钟,默认一秒循环一次,已经检查的不会再次检查,所以保持1s即可。
    var filter = 0.5;// 阈值, 当三无用户占比超过这个值得时候,屏蔽之
    var autohide = true;// 是否自动隐藏,如果改为 false ,则回答默认不隐藏,只在答案前加一个标签说明
    */

    /*不需要再修改脚本。现在可以直接在知乎设置中的 【屏蔽】一栏找到设置选项。*/
    /*链接为  https://www.zhihu.com/settings/filter */

    var maxcount = GM_getValue("maxcount", 50);//检查数量,默认50,如果网好可以多设一点、最大可以设置成Infinity
    var timer = GM_getValue("timer", 1000);//循环检查的时钟,默认一秒循环一次,已经检查的不会再次检查,所以保持1s即可。
    var filter = GM_getValue("filter",0.5);// 阈值, 当三无用户占比超过这个值得时候,屏蔽之
    var autohide = GM_getValue("autohide",true);// 是否自动隐藏,如果改为 false ,则回答默认不隐藏,只在答案前加一个标签说明
    var power = GM_getValue("power","1,1,1,1,1,1,4");

    if($("#zh-setting-page-black-list-wrap").length!==0){
        $("#zh-setting-page-black-list-wrap").append('<div class="settings-section" id="filter-vote-people"></div>');
        var fil = $("#filter-vote-people");
        fil.append('<div class="settings-section-title"><h2>屏蔽答案设置</h2><p class="settings-section-desc">屏蔽三无用户点赞过多的答案,所有输入框按回车提交。</p></div>');
        fil.append('<div class="settings-item clearfix"><div class="settings-item-content"></div></div>');
        fil = fil.find(".settings-item-content");
        fil.append('<input class="zg-form-text-input zg-mr15 label-input-label" type="text" placeholder="最多检查用户数" aria-label="最多检查用户数" title="最多检查用户数" role="combobox" aria-autocomplete="list" value="'+maxcount+'" data-gmfilter="maxcount">');
        fil.append("<div>最多检查用户数量,当前值:<span>"+maxcount+"</span>。默认为50,设为Infinity则表示检查所有点赞用户(不建议,可能会导致加载缓慢)</div>");
        fil.append('<br/>');
        fil.append('<input class="zg-form-text-input zg-mr15 label-input-label" type="text" placeholder="循环检查的时间" aria-label="循环检查的时间" title="循环检查的时间" role="combobox" aria-autocomplete="list" value="'+timer+'" data-gmfilter="timer">');
        fil.append("<div>循环检查的时间(毫秒),当前值:<span>"+timer+"</span>。默认为1000,一般不需要修改。</div>");
        fil.append('<br/>');
        fil.append('<input class="zg-form-text-input zg-mr15 label-input-label" type="text" placeholder="阈值" aria-label="阈值" title="阈值" role="combobox" aria-autocomplete="list" value="'+filter+'" data-gmfilter="filter">');
        fil.append("<div>阈值,当前值:<span>"+filter+"</span>。默认为0.5,当三无用户占比超过这个值则屏蔽。</div>");
        fil.append('<br/>');
        fil.append('<input class="zg-form-text-input zg-mr15 label-input-label" type="text" placeholder="自动隐藏" aria-label="自动隐藏" title="自动隐藏" role="combobox" aria-autocomplete="list" value="'+power+'" data-gmfilter="power">');
        fil.append("<div>每个信息的权重,当前值:<span>"+power+"</span>。默认为 1,1,1,1,1,1,4 </div>");
        fil.append("<div>依次代表【头像,简介,赞同,感谢,提问,回答,阈值】。例如将第一个逗号前的值改为3,代表头像的权重为3</div>");
        fil.append("<div>判断时,一个用户的“三零属性”默认为0,每有一个属性为零(如没设置头像,没有简介,赞同为0),则将“三零属性”加上对应的权重值</div>");
        fil.append("<div>当一个用户的“三零属性”大于等于最后一位的阈值时,将该用户判定为三零用户</div>");
        fil.append("<div>例:将该项设置为 1,2,3,4,5,6,7 ,则没设置头像则+1,没有提问则+5,没有回答则+6,当最后的值>=7,则认为是三零</div>");
        
        fil.find("[data-gmfilter]").on("keypress",function(e){
            if(e.keyCode===13||e.keyCode===10){
                var value;
                switch($(this).attr("data-gmfilter")){
                    case "maxcount":
                        value = $(this).val();
                        value = Number(value);
                        if(value!==value){
                            alert("请输入数字");
                            return;
                        }
                        if(value<=10){
                            alert("点赞数小于10不会被标记或隐藏。");
                            return;
                        }
                        GM_setValue("maxcount",value);
                        break;
                    case "timer":
                        value = $(this).val();
                        value = Number(value);
                        if(value!==value){
                            alert("请输入数字");
                            return;
                        }
                        GM_setValue("timer",value);
                        break;
                    case "filter":
                        value = $(this).val();
                        value = Number(value);
                        if(value!==value){
                            alert("请输入数字");
                            return;
                        }
                        if(value>=1||value<=0){
                            alert("该值必须大于0小于1");
                            return;
                        }
                        GM_setValue("filter",value);
                        break;
                    case "autohide":
                        value = $(this).val();
                        if(value=="false"){
                            GM_setValue("autohide",false);
                        }else if(value=="true"){
                            GM_setValue("autohide",true);
                        }else{
                            alert("只能输入 true  或 false");
                        }
                        break;
                    case "power":
                        value = $(this).val();
                        var values = value.split(",");
                        if(values.length!=7){
                            alert("需要以六个英文逗号分隔");
                            return;
                        }
                        var errors = values.every(function(data){
                            var num = Number(data);
                            if(num!==num){
                                errors = true;
                                alert("被分割的每个部分都必须是数字");
                                return false;
                            }
                            return true;
                        });
                        if(!errors){
                            return;
                        }
                        GM_setValue("power",value);
                        break;
                }
                var name = $(this).attr("data-gmfilter");
                value = GM_getValue(name).toString();
                $(this).next().find("span").html(value);
            }
        });
    }
    //回答区域
    var box = $("#zh-question-answer-wrap");
    var check = function(){box.children().each(function(index,dom){

        //每个单独的回答
        if($(dom).attr("data-checked-user")=="true"){
            //如果该回答已经被标记过,则跳过
            return;
        }
        //标记
        $(dom).attr("data-checked-user","true");

        //获取回答id以及初始化一些值
        var aid = $(dom).attr("data-aid");
        var count = 0;//点赞用户数量
        var whiteuser = 0;//三零用户数量
        var calcUser = function(nexturl){

            //计算用户
            if(nexturl===""||count>=maxcount){//如果用户已经判断完或用户超过定义的数量,则结束
                if(count>10&&whiteuser/count>=filter){//如果点赞人数超过10并且三零用户超过阈值,则标记
                    $(dom).children().hide();
                    //$(dom).css("background","red");
                    var text = "(已统计赞数:"+count+",三无用户数:"+whiteuser+")";
                    var html = "<div data-tag=\"hide-answer\" style=\"border:1px solid #c66;background:#fcc;color:#a33;padding:5px 10px;border-radius:4px;cursor:pointer;margin:5px 0;\">该回答由于三无用户的点赞数过多而被隐藏"+text+" 【点击显示】</div>";

                    $(html).insertBefore($(dom).find(".zm-item-rich-text"));
                    $(dom).find("[data-tag=\"hide-answer\"]").on("click",function(){
                        if($(this).parent().attr("data-hide")=="true"){
                            $(this).parent().children().hide();
                            $(this).show();
                            $(this).parent().removeAttr("data-hide");
                            $(this).html("该回答由于三无用户的点赞数过多而被隐藏"+text+" 【点击显示】");
                        }else{
                            $(this).parent().children().show();
                            $(this).parent().attr("data-hide","true");
                            $(this).html("给该回答点赞的三无用户过多"+text+" 【点击隐藏】");
                        }
                    });
                    if(!autohide){
                        $(dom).find("[data-tag=\"hide-answer\"]").click();
                    }
                }
                return;
            }

            //获取点赞用户信息,知乎居然不是返回数据而是直接返回html简直脑子有坑
            $.ajax({
                url : nexturl,
                method : "get",
                dataType : "json",
                success : function(data){
                    count += data.payload.length;//计算用户的数量
                    data.payload.forEach(function(data){
                        //依次判断每个用户是否为三零用户
                        var zero = 0;//信息为0的个数
                        var userinfo = $($.parseHTML(data));

                        //获取头像、点赞数等信息
                        var img = userinfo.find("img").attr("src");
                        var intro = userinfo.find(".bio.hidden-phone").html();
                        var zt = userinfo.find(".status li span:eq(0)").html();
                        var gx = userinfo.find(".status li span:eq(1)").html();
                        var tw = userinfo.find(".status li a:eq(0)").html();
                        var hd = userinfo.find(".status li a:eq(1)").html();
                        
                        //可以在此用自己的方法调整权重
                        var powers = power.split(",");
                        if(img == "https://pic1.zhimg.com/da8e974dc_m.jpg")
                            zero += Number(powers[0]);
                        if(intro=="")
                            zero += Number(powers[1]);
                        if(zt == "0 赞同")
                            zero += Number(powers[2]);
                        if(gx == "0 感谢")
                            zero += Number(powers[3]);
                        if(tw == "0 提问")
                            zero += Number(powers[4]);
                        if(hd == "0 回答")
                            zero += Number(powers[5]);
                        if(zero>=Number(powers[6]))
                            whiteuser += 1;
                    });
                    calcUser(data.paging.next);
                }
            });
        };
        setTimeout(function(){calcUser("/answer/"+aid+"/voters_profile");},0);
    });
                          };
    setInterval(check,timer);
    // Your code here...
})();