Bilibili 换一换历史记录

为Bilibili主页上的 换一换 添加回滚功能,可配置历史记录限制

目前為 2024-08-04 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Bilibili 换一换历史记录
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  为Bilibili主页上的 换一换 添加回滚功能,可配置历史记录限制
// @author       MaoShiSanKe
// @match        *://www.bilibili.com/*
// @icon         https://www.bilibili.com/favicon.ico
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const feedHistory = [];
    let feedHistoryIndex = 0;
    let historyLimit = 3; // Default limit
    let autoDelete = true; // Default auto-delete setting

    // Register menu commands for user settings
    GM_registerMenuCommand('设置历史限制', setHistoryLimit);
    GM_registerMenuCommand('切换自动删除', toggleAutoDelete);

    const feedRollBackBtn = `
    <button id="feed-roll-back-btn" class="primary-btn feed-roll-back-btn biliplus-disabled" style="margin-top: 10px;" class="primary-btn roll-btn">
        <span>回</span>
    </button>
    `;

    const feedRollNextBtn = `
    <button id="feed-roll-next-btn" class="primary-btn feed-roll-next-btn biliplus-disabled" style="margin-top: 10px;" class="primary-btn roll-btn">
        <span>行</span>
    </button>
    `;

    const clearHistoryBtn = `
    <button id="clear-history-btn" class="primary-btn clear-history-btn biliplus-disabled" style="margin-top: 10px;" class="primary-btn roll-btn">
        <span>清</span>
    </button>
    `;

    const targetNode = document.querySelector('.recommended-container_floor-aside');
    const observer = new MutationObserver(() => {
        let feedRollBtn = document.querySelector('.roll-btn');

        if (feedRollBtn && !document.getElementById('feed-roll-back-btn')) {
            // 创建返回按钮
            let backBtn = document.createElement('button');
            feedRollBtn.parentNode.appendChild(backBtn);
            backBtn.outerHTML = feedRollBackBtn;

            document.getElementById('feed-roll-back-btn').addEventListener('click', () => {
                let feedCards = document.getElementsByClassName('feed-card');
                if (feedHistoryIndex == feedHistory.length) {
                    feedHistory.push(listInnerHTMLOfFeedCard(feedCards));
                }
                for (let fc_i = 0; fc_i < feedCards.length; fc_i++) {
                    feedCards[fc_i].innerHTML = feedHistory[feedHistoryIndex - 1][fc_i];
                }
                feedHistoryIndex = feedHistoryIndex - 1;
                if (feedHistoryIndex == 0) {
                    disableElementById('feed-roll-back-btn', true);
                }
                disableElementById('feed-roll-next-btn', false);
            });
        }

        if (feedRollBtn && !document.getElementById('feed-roll-next-btn')) {
            // 创建下一页按钮
            let nextBtn = document.createElement('div');
            feedRollBtn.parentNode.appendChild(nextBtn);
            nextBtn.outerHTML = feedRollNextBtn;

            document.getElementById('feed-roll-next-btn').addEventListener('click', () => {
                let feedCards = document.getElementsByClassName('feed-card');
                for (let fc_i = 0; fc_i < feedCards.length; fc_i++) {
                    feedCards[fc_i].innerHTML = feedHistory[feedHistoryIndex + 1][fc_i];
                }
                feedHistoryIndex = feedHistoryIndex + 1;
                if (feedHistoryIndex == feedHistory.length - 1) {
                    disableElementById('feed-roll-next-btn', true);
                }
                disableElementById('feed-roll-back-btn', false);
            });
        }

        if (feedRollBtn && !document.getElementById('clear-history-btn')) {
            // 创建清除历史按钮
            let clearBtn = document.createElement('div');
            feedRollBtn.parentNode.appendChild(clearBtn);
            clearBtn.outerHTML = clearHistoryBtn;

            document.getElementById('clear-history-btn').addEventListener('contextmenu', (event) => {
                event.preventDefault();
                feedHistory.length = 0;
                feedHistoryIndex = 0;
                disableElementById('feed-roll-back-btn', true);
                disableElementById('feed-roll-next-btn', true);
                alert('历史记录已清除');
            });
        }

        // 处理点击换一换事件
        if (feedRollBtn) {
            feedRollBtn.id = 'feed-roll-btn';
            feedRollBtn.addEventListener('click', () => {
                setTimeout(() => {
                    if (feedHistoryIndex == feedHistory.length) {
                        let feedCards = listInnerHTMLOfFeedCard(document.getElementsByClassName('feed-card'));
                        feedHistory.push(feedCards);
                        if (autoDelete && feedHistory.length > historyLimit) {
                            feedHistory.shift();
                            feedHistoryIndex--;
                        }
                    }
                    feedHistoryIndex = feedHistory.length;
                    disableElementById('feed-roll-back-btn', false);
                    disableElementById('feed-roll-next-btn', true);
                });
            });

            // 停止观察
            observer.disconnect();
        }
    });

    observer.observe(targetNode, { childList: true, subtree: true });

    function disableElementById(id, bool) {
        if (bool) {
            document.getElementById(id).classList.add('biliplus-disabled');
        } else {
            document.getElementById(id).classList.remove('biliplus-disabled');
        }
    }

    function listInnerHTMLOfFeedCard(feedCardElements) {
        let feedCardInnerHTMLs = [];
        for (let fc of feedCardElements) {
            feedCardInnerHTMLs.push(fc.innerHTML);
        }
        return feedCardInnerHTMLs;
    }

    function setHistoryLimit() {
        const limit = prompt('Set the history limit (0 for no limit):', historyLimit);
        if (limit !== null) {
            historyLimit = parseInt(limit, 10);
            if (isNaN(historyLimit) || historyLimit < 0) {
                historyLimit = 5; // Reset to default if invalid input
                alert('Invalid input. History limit reset to default (5).');
            } else {
                alert(`历史记录限制设置为 ${historyLimit}.`);
            }
        }
    }

    function toggleAutoDelete() {
        autoDelete = !autoDelete;
        alert(`自动删除现在 ${autoDelete ? '启用' : '未启用'}.`);
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址