Greasy Fork

Greasy Fork is available in English.

爱上ASMR - Plus

删除黑名单用户的评论、收藏夹备注、显示评分投票、标题封面完全显示

当前为 2023-08-22 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         爱上ASMR - Plus
// @namespace    https://www.asasmr.top/
// @version      3.3
// @description  删除黑名单用户的评论、收藏夹备注、显示评分投票、标题封面完全显示
// @match        http*://*.asasmr3.com/*
// @match        http*://*.asasmr2.com/*
// @match        http*://*.asasmr1.com/*
// @match        http*://*.aisasmr.com/*
// @match        http*://*.aisasmr.net/*
// @license      MIT
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

(function() {
    'use strict';

    // 初始化黑名单列表
    let blacklist = GM_getValue('blacklist', []);
    let notes = GM_getValue('notes', {});

    if (window.location.href.match(/^https:\/\/.*\/author\//) && window.location.href.match(/\?tab=collect.*/)) {
        // 添加备注区域
        const archiveContainers = document.querySelectorAll('#author-page .archive');
        archiveContainers.forEach(container => {
            const articleLink = container.querySelector('article > a');
            const noteid = articleLink.href.match(/\/(video|sound)\/([\w-]+\.html)/)[0];// 提取ID
            const notesArea = document.createElement('textarea');
            notesArea.classList.add('hmd-notes-area');
            notesArea.placeholder = '添加备注';
            notesArea.value = getNotes(noteid) || '';

            notesArea.addEventListener('input', () => {
                setNotes(noteid, notesArea.value);
            });

            const saveNotesButton = document.createElement('button');
            saveNotesButton.textContent = '保存备注';
            saveNotesButton.classList.add('hmd-save-notes-button');
            saveNotesButton.addEventListener('click', () => {
                setNotes(noteid, notesArea.value);
                alert('备注已保存!');
            });

            container.appendChild(notesArea);
            container.appendChild(saveNotesButton);
        });
    }

    function getNotes(id) {
        if (!notes[id]) {
            notes[id] = [];
        }
        return notes[id].join('\n');
    }

    function setNotes(id, value) {
        notes[id] = value.split('\n');
        GM_setValue('notes', notes);
    }

    // 创建<style>元素来保存CSS规则
    const styleElement = document.createElement('style');
    // 将<style>元素添加到文档的<head>部分
    document.head.appendChild(styleElement);
    // 定义CSS规则
    const cssRules = `

  /* 黑名单 */
  .hmd-fbq {cursor: pointer;}
  .hmd-blacklist {box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.05);overflow: auto;display: none;width: 100%;height: 100%;z-index: 110;position: fixed;background: #eeeeee;padding: 10px !important;}
  .hmd-blacklist-item > a {padding: 0px 5px;}
  .hmd-blacklist-item:first-child {margin-top: 50px;}
  .hmd-blacklist-item {display: flex;height: 45px;align-items: center;justify-content: space-between;}
  .hmd-del {background: #fff;border: solid #aaa 1px;border-radius: 4px;padding: 5px 8px;font-size: 16px;}
  .hmd-add-to-blacklist {font-size: 10px !important;padding: 6px 8px !important;border-radius: 4px !important;float: right !important;margin-left: 5px !important;}
  .hmdclosebutton {z-index: 120;color: #666;font-size: 30px;position: fixed;padding: 8px 20px;display: none;width: 100%;background-color: #ffffff;justify-content: flex-end;cursor: pointer;}
  .hmd-blacklist-item > span {text-overflow: ellipsis;white-space: nowrap;overflow: hidden;}
  .hmd-blacklist-item > button {white-space: nowrap}

  /* 二次确认 */
  .hmd-popup {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.5);display: none;justify-content: center;align-items: center;z-index: 9999;}
  .hmd-popup-content {background-color: #fff;padding: 20px;border-radius: 5px;text-align: center;}
  .hmd-popup h3 {margin-top: 0;}
  .hmd-popup p {margin-bottom: 20px;}
  .hmd-confirm-button,.hmd-cancel-button {padding: 8px 16px;border-radius: 4px;cursor: pointer;border: solid 1px #555;}
  .hmd-confirm-button {background-color: #007bff;color: #fff;margin-right: 10px;}
  .hmd-cancel-button {background-color: #ccc;}

    /* 备注 */
  .hmd-save-notes-button {float: right;margin-top: 20px;}
  .hmd-notes-area {width: 100%;padding: 8px;max-width: 75%;height: 60px;border: 1px solid rgb(204, 204, 204);font-size: 14px;color: rgb(51, 51, 51);}
  .archive-excerpt > p {height: 48px;}

  /* 音视频 */
  .starstruck-wrap {display: block;}
  #single > .content > .sheader > .data {margin: 0;width: auto;}
  #single > .content > .sheader > .poster {width: auto;padding-bottom: 8px;background: 0;}
  #single > .content > .sheader > .poster > img {max-width: 100%;width: auto;}
  #single > .content > .sheader {display: flex;flex-direction: column;}
  #info > .wp-content > a {padding-right: 8px;}

  /* 用户 */
  .user-dashboard-dropdown,.user-dashboard-dropdown.show {transition: all 0.2s ease-out;}
  .user-dashboard-dropdown ul {display: flex;flex-direction: column;align-items: center;justify-content: space-between;}
  .user-dashboard-dropdown ul li:first-child {height: 60px;}
  .user-dashboard-dropdown ul li:last-child {box-shadow: none;}
  .user-dashboard-dropdown ul li {width: 100%;height: 50px;display: flex;align-items: center;justify-content: center;position: relative;align-self: stretch;}
  .user-dashboard-dropdown a.top-my-home {background: 0;}
  .user-dashboard-dropdown a {border: 0 !important;align-items: center;display: flex;justify-content: center;}
  .user-dashboard-dropdown a i.asmr {position: absolute;left: 20px;}
  .user-dashboard-dropdown p span.top-user-link-des {display: none !important;}
  .iconk-tongzhi:before {zoom: 1.3;}
  .iconk-tongzhi {left: 15px !important;}
  .user-dashboard-dropdown > ul> li:nth-last-child(3) > a > i:before {content: "\u{e61f}";}
  /* 分割线 */
  .separator {height: 1px;align-self: stretch;margin: 5px 15px;background: rgba(0, 0, 0, 0.1);}


`;
    // 将CSS规则添加到<style>元素中
    styleElement.appendChild(document.createTextNode(cssRules));

    // 在页面顶部创建黑名单显示区域
    var blackListArea = document.createElement('div');
    blackListArea.classList.add('hmd-blacklist');

    //二次确定
    const popupContainer = document.createElement("div");
    popupContainer.id = "hmd-popup";
    popupContainer.className = "hmd-popup";

    const popupContent = document.createElement("div");
    popupContent.className = "hmd-popup-content";

    const heading = document.createElement("h3");
    heading.textContent = "确认";

    const paragraph = document.createElement("p");
    paragraph.textContent = "确定要将该用户加入黑名单吗?";

    const confirmButton = document.createElement("button");
    confirmButton.id = "hmd-confirm-button";
    confirmButton.className = "hmd-confirm-button";
    confirmButton.textContent = "确认";

    const cancelButton = document.createElement("button");
    cancelButton.id = "hmd-cancel-button";
    cancelButton.className = "hmd-cancel-button";
    cancelButton.textContent = "取消";

    // 将所有元素追加到它们各自的父元素中
    popupContent.appendChild(heading);
    popupContent.appendChild(paragraph);
    popupContent.appendChild(confirmButton);
    popupContent.appendChild(cancelButton);
    popupContainer.appendChild(popupContent);

    // 将黑名单区域添加到页面顶部
    document.body.prepend(blackListArea);
    document.body.prepend(popupContainer);


    // 渲染黑名单列表
    renderBlacklist();

    // 监听 #wcThreadWrapper 的变化
    const threadWrapper = document.getElementById('wcThreadWrapper');
    const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.type === 'childList') {
                addBlacklistButtonToComments();
                blockLinks()
            }
        });
    });

    // 检查传递给 observe 方法的参数是否是有效的节点对象
    if (threadWrapper instanceof Node) {
    // 如果是有效的节点对象,则调用 observe 方法
        observer.observe(threadWrapper, { childList: true });
    } else {
    }

    // 添加“加入黑名单”按钮到评论中
    function addBlacklistButtonToComments() {
        const comments = document.querySelectorAll('.wc-comment-right');

        comments.forEach(comment => {
            const commentHeader = comment.querySelector('.wc-comment-header');
            const commentHeaderadd = comment.querySelector('.wc-comment-link');

            const addToBlacklistButton = commentHeader.querySelector('.hmd-add-to-blacklist');
            if (addToBlacklistButton) return; // 避免重复添加按钮

            const username = commentHeader.querySelector('.wc-comment-author > a').innerText;
            const hmdlink = commentHeader.querySelector('.wc-comment-author > a');
            const hmdlinkid = hmdlink.href.match(/\/author\/\d+/);
            const popup = document.getElementById('hmd-popup');

            const button = document.createElement('button');
            button.textContent = '加入黑名单';
            button.classList.add('hmd-add-to-blacklist');
            button.addEventListener('click', () => {
                popup.style.display = 'flex';

                const confirmButton = document.getElementById('hmd-confirm-button');
                const cancelButton = document.getElementById('hmd-cancel-button');

                cancelButton.addEventListener('click', () => {
                    popup.style.display = 'none';
                    confirmButton.removeEventListener('click', confirmClickHandler); // 移除确认按钮的事件监听器
                });

                const confirmClickHandler = () => {
                    blacklist.push({ username, hmdlinkid });
                    GM_setValue('blacklist', blacklist);
                    blockLinks();
                    renderBlacklist();
                    popup.style.display = 'none';
                    confirmButton.removeEventListener('click', confirmClickHandler); // 移除确认按钮的事件监听器
                };

                confirmButton.addEventListener('click', confirmClickHandler);
            });

            commentHeaderadd.appendChild(button);
        });
    }

    // 渲染黑名单列表
    function renderBlacklist() {
        blackListArea.innerHTML = '';

        blacklist.forEach(item => {
            const blacklistItem = document.createElement('div');
            blacklistItem.classList.add('hmd-blacklist-item');

            const blacklistusername = document.createElement('span');
            blacklistusername.textContent = item.username;
            const blacklistlink = document.createElement('a');
            blacklistlink.href = item.hmdlinkid;
            blacklistlink.textContent = item.hmdlinkid;

            blacklistItem.appendChild(blacklistusername);
            blacklistItem.appendChild(blacklistlink);

            const deleteButton = document.createElement('button');
            deleteButton.textContent = '删除';
            deleteButton.classList.add('hmd-del');
            deleteButton.addEventListener('click', () => {
                blacklist = blacklist.filter(i => i.hmdlinkid !== item.hmdlinkid);
                GM_setValue('blacklist', blacklist);
                renderBlacklist();
                blockLinks();
            });

            blacklistItem.appendChild(deleteButton);
            blackListArea.appendChild(blacklistItem);
        });
    }

    // 屏蔽黑名单中的链接
    function blockLinks() {
        const links = document.querySelectorAll('.wc-comment-author > a');
        var hostname = window.location.hostname;

        // 构建完整的 URL 列表
        var urls = blacklist.map(item => "https://" + hostname + item.hmdlinkid);

        links.forEach(link => {
            const parentElement = link.parentElement.parentElement.parentElement.parentElement;

            // 检查 URL 是否在 blacklist 中
            var isBlocked = urls.includes(link.href);

            if (isBlocked) {
                parentElement.style.display = 'none';
            } else {
                parentElement.style.display = '';
            }
        });
    }


    // 页面加载完毕时执行一次
    window.onload = function() {

        // 查找需要插入的位置
        const firstListItems = document.querySelectorAll('.user-dashboard-dropdown ul li:first-child');

        firstListItems.forEach((firstListItem) => {
            // 创建 .separator 元素
            const separator = document.createElement('div');
            separator.classList.add('separator');
            // 插入 .separator 元素
            firstListItem.insertAdjacentElement('afterend', separator);
        });


        // 获取<meta property="og:image">元素的内容
        const ogImageMeta = document.querySelector('meta[property="og:image"]');
        const ogImageUrl = ogImageMeta ? ogImageMeta.getAttribute('content') : '';

        // 替换图片链接
        const dplayerVideo = document.querySelector('#single > .content > .sheader > .poster > img');
        if (dplayerVideo && ogImageUrl) {
            dplayerVideo.setAttribute('src', ogImageUrl);
        }

        // 获取.wp-content下的所有<p>元素
        const paragraphs = document.querySelectorAll('.wp-content p');

        // 创建一个空数组来存储结果
        const youtuberesult = [];

        // 遍历每个<p>元素
        paragraphs.forEach((p) => {
            // 检查元素是否包含"油管:"
            if (p.textContent.includes('油管:')) {
                // 使用正则表达式匹配包含"油管:"的那一行
                const regex = /油管:(.*)/;
                const match = p.textContent.match(regex);

                if (match && match[1].trim() !== '') {
                    // 获取匹配到的文本
                    const matchedText = match[1];

                    // 分割文本为单词
                    const words = matchedText.split(' ');

                    // 遍历每个单词
                    words.forEach((word) => {
                        // 检查单词是否为空字符串
                        if (word.trim() !== '') {
                            // 创建<a>标签并设置href属性为单词链接
                            const link = document.createElement('a');
                            link.href = "https://www.youtube.com/watch?v=" + word;
                            link.target="_blank"

                            // 设置<a>标签的文本为单词
                            link.textContent = word;

                            // 将<a>标签添加到结果数组中
                            youtuberesult.push(link);
                        }
                    });
                }
            }
        });

        const activityBtn = document.querySelector('#info > .wp-content > .activity-btn');
        youtuberesult.forEach((link) => {
            activityBtn.parentNode.insertBefore(link, activityBtn);
        });


        // 创建关闭按钮元素
        var hmdcloseButton = document.createElement("i");
        hmdcloseButton.innerHTML = "&times;"; // 使用HTML实体编码表示红色"x"
        hmdcloseButton.style.display = "none";
        hmdcloseButton.classList.add('hmdclosebutton');
        hmdcloseButton.addEventListener("click", function() {
            // 隐藏黑名单div
            var blacklistDiv = document.querySelector(".hmd-blacklist");
            blacklistDiv.style.display = "none";
            hmdcloseButton.style.display = "none";
        });

        // 将关闭按钮添加到页面中
        var blacklistDiv = document.querySelector(".hmd-blacklist");
        blacklistDiv.parentNode.insertBefore(hmdcloseButton,blacklistDiv);

        const blacklistElement = document.querySelector('.hmd-blacklist');
        const hqhmdcloseButton = document.querySelector(".hmdclosebutton");

        // 获取 .user-dashboard-dropdown 元素
        var userlastlilist = document.querySelectorAll('.user-dashboard-dropdown ul li:last-child');
        // 循环处理每个最后一个 li 元素
        userlastlilist.forEach(function(userLastLi) {
            // 创建新的 li 元素
            var newuserLi = document.createElement('li');
            var newuserliLink = document.createElement('a');
            var newuserliLinkp = document.createElement('p');
            var newuserliLinkicon = document.createElement('i');
            newuserliLinkp.textContent = '黑名单';
            newuserliLinkicon.classList.add('asmr');
            newuserliLinkicon.classList.add('iconk-jianjie');
            newuserliLink.classList.add('hmd-fbq');
            newuserliLink.addEventListener('click', () => {
                blacklistElement.style.display = 'block';
                hqhmdcloseButton.style.display = 'flex';
            });

            newuserLi.appendChild(newuserliLink);
            newuserliLink.appendChild(newuserliLinkicon);
            newuserliLink.appendChild(newuserliLinkp);
            // 将新的 li 元素插入到当前最后一个 li 元素之前
            userLastLi.parentNode.insertBefore(newuserLi, userLastLi);
        });


        addBlacklistButtonToComments();
        blockLinks();
    };

    // 监听页面刷新事件,在刷新时保留黑名单列表
    window.addEventListener('beforeunload', () => {
        localStorage.setItem('blacklist', JSON.stringify(blacklist));
    });
})();