Greasy Fork

Greasy Fork is available in English.

Pixiv 小说屏蔽

按照pixiv小说的文章简介,系列标题,文章标题,作者,tag来屏蔽小说的一个脚本

当前为 2024-06-15 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Pixiv 小说屏蔽
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  按照pixiv小说的文章简介,系列标题,文章标题,作者,tag来屏蔽小说的一个脚本
// @author       DeanShaw
// @match        https://www.pixiv.net/tags/*/novels?*s_mode=s_tag*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=chrxw.com
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const ContentStorageKey = 'blockedContentList';
    const authorStorageKey = 'blockedAuthorsList';
    const titleStorageKey = 'blockedTitlesList';
    const seriesStorageKey = 'blockedSeriesList';
    const TagsStorageKey = 'blockedTagsList';
    let buttonsGenerated = 0;
    let currentPageUrl = window.location.href;

     // Function to get the blocked Tag list from storage
     function getBlockedTags() {
        return GM_getValue(TagsStorageKey, "").split(/[,,]/).filter(tag => tag.trim() !== "");
    }

    // Function to set the blocked Tag list in storage
    function setBlockedTags(list) {
        GM_setValue(TagsStorageKey, list.join(','));
    }

     // Function to get the blocked Content list from storage
    function getBlockedContents() {
        return GM_getValue(ContentStorageKey, "").split(/[,,]/).filter(content => content.trim() !== "");
    }

    // Function to set the blocked Content list in storage
    function setBlockedContents(list) {
        GM_setValue(ContentStorageKey, list.join(','));
    }

    // Function to get the blocked authors list from storage
    function getBlockedAuthors() {
        return GM_getValue(authorStorageKey, "").split(/[,,]/).filter(author => author.trim() !== "");
    }

    // Function to set the blocked authors list in storage
    function setBlockedAuthors(list) {
        GM_setValue(authorStorageKey, list.join(','));
    }

    // Function to get the blocked titles list from storage
    function getBlockedTitles() {
        return GM_getValue(titleStorageKey, "").split(/[,,]/).filter(title => title.trim() !== "");
    }

    // Function to set the blocked titles list in storage
    function setBlockedTitles(list) {
        GM_setValue(titleStorageKey, list.join(','));
    }

    // Function to get the blocked series list from storage
    function getBlockedSeries() {
        return GM_getValue(seriesStorageKey, "").split(/[,,]/).filter(series => series.trim() !== "");
    }

    // Function to set the blocked series list in storage
    function setBlockedSeries(list) {
        GM_setValue(seriesStorageKey, list.join(','));
    }

    // Function to create the "Edit List" button
    function createEditButton(text, storageKey, buttonText, position) {
        const button = document.createElement('button');
        button.innerText = text;
        button.style.position = 'fixed';
        button.style.bottom = '20px';
        button.style.left = position;
        button.style.transform = 'translateX(-50%)';
        button.style.zIndex = 1000;
        button.style.fontFamily = '微软雅黑'; // 设置字体为微软雅黑
        button.onclick = () => editList(storageKey, buttonText);
        document.body.appendChild(button);
        return button;
    }

    // Function to edit the blocked authors, titles, or series list
    function editList(storageKey, buttonText) {
        const currentList = storageKey === authorStorageKey ? getBlockedAuthors().join(',') :
                            storageKey === titleStorageKey ? getBlockedTitles().join(',') :
                            storageKey === ContentStorageKey ? getBlockedContents().join(',') :
                            storageKey === TagsStorageKey ? getBlockedTags().join(',') :
                            getBlockedSeries().join(',');
        const newList = prompt(`编辑${buttonText}(用逗号分隔):`, currentList);
        if (newList !== null) {
            storageKey === authorStorageKey ? setBlockedAuthors(newList.split(/[,,]/)) :
            storageKey === titleStorageKey ? setBlockedTitles(newList.split(/[,,]/)) :
            storageKey === ContentStorageKey ? setBlockedContents(newList.split(/[,,]/)) :
            storageKey === TagsStorageKey ? setBlockedTags(newList.split(/[,,]/)) :
            setBlockedSeries(newList.split(/[,,]/));
            location.reload();
        }
    }


    // Function to hide blocked authors' content
    function hideBlockedAuthorsContent() {
        const blockedAuthors = getBlockedAuthors();
        const authorElements = document.querySelectorAll('a.sc-d98f2c-0.gtm-novel-searchpage-result-user.sc-1rx6dmq-2.sc-1c4k3wn-15.kghgsn.kkSLPs');
        authorElements.forEach(el => {
            const authorName = el.innerText;
            if (blockedAuthors.includes(authorName)) {
                el.closest('li').style.display = 'none';
            }
        });
    }

    // Function to hide blocked titles
    function hideBlockedTitles() {
        const blockedTitles = getBlockedTitles();
        const titleElements = document.querySelectorAll('a.sc-d98f2c-0.sc-iasfms-7.sc-1c4k3wn-14.jMTyeP.ZgTBh.gtm-novel-searchpage-result-title');
        titleElements.forEach(el => {
            const title = el.innerText;
            if (blockedTitles.some(keyword => title.includes(keyword))) {
                el.closest('li').style.display = 'none';
            }
        });
    }

    // Function to hide blocked series
    function hideBlockedSeries() {
        const blockedSeries = getBlockedSeries();
        const seriesElements = document.querySelectorAll('a.sc-d98f2c-0.sc-1c4k3wn-16.hFkYWC.gtm-novel-searchpage-result-series-title');
        seriesElements.forEach(el => {
            const series = el.innerText;
            if (blockedSeries.some(keyword => series.includes(keyword))) {
                el.closest('li').style.display = 'none';
            }
        });
    }

    function hideBlockedContent() {
        const blockedContents = getBlockedContents();
        const contentElements = document.querySelectorAll('div.sc-1utla24-0.kJgShy');

        contentElements.forEach(el => {
            const content = el.innerText;
            if (blockedContents.some(keyword => content.includes(keyword))) {
                const articleElement = el.closest('li'); // 获取包含该正文的最接近的 <li> 元素
                if (articleElement) {
                    articleElement.style.display = 'none';
                }
            }
        });
    }

    function hideBlockedTags() {
        const blockedTags = getBlockedTags(); // 获取屏蔽标签列表
        const articleElements = document.querySelectorAll('ul.sc-1c4k3wn-18.kbpYuc'); // 选择每篇文章的标签元素

        articleElements.forEach(article => {
            let tags = [];
            article.querySelectorAll('a.sc-d98f2c-0.sc-1c4k3wn-19.mmZcW.gtm-novel-searchpage-result-tag span').forEach(tagElement => {
                tags.push(tagElement.innerText);
            });

            // Check if any of the tags contain any of the blocked keywords
            if (tags.some(tag => blockedTags.some(blockedTag => tag.includes(blockedTag)))) {
                article.closest('li').style.display = 'none'; // Hide the whole article
            }
        });
    }



    // Function to add a "Block" button next to each author name
    function addBlockButtons() {
        const authorElements = document.querySelectorAll('a.sc-d98f2c-0.gtm-novel-searchpage-result-user.sc-1rx6dmq-2.sc-1c4k3wn-15.kghgsn.kkSLPs');
        authorElements.forEach(el => {
            const authorName = el.innerText;
            if (!el.nextSibling || el.nextSibling.innerText !== '屏蔽该作者') {
                const blockButton = document.createElement('button');
                blockButton.innerText = '屏蔽该作者';
                blockButton.style.marginLeft = '0.5px'; // 缩小左边距
                blockButton.style.marginRight = '0.5px'; // 缩小右边距
                blockButton.style.padding = '0.1px'; // 缩小按钮大小
                blockButton.style.fontSize = '0.5px'; // 缩小字体大小
                blockButton.style.fontFamily = '微软雅黑'; // 设置字体为微软雅黑
                blockButton.onclick = () => {
                    const blockedAuthors = getBlockedAuthors();
                    if (!blockedAuthors.includes(authorName)) {
                        blockedAuthors.push(authorName);
                        setBlockedAuthors(blockedAuthors);
                        alert(`${authorName} 已加入屏蔽列表`);
                        location.reload();
                    } else {
                        alert(`${authorName} 已在屏蔽列表中`);
                    }
                };
                el.parentNode.insertBefore(blockButton, el.nextSibling); // 插入到作者名后面
            }
        });
    }

    // Function to add a "Block" button next to each series name
    function addBlockSeriesButtons() {
        const seriesElements = document.querySelectorAll('a.sc-d98f2c-0.sc-1c4k3wn-16.hFkYWC.gtm-novel-searchpage-result-series-title');
        seriesElements.forEach(el => {
            const seriesName = el.innerText;
            if (!el.nextSibling || el.nextSibling.innerText !== '屏蔽该系列') {
                const blockButton = document.createElement('button');
                blockButton.innerText = '屏蔽该系列';
                blockButton.style.marginLeft = '0.5px'; // 缩小左边距
                blockButton.style.marginRight = '0.5px'; // 缩小右边距
                blockButton.style.padding = '0.1px'; // 缩小按钮大小
                blockButton.style.fontSize = '0.5px'; // 缩小字体大小
                blockButton.style.fontFamily = '微软雅黑'; // 设置字体为微软雅黑
                blockButton.onclick = () => {
                    const blockedSeries = getBlockedSeries();
                    if (!blockedSeries.includes(seriesName)) {
                        blockedSeries.push(seriesName);
                        setBlockedSeries(blockedSeries);
                        alert(`${seriesName} 已加入屏蔽列表`);
                        location.reload();
                    } else {
                        alert(`${seriesName} 已在屏蔽列表中`);
                    }
                };
                el.parentNode.insertBefore(blockButton, el.nextSibling); // 插入到系列名后面
            }
        });
    }

    // Function to create and add the "Edit Title List" button next to each title
    function addEditTitleListButtons() {
        const titleElements = document.querySelectorAll('a.sc-d98f2c-0.sc-iasfms-7.sc-1c4k3wn-14.jMTyeP.ZgTBh.gtm-novel-searchpage-result-title');
        titleElements.forEach(el => {
            if (!el.nextSibling || el.nextSibling.innerText !== '编辑标题屏蔽关键词列表') {
                const editButton = document.createElement('button');
                editButton.innerText = '编辑标题屏蔽关键词列表';
                editButton.style.padding = '0.1px'; // 缩小按钮大小
                editButton.style.fontSize = '0.5px'; // 缩小字体大小
                editButton.style.fontFamily = '微软雅黑'; // 设置字体为微软雅黑
                editButton.onclick = () => editList(titleStorageKey, '标题屏蔽关键词');
                el.parentNode.insertBefore(editButton, el.nextSibling); // Insert the button next to the title element
            }
        });
    }

    // Function to add a "Block" button next to each content element
    function addBlockContentButtons() {
        const contentElements = document.querySelectorAll('div.sc-1utla24-0.kJgShy');
        contentElements.forEach(el => {
            // Check if the parent element has the correct class name to avoid adding button next to title elements
            const parentElement = el.closest('li');
            if (parentElement && parentElement.querySelector('div.sc-1utla24-0.kJgShy')) {
                // Check if the button already exists to avoid duplication
                if (!el.nextSibling || el.nextSibling.innerText !== '编辑正文描述屏蔽关键词列表') {
                    const blockButton = document.createElement('button');
                    blockButton.innerText = '编辑正文描述屏蔽关键词列表';
                    blockButton.style.marginTop = '5px';
                    blockButton.style.padding = '2px';
                    blockButton.style.fontSize = '12px';
                    blockButton.style.fontFamily = '微软雅黑'; // 设置字体为微软雅黑
                    blockButton.onclick = () => editList(ContentStorageKey, '屏蔽正文');
                    el.parentNode.insertBefore(blockButton, el.nextSibling); // Insert the button after the content element
                }
            }
        });
    }

    // Function to add a "Block Tag" button next to each author name
    function addBlockTagButton() {
        const blockButtons = document.querySelectorAll('button');
        blockButtons.forEach(button => {
            if (button.innerText === '屏蔽该作者') {
                const blockTagButton = document.createElement('button');
                blockTagButton.innerText = '编辑Tag屏蔽列表';
                blockTagButton.style.padding = '0.1px'; // 缩小按钮大小
                blockTagButton.style.fontSize = '0.5px'; // 缩小字体大小
                blockTagButton.style.marginLeft = '10px'; // Add margin to separate from the "Block" button
                blockTagButton.onclick = () => editList(TagsStorageKey, '屏蔽Tag');
                button.parentNode.insertBefore(blockTagButton, button.nextSibling); // Insert after the "Block" button
            }
        });
    }


    // Function to repeatedly execute the script to ensure it remains active
    function repeatExecution() {
        setInterval(() => {
            if (currentPageUrl !== window.location.href) {
                buttonsGenerated = 0; // Reset the flag when the URL changes
                currentPageUrl = window.location.href; // Update the current URL
            }
            if (buttonsGenerated === 0) {
                addBlockButtons();
                addEditTitleListButtons();
                addBlockSeriesButtons();
                addBlockContentButtons();
                removeIncorrectButtons();
                addBlockTagButton();
                buttonsGenerated = 1; // Set the flag to indicate buttons have been generated
            }
            hideBlockedAuthorsContent();
            hideBlockedTitles();
            hideBlockedSeries();
            hideBlockedContent();
            hideBlockedTags();
        }, 3000); // Repeat every 3 seconds
    }

    // Function to remove incorrect buttons and keep correct ones
    function removeIncorrectButtons() {
        const correctButtons = document.querySelectorAll('div.sc-1utla24-0.kJgShy + button');
        correctButtons.forEach(button => {
            // Check if the button's parent node matches the incorrect structure
            if (button.parentNode.classList.contains('sc-1c4k3wn-20')) {
                button.remove(); // Remove the button if it's in the incorrect structure
            }
        });
    }



    // Initialize the script
    function init() {
        createEditButton('编辑正文描述屏蔽列表', ContentStorageKey, '屏蔽正文描述', '30%');
        createEditButton('编辑作者屏蔽列表', authorStorageKey, '屏蔽作者', '45%');
        createEditButton('编辑标题屏蔽关键词列表', titleStorageKey, '屏蔽标题', '60%');
        createEditButton('编辑系列屏蔽关键词列表', seriesStorageKey, '屏蔽系列', '75%');
        createEditButton('编辑Tag屏蔽关键词列表', TagsStorageKey, '屏蔽Tag', '15%');

        addBlockButtons();
        addEditTitleListButtons();
        addBlockSeriesButtons();
        addBlockContentButtons();
        removeIncorrectButtons();
        addBlockTagButton();

        hideBlockedAuthorsContent();
        hideBlockedTitles();
        hideBlockedSeries();
        hideBlockedContent();
        hideBlockedTags();

        repeatExecution(); // Start the repeating execution
    }

    // Run the script on page load
    window.addEventListener('load', init);

})();