// 暴力猴 https://greasyfork.org/zh-CN/scripts/521309
// ==UserScript==
// @name douyin_barrage
// @namespace https://github.com/netnr
// @icon https://zme.ink/favicon.svg
// @version 2024.12.21.1011
// @description 抖音直播漂屏弹幕显示用户名称
// @author netnr
// @license MIT
// @match *://live.douyin.com/1*
// @match *://live.douyin.com/2*
// @match *://live.douyin.com/3*
// @match *://live.douyin.com/4*
// @match *://live.douyin.com/5*
// @match *://live.douyin.com/6*
// @match *://live.douyin.com/7*
// @match *://live.douyin.com/8*
// @match *://live.douyin.com/9*
// ==/UserScript==
let nrBarrage = {
init: async () => {
// 等待就绪
for (let i = 0; i < 9; i++) {
nrBarrage.domSide = document.querySelector("div.webcast-chatroom___items>div");
if (document.querySelector("xg-danmu") && nrBarrage.domSide) {
break;
}
await nrBarrage.sleep();
}
if (nrBarrage.domSide && !nrBarrage.tsObServer) {
// 观察者实例、及处理方式
nrBarrage.tsObServer = new MutationObserver(function (mutationsList) {
for (const mutation of mutationsList) {
// 新增的节点(弹幕)
mutation.addedNodes.forEach(addedNode => {
let domBarrageNode = document.getElementById(addedNode.dataset.id);
// 漂屏弹幕
if (domBarrageNode) {
domBarrageNode.innerHTML = addedNode.innerHTML;
let height = window.getComputedStyle(domBarrageNode).height;
domBarrageNode.querySelectorAll("*").forEach(domToken => {
if (domToken.nodeName == "IMG") {
domToken.removeAttribute("width");
domToken.removeAttribute("height");
domToken.style.height = height;
} else {
Object.assign(domToken.style, {
fontSize: "inherit",
height: height,
})
}
});
}
});
}
});
// 开始观察右侧弹幕列表的变化
nrBarrage.tsObServer.observe(nrBarrage.domSide, nrBarrage.tsConfig);
console.debug("\n\n===== 已开启漂屏弹幕显示用户名称\n\n\n");
}
},
destroy: () => {
nrBarrage.tsObServer.disconnect();
console.debug("\n\n===== 已重置\n\n\n")
},
domSide: null,
tsObServer: null,
tsConfig: {
childList: true, // 增加或删除
attributes: false, // 属性
subtree: false, // 子节点
characterData: false // 内容
},
sleep: (time) => new Promise(resolve => setTimeout(() => resolve(), time || 1000))
};
nrBarrage.init(); // 初始化
// nrBarrage.destroy(); // 取消