// ==UserScript== // @name Bilibili Popups // @namespace sheep-realms // @version 1.3.4 // @description B站内链助手 // @author Sheep-realms // @match *://*.bilibili.com/* // @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js // @license CC BY-NC-SA 3.0 // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_deleteValue // @run-at document-body // @downloadURL none // ==/UserScript== function Popups() { this.id = "popups"; this.$sel = "#" + this.id; this.state = 0; this.timer = 0; this.disable = false; this.deactivate = false; this.posX = 0; this.posY = 0; this.load = function() { $("body").append('
'+message+'
'); } this.stop = function() { this.deactivate = true; this.hide(); clearTimeout(this.timer); } } let pop = new Popups(); function PopupsFactory() { this.id = "popups"; this.$sel = "#" + this.id; this.url = function(subdomain="www", path="") { return "https://"+subdomain+".bilibili.com/"+path; } this.link = function(url="", text="", strClass="") { return ''+text+''; } this.userinfo = function(uid="", username="") { return '作者:'+this.link(this.url("space", uid), username)+' ['+this.link(this.url("message", "#whisper/mid"+uid), "私信")+'] ('+this.link(this.url("space", uid+"/dynamic"), "动态")+' | '+this.link(this.url("space", uid+"/video"), "投稿")+' | '+this.link(this.url("space", uid+"/channel/series"), "列表")+')
'; } } let popf = new PopupsFactory(); let bangumiType = ["", "番剧", "电影", "纪录片", "国创", "电视剧", "", "综艺"]; $(document).mousemove(function(e){ pop.posX = e.pageX; pop.posY = e.pageY; }); $(document).keydown(function(e) { pop.disable = e.altKey; }) $(document).keyup(function(e) { pop.disable = e.altKey; }) $(document).ready(function() { var csslist = ""; csslist += "#popups {max-width: 320px; position: absolute; background-color: #FFF; border: #BBB 1px solid; box-shadow: rgb(50 50 50 / 35%) 0 3px 8px; z-index: 12000; padding: 10px; color: #222;}"; csslist += "#popups.hide {display: none;}"; csslist += "#popups .video-stat tr td:first-child {padding-right: 1.5em;}"; csslist += "#popups .video-stat tr td {line-height: 1.5em;}"; csslist += "#popups h4 {font-size: 14px; border-bottom: #BBB 1px solid; margin-bottom: 5px; font-weight: bold; padding-bottom: 3px;}"; csslist += "#popups p {color: #222; font-size: 12px; line-height: 1.5em;}"; csslist += "#popups a {color: #00a1d6;}"; csslist += "#popups hr {border: none; background-color: #BBB; height: 1px; margin: 3px 0;}"; csslist += "#popups .video-desc {max-width: 300px; max-height: 150px; padding: 5px; background-color: #F4F4F4; overflow: hidden;}"; GM_addStyle(csslist); pop.load(); $("#popups").mouseenter(function() { // console.log(">> mouseover #popups"); pop.state = 1; clearTimeout(pop.timer); }); $("#popups").mouseleave(function() { // console.log("<< mouseleave #popups"); pop.state = 0; clearTimeout(pop.timer); pop.timer = setTimeout(function() { pop.hide(); }, 500) }); }); $(document).on("mouseenter", "a:not(#popups a)", function() { // console.log(">> mouseover a"); if (pop.disable || pop.deactivate) return false; let a = $(this).offset(); let $that = $(this); pop.state = 1; clearTimeout(pop.timer); let mode = ""; let url = $(this).attr("href"); let path = getUrlPath($(this).attr("href")); let qid; if (path.search(/\/video\/av/) != -1) { mode = "av"; qid = path.slice(9).replace("/",""); } else if (path.search(/\/audio\/au/) != -1) { mode = "au"; qid = path.slice(9).replace("/",""); } else if (path.search(/\/video\/BV/) != -1) { mode = "bv"; qid = path.slice(7).replace("/",""); } else if (path.search(/\/read\/cv/) != -1) { mode = "cv"; qid = path.slice(8).replace("/",""); } else if (path.search(/\/bangumi\/play\/ss/) != -1) { mode = "ss"; qid = path.slice(16).replace("/",""); } else if (url.search(/space.bilibili.com/) != -1) { mode = "user"; if (path == "space.bilibili.com" || path == "/") return false; if (path.search(/\/[a-z]/) != -1) { qid = path.slice(1,path.search(/\/[a-z]/)); } else { if (path.slice(-1) == "/") { qid = path.slice(1, -1); } else { qid = path.slice(1); } } } else { return false; } pop.timer = setTimeout(function() { $(".popups-focus").removeClass("popups-focus"); $that.addClass("popups-focus"); $("#popups").html(''); $("#popups .title").text("加载中..."); if (mode == "av") { getVideoInfoAV(qid); } if (mode == "au") { getAudioInfo(qid); } if (mode == "bv") { getVideoInfoBV(qid); } if (mode == "cv") { getArticleInfo(qid); } if (mode == "ss") { getBangumiInfo(qid); } if (mode == "user") { getUserInfo(qid); } pop.move(); pop.show(); }, 500) }); $(document).on("mouseleave", "a:not(#popups a)", function() { // console.log("<< mouseleave a"); let $that = $(this); if ($that.hasClass("popups-focus")) { pop.state = 0; clearTimeout(pop.timer); pop.timer = setTimeout(function() { pop.hide(); $that.removeClass("popups-focus"); }, 500) } else { pop.state = 0; clearTimeout(pop.timer); } }); function getUrlPath(url){ var arrUrl = url.split("//"); var start = arrUrl[arrUrl.length - 1].indexOf("/"); var relUrl = arrUrl[arrUrl.length - 1].substring(start); if(relUrl.indexOf("?") != -1){ relUrl = relUrl.split("?")[0]; } return relUrl; } function getJSONInfo(url) { $.getJSON(url, function (ajson) { console.log(ajson); }); } function getVideoInfoAV(aid) { $.getJSON("https://api.bilibili.com/x/web-interface/view?aid=" + aid, function (ajson) { if (ajson.code == 0) { factoryVideoInfo(ajson.data); } else { pop.error("出错啦!", "未能获取视频信息,可能是网络问题,或是视频已被删除。'+popf.link(popf.url('www','video/av'+obj.aid), obj.aid)+' | '+popf.link(popf.url('www','video/'+obj.bvid), obj.bvid)+'
'); $("#popups").append(popf.userinfo(obj.owner.mid, obj.owner.name)); $("#popups").append('分区:'+obj.tname+'
'); $("#popups").append('发布时间:'+getDateTime(obj.pubdate)+'
'); $("#popups").append('播放:'+obj.stat.view+'
'); $("#popups").append('时长:'+obj.duration+'
'); $("#popups").append('简介:
'); $("#popups").append(''+obj.desc+'
'); } function getArticleInfo(cvid) { $.getJSON("https://api.bilibili.com/x/article/viewinfo?id="+cvid, function (ajson) { if (ajson.code == 0) { let obj = ajson.data; $("#popups .title").text(obj.title); $("#popups").append(''); $("#popups").append(popf.userinfo(obj.mid, obj.author_name)); $("#popups").append('阅读:'+obj.stats.view+'
'); $("#popups").append(''+popf.link(popf.url("www","audio/au"+auid), "au"+auid)+'
'); $("#popups").append(popf.userinfo(obj.uid, obj.uname)); $("#popups").append('发布时间:'+getDateTime(obj.passtime)+'
'); $("#popups").append('播放:'+obj.statistic.play+'
'); $("#popups").append('简介:
'); $("#popups").append(''+obj.intro+'
'); } else { pop.error("出错啦!", "未能获取音频信息,可能是网络问题,或是音频已被删除。'+popf.link(popf.url("www","bangumi/play/ss"+ssid), "ss"+ssid)+'
'); //$("#popups").append(popf.userinfo(obj.uid, obj.uname)); $("#popups").append(''+obj.new_ep.desc+'
'); $("#popups").append('类型:'+bangumiType[obj.type]+'
'); $("#popups").append('发布时间:'+obj.publish.pub_time+'
'); $("#popups").append('总集数:'+(obj.total != -1 ? obj.total : "未知")+'
'); $("#popups").append('播放:'+obj.stat.views+'
'); $("#popups").append('简介:
'); $("#popups").append(''+obj.evaluate+'
'); } else { pop.error("出错啦!", "未能获取音频信息,可能是网络问题,或是音频已被删除。UID:'+popf.link(popf.url("space", uid, "user-uid"), uid)+'
'); $("#popups").append('关注:'+popf.link(popf.url("space", uid+"/fans/follow"), "...", "user-friend")+' | 粉丝:'+popf.link(popf.url("space", uid+"/fans/fans"), "...", "user-fans")+'
'); $.getJSON("https://api.bilibili.com/x/space/acc/info?mid="+uid, function (ajson) { if (ajson.code == 0) { let obj = ajson.data; $("#popups .title").text(obj.name); $("#popups .user-uid").text(obj.mid); $("#popups").append('等级:Lv'+obj.level+'
'); $("#popups").append('