// ==UserScript== // @name 贴吧楼主层主标识 // @namespace http://tampermonkey.net/ // @version 1.0 // @description 显示楼中楼的楼主和层主标识 // @icon https://gsp0.baidu.com/5aAHeD3nKhI2p27j8IqW0jdnxx1xbK/tb/editor/images/client/image_emoticon1.png // @author necrodancer // @match https://tieba.baidu.com/p/* // @grant none // ==/UserScript== (function() { 'use strict'; // 等待页面加载完成 function waitForPageLoad() { return new Promise(resolve => { if (document.readyState === 'complete') { resolve(); } else { window.addEventListener('load', resolve); } }); } // 获取楼主用户名 function getLouzhuUsername() { const louzhuElement = document.querySelector('.louzhubiaoshi.j_louzhubiaoshi'); if (louzhuElement) { return louzhuElement.getAttribute('author'); } return null; } // 获取所有楼层的层主信息(楼层ID -> 层主用户名) function getCengzhuMap() { const cengzhuMap = new Map(); // 所有楼层容器 const postElements = document.querySelectorAll('div.l_post.j_l_post'); postElements.forEach(post => { try { // 从楼层数据中解析层主信息 const dataField = post.getAttribute('data-field'); if (!dataField) return; const postData = JSON.parse(dataField); // 楼层ID(用于关联楼中楼回复) const postId = postData.content.post_id; // 层主用户名 const cengzhuUsername = postData.author.user_name; if (postId && cengzhuUsername) { cengzhuMap.set(postId, cengzhuUsername); } } catch (e) { console.error('解析楼层信息失败:', e); } }); return cengzhuMap; } // 创建标识元素 function createMarkElement(text, className) { const mark = document.createElement('span'); mark.className = `identity-mark ${className}`; mark.style.cssText = ` display: inline-block; margin-left: 3px; margin-right: 3px; padding: 0px 3px; font-size: 10px; border-radius: 5px; color: white; font-weight: 500; `; mark.textContent = text; return mark; } // 为楼中楼回复添加标识(楼主/层主) function addMarks(louzhuUsername, cengzhuMap) { if (!louzhuUsername || cengzhuMap.size === 0) return; // 所有楼中楼回复的用户链接 const replyLinks = document.querySelectorAll('a.at.j_user_card'); replyLinks.forEach(link => { // 检查是否已经添加过标识,避免重复添加 if (link.nextElementSibling && link.nextElementSibling.classList.contains('identity-mark')) { return; } // 获取当前回复者用户名 let username = link.getAttribute('username'); if (!username) { try { const dataField = link.getAttribute('data-field'); const cleanedData = dataField.replace(/'/g, '"'); const data = JSON.parse(cleanedData); username = data.un; } catch (e) { console.error('解析回复者信息失败:', e); return; } } // 获取当前回复所属的楼层ID let parentPost = link.closest('div.j_lzl_container'); if (!parentPost) return; const postDataField = parentPost.getAttribute('data-field'); if (!postDataField) return; let postId; try { const postData = JSON.parse(postDataField.replace(/'/g, '"')); postId = postData.pid; // 楼中楼所属的楼层ID } catch (e) { console.error('解析楼中楼关联信息失败:', e); return; } // 获取该楼层的层主用户名 const cengzhuUsername = cengzhuMap.get(postId); // 用于存储要添加的标识 const marks = []; // 层主标识(绿色背景) if (cengzhuUsername && username === cengzhuUsername) { const cengzhuMark = createMarkElement('层主', 'cengzhu-mark'); cengzhuMark.style.backgroundColor = '#32CD32'; // 绿色 // 当同时是楼主和层主时,减小两个标识之间的间距 if (username === louzhuUsername) { cengzhuMark.style.marginLeft = '2px'; // 与楼主标识的间距缩小 } marks.push(cengzhuMark); } // 楼主标识(蓝色背景) if (username === louzhuUsername) { const louzhuMark = createMarkElement('楼主', 'louzhu-mark'); louzhuMark.style.backgroundColor = '#1E90FF'; // 蓝色 marks.push(louzhuMark); } // 添加所有标识到用户名右侧 marks.forEach(mark => { link.parentNode.insertBefore(mark, link.nextSibling); }); }); } // 初始化函数 async function init() { await waitForPageLoad(); const louzhuUsername = getLouzhuUsername(); if (!louzhuUsername) { console.log('未找到楼主信息'); return; } // 初始加载层主信息并添加标识 let cengzhuMap = getCengzhuMap(); addMarks(louzhuUsername, cengzhuMap); // 监听页面变化(处理动态加载内容) const observer = new MutationObserver((mutations) => { mutations.forEach(mutation => { if (mutation.addedNodes.length > 0) { // 动态加载新内容后更新层主映射并重新检查标识 cengzhuMap = getCengzhuMap(); addMarks(louzhuUsername, cengzhuMap); } }); }); // 配置观察器监听整个文档的变化 observer.observe(document.body, { childList: true, subtree: true, attributes: false, characterData: false }); } // 启动脚本 init(); })();