Greasy Fork is available in English.

B站评论优化

1.翻页返回该主题的顶部 2.显示被回复人的现在使用名字 3.ctrl+F10打开配置窗口 4.按时间排列层内评论 5.移植手机版的查看对话

// ==UserScript==
// @name         B站评论优化
// @namespace    http://tampermonkey.net/
// @version      2.3.4.1
// @description  1.翻页返回该主题的顶部 2.显示被回复人的现在使用名字  3.ctrl+F10打开配置窗口 4.按时间排列层内评论 5.移植手机版的查看对话
// @author       You
// @require      http://code.jquery.com/jquery-1.7.2.min.js
// @run-at       document-start
// @match        https://*.bilibili.com/*
// @grant        none
// ==/UserScript==

var avnumber=''; //av号
var pbs={};//存储已经修改过的的列表的data-id
var documentURL=''

$(function() {
    'use strict';
    init();
    $(".video-title").on("DOMSubtreeModified", function(evt) {
        if(document.URL!=documentURL){
            documentURL=document.URL
            pbs={}
            start();
        }
    });
});
function start(){
    getAv();
    backtop();
    var observer = new MutationObserver(function (mutations) {// 创建观察者对象
        loadconfig()
        if(localStorage.getItem("bilibiliExpandlist")=="true"){
            pb();
        }
        if($(".bottom-page.paging-box-big").data("events")){
            if(!($(".bottom-page.paging-box-big").data("events")["mouseup"] )){
                $(".bottom-page.paging-box-big,.header-page.paging-box").on("mouseup","a",function(o){
                    pbs={};
                });
            }
        }
    });
    // 传入目标节点和观察选项
    observer.observe($("#comment").get(0), {childList: true,subtree: true});
}

/*更新评论*/
function pb() {
    $(".list-item.reply-wrap").each(function(i){
        var dataid=$(this).attr("data-id");
        if( pbs[dataid] ||dataid=='' || $(".btn-more[data-pid='"+dataid+"']").length==1){
            return true
        }
        pbs[dataid]=true;

        setuname(1,avnumber,dataid)
        //绑定翻页触发重新获取信息整理评论
        var obj=$(this).find(".con .paging-box");
        $(obj).on("mouseup","a",function(o){
            var targetText=$(o.currentTarget).text()
            var current=Number($(this).parent().find(".current").text())
            if( targetText=="上一页"){
                current=current-1;
            }else if( targetText=="下一页"){
                current=current+1;
            }
            if(document.domain=="www.bilibili.com"){
                setTimeout(function(){
                    setuname(current,avnumber,dataid)
                },500)
            }
        })
    })
}


