BangumiCleaner

删除页面中所有时间线记录和条目

// ==UserScript==
// @name         BangumiCleaner
// @namespace    https://github.com/Adachi-Git/BangumiCleaner
// @version      0.2
// @description  删除页面中所有时间线记录和条目
// @author       Adachi
// @match        *://bangumi.tv/user/*/timeline
// @match        *://bgm.tv/user/*/timeline
// @match        *://chii.in/user/*/timeline
// @match        *://bangumi.tv/*/list/*
// @match        *://bgm.tv/*/list/*
// @match        *://chii.in/*/list/*
// @grant        none
// @license      MIT
// ==/UserScript==
(function() {
    'use strict';
    var delayTime = 1;


    // 定义不同类型的 fetchLinks
    var fetchLinks = {
        timeline: function(button) {
            return button.href + '?gh='+ '&ajax=1';
        },
        game: function(gameId, ghParam) {
            return 'https://bangumi.tv/subject/' + gameId + '/remove?gh=' + ghParam;
        }
    };

    // 创建一个按钮元素
    var deleteItemsButton = document.createElement('button');
    deleteItemsButton.textContent = '删除时间线记录和条目';
    deleteItemsButton.style.position = 'fixed';
    deleteItemsButton.style.top = '10px';
    deleteItemsButton.style.left = '10px';
    deleteItemsButton.style.zIndex = '9999';

    // 将按钮添加到页面上
    document.body.appendChild(deleteItemsButton);

    // 添加点击事件监听器
    deleteItemsButton.addEventListener('click', function() {
        // 弹出确认对话框
        var confirmDelete = confirm('确定要开始删除时间线记录和条目吗?');
        if (confirmDelete) {
            // 删除操作函数
            function deleteItems(deleteButtons, fetchMethod) {
                return new Promise(function(resolve, reject) {
                    var counter = 0;
                    var totalItems = deleteButtons.length;

                    function deleteNextItems() {
                        var batch = [];
                        for (var i = 0; i < 50 && counter < totalItems; i++, counter++) {
                            var button = deleteButtons[counter];
                            var link;

                            // 获取请求链接
                            if (fetchMethod === 'timeline') {
                                link = fetchLinks.timeline(button);
                            } else if (fetchMethod === 'game') {
                                // 获取页面的 gh 和 id 参数值
                                var gameId = button.getAttribute('onclick').match(/\d+/);
                                var ghParam = button.getAttribute('onclick').match(/'([^']+)'/);
                                if (gameId && ghParam) {
                                    link = fetchLinks.game(gameId[0], ghParam[1]);
                                }
                            }

                            // 添加到批量删除请求中
                            if (link) {
                                batch.push(fetch(link, {
                                    method: 'GET',
                                    headers: getHeaders()
                                }));
                            }
                        }

                        // 发送批量删除请求
                        Promise.all(batch)
                            .then(responses => {
                            responses.forEach(response => {
                                if (!response.ok) {
                                    throw new Error('删除请求失败');
                                }
                            });
                            console.log('成功删除了 ' + batch.length + ' 个条目');
                            if (counter < totalItems) {
                                setTimeout(deleteNextItems, 1000); // 等待一秒后继续删除下一批
                            } else {
                                resolve(); // 所有条目都已删除
                            }
                        })
                            .catch(error => {
                            console.error('删除请求错误:', error);
                            deleteNextItems(); // 出错时继续删除下一批
                        });
                    }


                    deleteNextItems();
                });
            }


            // 获取请求头
            function getHeaders() {
                return {
                    'Accept': '*/*',
                    'Accept-Encoding': 'gzip, deflate, br',
                    'Accept-Language': 'zh-CN,zh;q=0.9',
                    'Connection': 'keep-alive',
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    'Cookie': document.cookie,
                    'Host': window.location.hostname,
                    'Referer': window.location.href,
                    'Sec-Fetch-Dest': 'empty',
                    'Sec-Fetch-Mode': 'cors',
                    'Sec-Fetch-Site': 'same-origin',
                    'User-Agent': navigator.userAgent,
                    'X-Requested-With': 'XMLHttpRequest'
                };
            }

            // 删除时间线记录和游戏条目
            Promise.all([
                deleteItems(document.querySelectorAll('.tml_del'), 'timeline'),
                deleteItems(document.querySelectorAll('.collectModify a:last-child'), 'game')
            ])
                .then(() => console.log('所有记录和条目已成功删除'))
                .catch(error => console.error('删除过程中发生错误:', error));
        }
    });
})();