// ==UserScript== // @name 🤖 B站人机筛选 // @namespace https://ez118.github.io/ // @version 0.1 // @description 对于B站评论区内各用户的粉丝数、关注量、LV等数据进行综合考量,初次判断是否是人机、低质量账号(电脑网页上用鼠标点评论区用户名即可) // @author ZZY_WISU // @match https://www.bilibili.com/video/* // @match https://bilibili.com/video/* // @license MIT // @run-at document-end // @grant GM_xmlhttpRequest // @grant GM_addStyle // @require https://unpkg.com/zepto@1.2.0/dist/zepto.min.js // ==/UserScript== (function () { 'use strict'; var posList = []; // 记录坐标,防止重复 GM_addStyle(` :root{--text-color:#386a1f;--border-color:#285a0f;--active-bg-color:#d7e1cd;--close-btn-bg:#386a1f;--close-btn-text:#FFF;} @media (prefers-color-scheme:dark){:root{--text-color:#7edb7b;--border-color:#7edb7b;--active-bg-color:#7edb7b;--close-btn-text:#00390a;}} .userscript-botDetectTooltip{position:absolute;z-index:9999;user-select:none;background:var(--active-bg-color);color:var(--close-btn-text);padding:1px 8px;font-size:12px;font-weight:normal;height:fit-content;border-radius:16px;border:1px solid var(--border-color);} `); // 监听 bili-comments 元素的插入 const observer = new MutationObserver((mutationsList, observer) => { const biliComments = document.querySelector("bili-comments"); if (biliComments && biliComments.shadowRoot) { // 初始化对 shadowRoot 的观察 initShadowRootObserver(biliComments.shadowRoot); //observer.disconnect(); // 停止观察,避免重复 } }); // 观察 document.body 的子节点变化 observer.observe(document.body, { childList: true, subtree: true }); function initShadowRootObserver(shadowRoot) { // 监听 shadowRoot 的子节点变化 const rootObserver = new MutationObserver((mutationsList, observer) => { processElements(shadowRoot); }); rootObserver.observe(shadowRoot, { childList: true, subtree: true }); // 初始处理 processElements(shadowRoot); } function processElements(shadowRoot) { const threadRenderers = shadowRoot.querySelectorAll("bili-comment-thread-renderer"); const userInfoEles = []; threadRenderers.forEach(item => { const renderer = item.shadowRoot?.querySelector("bili-comment-renderer"); if (renderer && renderer.shadowRoot) { const userInfo = renderer.shadowRoot.querySelector("bili-comment-user-info"); if (userInfo && userInfo.shadowRoot) { userInfoEles.push(userInfo.shadowRoot); } } }); // 绑定事件,避免重复 userInfoEles.forEach(item => { if (!item.querySelector("#info").hasAttribute('data-bound')) { $(item).on('mouseenter', () => { const link = item.querySelector('a'); if (link) { const mid = link.href.split("/")[3]; const rect = getDocumentCoordinates(link.parentNode); doReview(mid, { x: rect.left, y: rect.top + 20 }); } }); item.querySelector("#info").setAttribute('data-bound', 'true'); } }); } function getDocumentCoordinates(element) { const rect = element.getBoundingClientRect(); return { top: rect.top + window.pageYOffset, left: rect.left + window.pageXOffset, right: rect.right + window.pageXOffset, bottom: rect.bottom + window.pageYOffset }; } function doReview(mid, pos) { if(posList.includes(pos.y)) { return; } GM_xmlhttpRequest({ method: "GET", url: `https://api.bilibili.com/x/web-interface/card?mid=${mid}`, onload: function (response) { try { const data = JSON.parse(response.responseText); if (data && data.data) { const judgeRes = isBot(data); const $div = $('