// ==UserScript==
// @name 比特球云盘 - 一键删除所有文件
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 利用删除成功提示出现后极短延迟,实现最快循环删除。
// @author Sc千寻
// @include https://pan.bitqiu.com/*
// @grant none
// @run-at document-idle
// @license GPL
// @downloadURL https://update.greasyfork.icu/scripts/558458/%E6%AF%94%E7%89%B9%E7%90%83%E4%BA%91%E7%9B%98%20-%20%E4%B8%80%E9%94%AE%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.user.js
// @updateURL https://update.greasyfork.icu/scripts/558458/%E6%AF%94%E7%89%B9%E7%90%83%E4%BA%91%E7%9B%98%20-%20%E4%B8%80%E9%94%AE%E5%88%A0%E9%99%A4%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.meta.js
// ==/UserScript==
(function() {
'use strict';
// 常量定义
const FILE_ITEM_SELECTOR = 'ol.file-list-content .file-item';
const SELECT_ALL_BUTTON_SELECTOR = '.el-checkbox.checkbox-all';
const SUCCESS_NOTICE_SELECTOR = '.notice-wrap.notice-success';
// 辅助函数:等待并获取/检查元素
function waitForElement(selector, timeout = 10000) {
return new Promise((resolve, reject) => {
const startTime = Date.now();
const check = () => {
const element = document.querySelector(selector);
if (element) {
return resolve(element);
} else if (Date.now() - startTime > timeout) {
return reject(new Error(`Timeout waiting for element with selector: ${selector}`));
}
setTimeout(check, 200);
};
check();
});
}
// --- 插入新按钮的逻辑 (保持不变) ---
function insertDeleteAllButton() {
const createDirButtonSelector = 'a[data-tj="top_btn_create_dir"]';
const createDirButton = document.querySelector(createDirButtonSelector);
if (document.getElementById('deleteAllFilesBtn')) {
return;
}
if (createDirButton) {
const deleteAllBtn = document.createElement('a');
deleteAllBtn.id = 'deleteAllFilesBtn';
deleteAllBtn.className = '_btn btn-default mr10';
deleteAllBtn.style.color = '#fff';
deleteAllBtn.style.backgroundColor = '#fa5555';
deleteAllBtn.style.borderColor = '#fa5555';
deleteAllBtn.title = '一键清空当前文件夹下的所有文件(极限加速)';
deleteAllBtn.innerHTML = `
清空所有文件
`;
deleteAllBtn.addEventListener('click', deleteLoop);
createDirButton.after(deleteAllBtn);
console.log('🎉 “清空所有文件”按钮已成功插入/重新插入!');
}
}
// 核心函数:执行一次删除步骤
async function performDeleteStep() {
// --- 步骤 1: 模拟点击 "全选" 按钮 ---
const selectAllButton = await waitForElement(SELECT_ALL_BUTTON_SELECTOR, 5000);
selectAllButton.click();
console.log(' -> ✔️ 已点击 "全选" 按钮。');
await new Promise(resolve => setTimeout(resolve, 500));
// --- 检查文件数量 ---
const fileItems = document.querySelectorAll(FILE_ITEM_SELECTOR);
if (fileItems.length === 0) {
throw new Error('FILE_LIST_EMPTY');
}
// --- 步骤 2: 模拟点击 "删除" 按钮 ---
const deleteButtonSelector = 'a[data-tj="top_btn_del"]';
const deleteButton = document.querySelector(deleteButtonSelector);
if (!deleteButton) {
throw new Error('未找到顶部的 "删除" 按钮。');
}
deleteButton.click();
console.log(' -> ✔️ 已点击顶部的 "删除" 按钮。');
// --- 步骤 3: 模拟点击 确认弹窗中的 "确定" 按钮 ---
const confirmButtonSelector = 'a.js-confirm';
const confirmButton = await waitForElement(confirmButtonSelector, 5000);
confirmButton.click();
console.log(' -> ✔️ 已点击确认删除。');
// 🚀 等待删除成功提示出现 (证明服务器已响应并完成操作)
console.log(' -> ⏳ 等待删除操作完成...');
await waitForElement(SUCCESS_NOTICE_SELECTOR, 10000);
console.log(' -> 🎉 成功提示已出现,删除操作完成。');
// 🚀 等待 1000 毫秒后立即开始下一轮
await new Promise(resolve => setTimeout(resolve, 1000));
console.log(' -> ⚡ 1000ms 延迟结束,准备进入下一轮循环。');
}
// 主循环函数:持续删除直到清空
async function deleteLoop() {
insertDeleteAllButton();
if (!confirm('🚨 严重警告:您确定要删除当前文件夹下的所有文件吗?此操作将循环执行直到清空文件夹!')) {
console.log('操作已取消。');
return;
}
let deleteCount = 0;
console.log('🚀 开始循环执行:清空所有文件 (v6.0 极限加速)...');
try {
while (true) {
// 等待文件列表内容加载完毕
await waitForElement(FILE_ITEM_SELECTOR, 10000).catch(() => {});
const fileItems = document.querySelectorAll(FILE_ITEM_SELECTOR);
const currentFileCount = fileItems.length;
if (currentFileCount === 0) {
console.log('✅ 文件列表已清空,循环结束。');
break;
}
deleteCount++;
console.log(`\n--- 第 ${deleteCount} 次删除,当前页面有 ${currentFileCount} 个文件 ---`);
// 执行一次删除操作
await performDeleteStep();
// 极小延迟,避免 CPU 占用过高
await new Promise(resolve => setTimeout(resolve, 100));
}
alert(`🎉 恭喜!已成功清空所有文件,共执行了 ${deleteCount} 轮删除操作。`);
} catch (error) {
if (error.message === 'FILE_LIST_EMPTY') {
console.log('✅ 文件列表已清空,循环结束 (通过空列表检查退出)。');
alert(`🎉 恭喜!已成功清空所有文件,共执行了 ${deleteCount} 轮删除操作。`);
} else {
console.error('❌ 脚本执行失败,循环中断:', error.message);
alert(`脚本执行失败,循环中断:${error.message}`);
}
}
// 最终清理
insertDeleteAllButton();
}
// 启动
waitForElement('a[data-tj="top_btn_create_dir"]', 15000)
.then(insertDeleteAllButton)
.catch(error => {
console.warn('脚本启动失败:', error.message);
});
})();