Greasy Fork is available in English.

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