function init(){
    /*配置面板开始*/
    $('head').append('<style type="text/css">.verticalAlign{ vertical-align:middle; display:inline-block; height:100%; margin-left:-1px;}.xcConfirm .xc_layer{position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #666665; opacity: 0.5; z-index: 2147000000;}.xcConfirm .popBox{position: fixed; left: 50%; top: 50%; background-color: #ffffff; z-index: 2147000001; width: 570px; height: 300px; margin-left: -285px; margin-top: -150px; border-radius: 5px; font-weight: bold; color: #535e66;}.xcConfirm .popBox .ttBox{height: 30px; line-height: 30px; padding: 14px 30px; border-bottom: solid 1px #eef0f1;}.xcConfirm .popBox .ttBox .tt{font-size: 18px; display: block; float: left; height: 30px; position: relative;}.xcConfirm .popBox .ttBox .clsBtn{display: block; cursor: pointer; width: 12px; height: 12px; position: absolute; top: 22px; right: 30px; }.xcConfirm .popBox .txtBox{margin: 20px 20px; height: 120px; overflow: hidden;}.xcConfirm .popBox .txtBox .bigIcon{float: left; margin-right: 20px; width: 48px; height: 48px; background-image: url(../img/icons.png); background-repeat: no-repeat; background-position: 48px 0;}.xcConfirm .popBox .xcConfirm .popBox .txtBox p input{width: 364px; height: 30px; border: solid 1px #eef0f1; font-size: 18px; margin-top: 6px;}.xcConfirm .popBox .btnArea{border-top: solid 1px #eef0f1;}.xcConfirm .popBox .btnGroup{float: right;}.xcConfirm .popBox .btnGroup .sgBtn{margin-top: 14px; margin-right: 10px;}.xcConfirm .popBox .sgBtn{display: block; cursor: pointer; float: left; width: 95px; height: 35px; line-height: 35px; text-align: center; color: #FFFFFF; border-radius: 5px;}.xcConfirm .popBox .sgBtn.ok{background-color: #0095d9; color: #FFFFFF;}.xcConfirm .popBox .sgBtn.cancel{background-color: #546a79; color: #FFFFFF;}</style>')
    $('body').append('<div class="xcConfirm" id="pop" style="display: none;"><div class="xc_layer"></div><div class="popBox"><div class="ttBox"><a class="clsBtn" onclick=\'$("#pop").hide()\' >X</a><span class="tt"></span></div><div class="txtBox"></div><div class="btnArea"><div class="btnGroup"><a class="sgBtn ok">确定</a></div></div></div></div>')

    $(".txtBox").append('<div style="width: 50%;float:left;"><input type="checkbox" id="bilibiliBlacklist" checked="true" /><label for="bilibiliBlacklist">是否隐藏黑名单</label></div><div style="width: 50%; float: right;"><input type="checkbox" id="bilibiliExpandlist" checked="true" /><label for="bilibiliExpandlist">是否自动展开评论</label></div>')
    $(".btnGroup").click(function() {
        localStorage.setItem("bilibiliBlacklist", $("#bilibiliBlacklist").prop("checked"));
        localStorage.setItem("bilibiliExpandlist", $("#bilibiliExpandlist").prop("checked"));
        $('#pop').hide();
    })

    //快捷键ctr+F10
    document.onkeydown = function(e) {
        var keyCode = e.keyCode || e.which || e.charCode;
        var ctrlKey = e.ctrlKey || e.metaKey;
        if(ctrlKey && keyCode == 121) {
            $('#pop').show();
        }
    }
    /*配置面板结束*/

    /*加载localStorage,需要在生成配置面板之后*/
    loadStorage("bilibiliBlacklist")
    loadStorage("bilibiliExpandlist")

    //绑定事件,翻页的时候重新获取数据修改评论
    $("body").on("mouseup",".comment-header.clearfix.header-page.paging-box a",function(){
        pb();
    })
    /*查看对话*/
    $("body").append('<div class="xcConfirm"id="dialog" style="display:none ;"><div class="xc_layer"></div><div class="popBox"><div class="txtBox" id="dialogTxt"></div></div></div>')
    $(".xc_layer").on("click",function(){ $("#dialog").hide()})
    $("#dialog").on("click",function(e){
        e.stopPropagation();//阻止事件冒泡
    })
}
 /*翻页返回页头*/
function backtop(){
    if(document.domain=="t.bilibili.com" || document.domain=="space.bilibili.com" || document.domain=="www.bilibili.com"){
        var offTop=42;
        if(document.domain=="space.bilibili.com"){
            offTop=68;
        }else if(document.domain=="www.bilibili.com"){
            offTop=0;
        }
        $("body").on("mouseup",".con .paging-box a",function(obj){
            var dataid= $(obj.currentTarget).parents(".list-item.reply-wrap:first").attr("data-id")
            $(window).scrollTop($("[data-id='" + dataid + "']").offset().top-offTop)
        })
    }
    /*翻页返回页头end*/
}

//获取av号
function getAv(){
    let regex = new RegExp("(?<=av)\\d+");
    var av=document.location.pathname.match(regex);
    if(av!=null)
        avnumber=av[0];
}

/*加载配置*/
function loadconfig(){
    //隐藏黑名单
    if(localStorage.getItem("bilibiliBlacklist")=="true"){
        $(".user.blacklist-font-color").parent().parent().remove()
        /*代码参考:完全隐藏BiliBili黑名单用户评论 作者Starryccc */
    }
    //自动展开
    if(localStorage.getItem("bilibiliExpandlist")=="true"){
        $(".btn-more").click();
    }else{
        $(".btn-more").click(function(){
            var dataid=$(this).attr("data-pid");
            setTimeout(function(){
                pb()
            },500)
        });
    }
}

//排序
function sort(item,rs){
    var ids = new Array();
    $(item).find(".reply-item").each(function() {
        ids.push($(this).attr("data-id"))
    })
    rs.sort(function(a,b){  //自定义函数排序
        var a1= parseInt(a.ctime);
        var b1= parseInt(b.ctime);
        if(a1<b1){
            return -1;
        }else if(a1>b1){
            return 1;
        }
        return 0;
    });
    var reply_box=$(item).find(".reply-box")
    for(var a=0;a<rs.length;a++){
        $(item).find(".reply-item[data-id='"+rs[a].rpid+"']").appendTo($(reply_box))
    }
    $(item).find(".view-more").appendTo($(reply_box))
}

