1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | // ==UserScript== // @name pixiv 用戶隱藏 // @namespace https://www.plurk.com/SpyMomiji // @version 2025-11-29 // @description try to take over the world! // @author SpyMomiji // @match https://www.pixiv.net/* // @icon https://www.google.com/s2/favicons?sz=64&domain=pixiv.net // @grant none // ==/UserScript== (function() { 'use strict'; let uidSet = new Set; let menuBodyName = ".__top_side_menu_body"; //隱藏名單: ` https://www.pixiv.net/users/20483857 `.split("\n").forEach(x=>{ let r = x.match(/^\s*https:\/\/www\.pixiv\.net\/users\/(\d+)/); if(r) uidSet.add(parseInt(r[1])); }); function asyncGet(root, selector){ return new Promise(function(a){ if(root===undefined) return a(); if(!root) root = document.body let c, b = function(){ let f = root.querySelector(selector); if( !root.parentNode ) a(); else if( f ) a(f); else window.requestAnimationFrame(b); } window.requestAnimationFrame(b); }); } function asyncGetAll(root, selector){ return new Promise(function(a){ if(root===undefined) return a(); if(!root) root = document.body let b = function(){ let f = root.querySelectorAll(selector); if( !root.parentNode ) a(); else if( f.length ) a(Array.from(f)); else window.requestAnimationFrame(b); } window.requestAnimationFrame(b); }); } let styleApply = function(card){ card.style.opacity = "0.1"; // card.querySelector(".hCQfBp").style.color = "#b15300"; // card.querySelector(".OvXma").style.color = "#b15300"; }; (async function(){ await new Promise((a)=>{ if(document.readyState == 'complete') return a(); let b = function(){ if(document.readyState == 'complete'){ document.removeEventListener("readystatechange", b); return a(); } } document.addEventListener("readystatechange", b); }); let pageChangeNotify; let observerCallback = function () { if(pageChangeNotify){ pageChangeNotify(); pageChangeNotify = null; } }; let menuBodyObserver = new MutationObserver(observerCallback); let navObserver = new MutationObserver(observerCallback); // let cardApply = async function(card){ // if(!card||card.tagName!="LI") return; // let href = (await asyncGet(card, "a[href^=\\/users\\/]"))?.href; // if(!href) return; // let uid = href.match(/^https:\/\/www\.pixiv\.net\/users\/(\d+)/)?.[1]; // if( uidSet.has(parseInt(uid)) ){ // styleApply(card); // } // } let cardObserver = new MutationObserver(async function(ms){ for(let m of ms){ for(let card of Array.from(m.addedNodes)){ // await cardApply(card); if(!card||card.tagName!="LI") return; let href = (await asyncGet(card, "a[href^=\\/users\\/]"))?.href; if(!href) return; let uid = href.match(/^https:\/\/www\.pixiv\.net\/users\/(\d+)/)?.[1]; if( uidSet.has(parseInt(uid)) ){ styleApply(card); } } } }); let navObserverSetted = false; let currentUrl; let menuBody = await asyncGet(null, menuBodyName); menuBodyObserver.observe( menuBody, {attributes: false, childList: true, characterData: false, subtree: false} ); let pageChanged = function(){ return new Promise(function(a){ pageChangeNotify = function(){a(true);}; }) }; do{ if( location.href == currentUrl ) continue; currentUrl = location.href; if( location.href.startsWith("https://www.pixiv.net/tags/") ){ if(!navObserverSetted){ let listUl; let listNav; await asyncGet(menuBody, 'section > div > div > div > nav'); //等候導行列出現 for(let sectionCheck of await asyncGetAll(null, 'section')){ //抓取並定位 section listNav = sectionCheck.querySelector('div > div > div > nav'); listUl = sectionCheck.querySelector('div > div > ul'); if( listNav ) break; } // for(let card of Array.from(listUl.children).filter(x=>x.tagName=="LI")){ // await cardApply(card); // } navObserver.observe( listNav, {attributes: false, childList: true, characterData: false, subtree: false} ); cardObserver.observe( listUl, {attributes: false, childList: true, characterData: false, subtree: false} ) navObserverSetted = true; //console.log("A"); } //console.log("B"); } else { navObserver.disconnect(); cardObserver.disconnect(); navObserverSetted = false; //console.log("C"); } } while(await pageChanged()); })(); })(); |
Direct link: https://paste.plurk.com/show/5XHEzDfllcRe5OeSrefG