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());

    })();

})();