//查看对话
function setuname(pn,oid,root){
    var url="https://api.bilibili.com/x/v2/reply/reply?callback=?&jsonp=jsonp"+
        "&pn="+pn+
        "&type=1&oid="+oid+
        "&ps=10&root="+root+
        "&_="+new Date().getTime()
    $.getJSON(url,
              function(result)
              {
        var list_item= $(".list-item.reply-wrap[data-id="+result.data.root.rpid+"]")
        sort(list_item,result.data.replies)
        for (var item in result.data.replies) {

            var  reply_item=$(list_item).find('.reply-item[data-id=\''+result.data.replies[item].rpid+'\']')
            var ber=result.data.replies[item].content.members

            if(ber.length==1){  //回复别人的
                var text= $(reply_item).find('.text-con')
                if($(text).find("a").length==0){  //有回复别人的但是没有超链接
                    var message=  result.data.replies[item].content.message
                    message=message.replace(/回复 @.+:/,"")
                    $(text).html('回复 <a href="//space.bilibili.com/'+ber[0].mid+
                                 '" target="_blank" data-usercard-mid="'+
                                 ber[0].mid+'">@'+ ber[0].uname+' </a> :'+message);
                }
                var dialog = $('<span class="btn-hover dialog">查看对话</span>');
                (function (n) {
                    dialog.on("click", function() {
                        var durl = 'https://api.bilibili.com/x/v2/reply/dialog/cursor?dialog=' +
                            result.data.replies[n].dialog + '&oid=' +
                            result.data.root.oid + '&plat=2&root=' +
                            result.data.root.rpid + '&size=300&ts=' +
                            new Date().getTime() + '&type=1'

                        $.getJSON(durl,
                                  function(dresult) {
                            createDialog(dresult)
                        })
                    })
                })(item);
                $(reply_item).find(".reply.btn-hover").after(dialog)
            }
        }
    })
}

