// ==UserScript== // @name B站显示点赞率、投币率、收藏率 // @namespace http://tampermonkey.net/ // @version 1.0.1 // @description 显示b站 | bilibili | 哔哩哔哩 点赞率、投币率、收藏率 // @author 魂hp // @license MIT // @match *.bilibili.com/video/* // @icon https://www.google.com/s2/favicons?sz=64&domain=bilibili.com // @grant GM.addStyle // @grant unsafeWindow // @downloadURL none // ==/UserScript== (function () { "use strict"; if (!(unsafeWindow?.__INITIAL_STATE__?.videoData?.stat?.view)) { return; } // 修改样式 GM.addStyle(` .video-toolbar-left-item{ width:auto !important } .toolbar-left-item-wrap{ margin-rigth:auto !important; display:flex !important } `); class videoData { videoStat = { view: 0, like: 0, coin: 0, favorite: 0, }; constructor() { this.initVideoStat(); } initVideoStat() { for (let key in this.videoStat) { this.videoStat[key] = unsafeWindow.__INITIAL_STATE__.videoData.stat[key]; } } // 计算点赞率、投币率、收藏率,并获取对应的颜色 getRateAndColor(nameStr) { let res = { rate: 0, color: "#222" }; if (!(nameStr in this.videoStat)) { return res; } let num = this.videoStat.view / this.videoStat[nameStr]; if (num == Infinity) { return res; } if (num <= 10) { res.rate = num.toFixed(2); res.color = "DarkOrange"; } else if (num <= 25) { res.rate = num.toFixed(1); res.color = "#db03fc"; } else { res.rate = num.toFixed(0); } return res; } } const vData = new videoData(); //添加元素 const div = { like: {}, coin: {}, favorite: {} }; for (let e in div) { div[e] = document.createElement("div"); div[e].innerHTML = ` 1 `; } // 更新数据 function updateRate() { for (let e in div) { let mi = div[e].querySelector("mi"); let rateAndColor = vData.getRateAndColor(e); mi.style.color = rateAndColor.color; mi.textContent = rateAndColor.rate; } } updateRate(); new MutationObserver(function (mutationsList) { for (let mutation of mutationsList) { if (mutation.type === "attributes") { document .querySelector(".video-like") .parentNode.appendChild(div.like); document .querySelector(".video-coin") .parentNode.appendChild(div.coin); document .querySelector(".video-fav") .parentNode.appendChild(div.favorite); } } }).observe(document.querySelector(".toolbar-left-item-wrap"), { attributes: true, }); new MutationObserver(function (mutationsList) { for (let mutation of mutationsList) { if (mutation.type === "childList" && mutation.addedNodes.length > 0) { vData.initVideoStat(); updateRate(); } } }).observe(document.querySelector(".video-fav-info"), { childList: true, }); })();