function createDialog(dresult){
    $("#dialogTxt").html("")
    $("#dialog").show();

    var content=''
    for(var i in dresult.data.replies){
        var data_id = dresult.data.replies[i].rpid
        var mid = dresult.data.replies[i].mid
        var uname=dresult.data.replies[i].member.uname
        var touxiang = dresult.data.replies[i].member.avatar
        var current_level = dresult.data.replies[i].member.level_info.current_level
        var sign = dresult.data.replies[i].member.sign
        var message = dresult.data.replies[i].content.message.replace(/回复 @(.+):/,"回复 <a>@$1</a> :")
        var ctime = GetDateT(new Date(dresult.data.replies[i].ctime * 1000))
        var like=dresult.data.replies[i].like==0?"":dresult.data.replies[i].like
        content+=`<div class="reply-item reply-wrap"data-id="${data_id}"data-index="0"><a href="//space.bilibili.com/${mid}"data-usercard-mid="${mid}"target="_blank"class="reply-face"style="top: 0px;"><img src="${touxiang}@52w_52h.webp"alt=""></a><div class="reply-con"><div class="user"><a href="//space.bilibili.com/${mid}"target="_blank"data-usercard-mid="${mid}"class="name ">${uname}</a><a href="//www.bilibili.com/blackboard/help.html#%E4%BC%9A%E5%91%98%E7%AD%89%E7%BA%A7%E7%9B%B8%E5%85%B3"target="_blank"><i class="level l${current_level}"></i></a><span class="text-con">${message}</span></div></div><div class="info"><span class="time">${ctime}</span><span class="like "><i></i><span>${like}</span></span><span class="reply btn-hover">回复</span><div class="operation btn-hover btn-hide-re"><div class="spot"></div><div class="opera-list"style="display: none;"><ul><li class="blacklist">加入黑名单</li><li class="report">举报</li></ul></div></div></div></div>`
    }
    var head = `<div id=""class="popBox" style="height: 380px;overflow-x: hidden;overflow-y: scroll;padding-right: 20px;"><div id="comment"class="comment-m report-wrap-module report-scroll-module"><div class="common"><div class="comment"style="position: relative;"><div class="bb-comment "><div class="comment-list " style="padding-top:0px;"><div class="list-item reply-wrap "data-id=""data-index="0"><div class="con " style="margin-left: 15px;"><div class="reply-box" style="height:350px;">`
    var end = `</div><div class="paging-box"></div></div></div></div></div><div class="emoji-box"style="display: none;"><div class="emoji-title"><span>小黄脸</span></div><div class="emoji-wrap"><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[微笑]"data-pid="1"data-id="555"><img src="//i0.hdslb.com/bfs/archive/bf3ea8541e1bd469255a907f7b60015ad9abf1ce.png@56w_56h.webp"title="[微笑]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[嫌弃]"data-pid="1"data-id="556"><img src="//i0.hdslb.com/bfs/archive/de4c0783aaa60ec03de0a2b90858927bfad7154b.png@56w_56h.webp"title="[嫌弃]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[喜欢]"data-pid="1"data-id="557"><img src="//i0.hdslb.com/bfs/archive/8a10a4d73a89f665feff3d46ca56e83dc68f9eb8.png@56w_56h.webp"title="[喜欢]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[呆]"data-pid="1"data-id="558"><img src="//i0.hdslb.com/bfs/archive/33ad6000d9f9f168a0976bc60937786f239e5d8c.png@56w_56h.webp"title="[呆]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[大哭]"data-pid="1"data-id="559"><img src="//i0.hdslb.com/bfs/archive/2caafee2e5db4db72104650d87810cc2c123fc86.png@56w_56h.webp"title="[大哭]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[害羞]"data-pid="1"data-id="560"><img src="//i0.hdslb.com/bfs/archive/9d2ec4e1fbd6cb1b4d12d2bbbdd124ccb83ddfda.png@56w_56h.webp"title="[害羞]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[无语]"data-pid="1"data-id="561"><img src="//i0.hdslb.com/bfs/archive/44667b7d9349957e903b1b62cb91fb9b13720f04.png@56w_56h.webp"title="[无语]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[委屈]"data-pid="1"data-id="562"><img src="//i0.hdslb.com/bfs/archive/d2f26cbdd6c96960320af03f5514c5b524990840.png@56w_56h.webp"title="[委屈]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[尴尬]"data-pid="1"data-id="563"><img src="//i0.hdslb.com/bfs/archive/cb321684ed5ce6eacdc2699092ab8fe7679e4fda.png@56w_56h.webp"title="[尴尬]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[生气]"data-pid="1"data-id="564"><img src="//i0.hdslb.com/bfs/archive/3195714219c4b582a4fb02033dd1519913d0246d.png@56w_56h.webp"title="[生气]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[奸笑]"data-pid="1"data-id="565"><img src="//i0.hdslb.com/bfs/archive/bb84906573472f0a84cebad1e9000eb6164a6f5a.png@56w_56h.webp"title="[奸笑]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[大笑]"data-pid="1"data-id="566"><img src="//i0.hdslb.com/bfs/archive/ca94ad1c7e6dac895eb5b33b7836b634c614d1c0.png@56w_56h.webp"title="[大笑]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[惊讶]"data-pid="1"data-id="567"><img src="//i0.hdslb.com/bfs/archive/f8e9a59cad52ae1a19622805696a35f0a0d853f3.png@56w_56h.webp"title="[惊讶]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[囧]"data-pid="1"data-id="568"><img src="//i0.hdslb.com/bfs/archive/12e41d357a9807cc80ef1e1ed258127fcc791424.png@56w_56h.webp"title="[囧]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[捂脸]"data-pid="1"data-id="569"><img src="//i0.hdslb.com/bfs/archive/6921bb43f0c634870b92f4a8ad41dada94a5296d.png@56w_56h.webp"title="[捂脸]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[灵魂出窍]"data-pid="1"data-id="570"><img src="//i0.hdslb.com/bfs/archive/43d3db7d97343c01b47e22cfabeca84b4251f35a.png@56w_56h.webp"title="[灵魂出窍]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[吐]"data-pid="1"data-id="571"><img src="//i0.hdslb.com/bfs/archive/06946bfe71ac48a6078a0b662181bb5cad09decc.png@56w_56h.webp"title="[吐]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[抠鼻]"data-pid="1"data-id="572"><img src="//i0.hdslb.com/bfs/archive/cb89184c97e3f6d50acfd7961c313ce50360d70f.png@56w_56h.webp"title="[抠鼻]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[惊喜]"data-pid="1"data-id="573"><img src="//i0.hdslb.com/bfs/archive/0afecaf3a3499479af946f29749e1a6c285b6f65.png@56w_56h.webp"title="[惊喜]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[傲娇]"data-pid="1"data-id="574"><img src="//i0.hdslb.com/bfs/archive/010540d0f61220a0db4922e4a679a1d8eca94f4e.png@56w_56h.webp"title="[傲娇]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[疼]"data-pid="1"data-id="575"><img src="//i0.hdslb.com/bfs/archive/905fd9a99ec316e353b9bd4ecd49a5f0a301eabf.png@56w_56h.webp"title="[疼]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[吓]"data-pid="1"data-id="576"><img src="//i0.hdslb.com/bfs/archive/9c10c5ebc7bef27ec641b8a1877674e0c65fea5d.png@56w_56h.webp"title="[吓]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[阴险]"data-pid="1"data-id="577"><img src="//i0.hdslb.com/bfs/archive/ba8d5f8e7d136d59aab52c40fd3b8a43419eb03c.png@56w_56h.webp"title="[阴险]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[画风突变]"data-pid="1"data-id="578"><img src="//i0.hdslb.com/bfs/archive/ba4de7a3f97644038b15195bdc9f82a8fd118e77.png@56w_56h.webp"title="[画风突变]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[点赞]"data-pid="1"data-id="579"><img src="//i0.hdslb.com/bfs/archive/1a67265993913f4c35d15a6028a30724e83e7d35.png@56w_56h.webp"title="[点赞]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[doge]"data-pid="1"data-id="587"><img src="//i0.hdslb.com/bfs/archive/bba7c12aa51fed0199c241465560dfc2714c593e.png@56w_56h.webp"title="[doge]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[滑稽]"data-pid="1"data-id="581"><img src="//i0.hdslb.com/bfs/archive/d15121545a99ac46774f1f4465b895fe2d1411c3.png@56w_56h.webp"title="[滑稽]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[吃瓜]"data-pid="1"data-id="590"><img src="//i0.hdslb.com/bfs/archive/4191ce3c44c2b3df8fd97c33f85d3ab15f4f3c84.png@56w_56h.webp"title="[吃瓜]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[十周年]"data-pid="1"data-id="589"><img src="//i0.hdslb.com/bfs/archive/1eacd3f7816e70aff9c1b1a2e9605240466f599b.png@56w_56h.webp"title="[十周年]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[嘘声]"data-pid="1"data-id="584"><img src="//i0.hdslb.com/bfs/archive/e64af664d20716e090f10411496998095f62f844.png@56w_56h.webp"title="[嘘声]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[生病]"data-pid="1"data-id="580"><img src="//i0.hdslb.com/bfs/archive/0f25ce04ae1d7baf98650986454c634f6612cb76.png@56w_56h.webp"title="[生病]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[响指]"data-pid="1"data-id="585"><img src="//i0.hdslb.com/bfs/archive/1b5c53cf14336903e1d2ae3527ca380a1256a077.png@56w_56h.webp"title="[响指]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[黑洞]"data-pid="1"data-id="582"><img src="//i0.hdslb.com/bfs/archive/e90ec4c799010f25391179118ccd9f66b3b279ba.png@56w_56h.webp"title="[黑洞]"></a><a class="emoji-list emoji-text emoji-pic emoji-small"data-emoji-text="[粽子]"data-pid="1"data-id="588"><img src="//i0.hdslb.com/bfs/archive/177999fb7d70d891fbf63b161f26b272e08dc1de.png@56w_56h.webp"title="[粽子]"></a></div><div class="emoji-tabs"><div class="emoji-container"><div class="emoji-tab-wrap clearfix"style="width: 116px; left: 0px;"><a class="tab-link on"data-index="0"data-pid="1"><img src="//i0.hdslb.com/bfs/archive/3efd7739931a4e2ffe908b9bbbee8fe41a65d4a4.png@44w_44h.webp"></a><a class="tab-link "data-index="1"data-pid="-1"><img src="//static.hdslb.com/images/base/emoji-tab-default.png"></a></div></div></div></div></div></div></div></div>`
    $("#dialogTxt").append(head+content+end);
}

/*加载localStorage*/
function loadStorage(lsName) {
    var ls = localStorage.getItem(lsName)
    if(ls != null) {
        $("#"+lsName).prop("checked", localStorage.getItem(lsName)=='true')
    } else {
        localStorage.setItem(lsName, true)
    }
}


function GetDateT(data){
    var d,s;
    d = data;
    s = d.getFullYear() + "-";             //取年份
    s = s + (d.getMonth() + 1) + "-";//取月份
    s += d.getDate() + " ";         //取日期
    s += d.getHours() + ":";       //取小时
    s += d.getMinutes();    //取分

    return(s);
}