您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automation for deleting items from the Redbubble cart
// ==UserScript== // @name Redbubble Delete Cart Items // @namespace http://tampermonkey.net/ // @version 1.5 // @description Automation for deleting items from the Redbubble cart // @author YAD // @match https://www.redbubble.com/cart // @license MIT // @grant none // @icon https://www.redbubble.com/boom/public/favicons/favicon.ico // @run-at document-end // ==/UserScript== (function() { 'use strict'; const controlPanel = document.createElement('div'); controlPanel.style.position = 'fixed'; controlPanel.style.backgroundColor = '#ff596f'; controlPanel.style.border = '1px solid #ccc'; controlPanel.style.borderRadius = '8px'; controlPanel.style.padding = '10px'; controlPanel.style.boxShadow = '0 2px 10px rgba(0,0,0,0.1)'; controlPanel.style.zIndex = 1000; controlPanel.style.cursor = 'move'; controlPanel.style.transition = 'transform 0.2s'; const deleteCountDisplay = document.createElement('div'); deleteCountDisplay.id = 'delete-count'; deleteCountDisplay.style.fontSize = '16px'; deleteCountDisplay.style.marginBottom = '10px'; deleteCountDisplay.innerHTML = 'Items Deleted: <span id="count">0</span>'; const inputContainer = document.createElement('div'); inputContainer.style.marginBottom = '10px'; const itemCountInput = document.createElement('input'); itemCountInput.type = 'number'; itemCountInput.id = 'item-count'; itemCountInput.placeholder = 'Number of items to delete'; itemCountInput.style.marginRight = '10px'; itemCountInput.style.width = '150px'; const deleteAllCheckbox = document.createElement('input'); deleteAllCheckbox.type = 'checkbox'; deleteAllCheckbox.id = 'delete-all'; deleteAllCheckbox.style.marginRight = '5px'; const deleteAllLabel = document.createElement('label'); deleteAllLabel.setAttribute('for', 'delete-all'); deleteAllLabel.textContent = 'Delete All'; inputContainer.appendChild(itemCountInput); inputContainer.appendChild(deleteAllCheckbox); inputContainer.appendChild(deleteAllLabel); const controlButton = document.createElement('button'); controlButton.id = 'control-button'; controlButton.style.backgroundColor = '#e91e63'; controlButton.style.color = '#fff'; controlButton.style.border = 'none'; controlButton.style.borderRadius = '4px'; controlButton.style.padding = '5px 10px'; controlButton.style.cursor = 'pointer'; controlButton.textContent = 'Start'; controlPanel.appendChild(deleteCountDisplay); controlPanel.appendChild(inputContainer); controlPanel.appendChild(controlButton); document.body.appendChild(controlPanel); const savedPosition = JSON.parse(localStorage.getItem('controlPanelPosition')); if (savedPosition) { controlPanel.style.top = savedPosition.top || '10px'; controlPanel.style.left = savedPosition.left || '10px'; } else { controlPanel.style.top = '50%'; controlPanel.style.left = 'calc(100% - 220px)'; controlPanel.style.transform = 'translateY(-50%)'; } function savePosition() { localStorage.setItem('controlPanelPosition', JSON.stringify({ top: controlPanel.style.top, left: controlPanel.style.left })); } let isDragging = false; let offsetX, offsetY; let isDraggingDisabled = false; controlPanel.addEventListener('mousedown', (e) => { if (isDraggingDisabled) return; isDragging = true; offsetX = e.clientX - controlPanel.getBoundingClientRect().left; offsetY = e.clientY - controlPanel.getBoundingClientRect().top; controlPanel.style.cursor = 'grabbing'; }); document.addEventListener('mousemove', (e) => { if (isDragging) { controlPanel.style.top = `${e.clientY - offsetY}px`; controlPanel.style.left = `${e.clientX - offsetX}px`; savePosition(); } }); document.addEventListener('mouseup', () => { isDragging = false; controlPanel.style.cursor = 'move'; }); let isPaused = false; function deleteItems() { const deleteButtons = document.querySelectorAll('button[aria-label="Show remove confirmation button"]'); const confirmButtons = document.querySelectorAll('button.LineItem_removeConfirmBtn__CZE_0'); const totalButtons = deleteButtons.length; if (totalButtons === 0) { alert('No items found to delete.'); return; } let deleteCount = 0; let maxDeleteCount = parseInt(itemCountInput.value) || totalButtons; if (deleteAllCheckbox.checked) { maxDeleteCount = totalButtons; } function deleteNext() { if (isPaused) return; if (deleteCount >= maxDeleteCount || deleteCount >= totalButtons) { controlButton.textContent = 'Start'; isDraggingDisabled = false; return; } const deleteButton = deleteButtons[deleteCount]; if (!deleteButton) { console.error('Delete button not found for index:', deleteCount); return; } deleteButton.click(); setTimeout(() => { const confirmButton = confirmButtons[deleteCount]; if (confirmButton) { confirmButton.click(); deleteCount++; document.getElementById('count').textContent = deleteCount; deleteNext(); } else { console.error('Confirm button not found for index:', deleteCount); } }, 100); } deleteNext(); } controlButton.addEventListener('click', () => { if (controlButton.textContent === 'Start') { isPaused = false; isDraggingDisabled = true; controlButton.textContent = 'Pause'; deleteItems(); } else if (controlButton.textContent === 'Pause') { isPaused = !isPaused; controlButton.textContent = isPaused ? 'Resume' : 'Pause'; } else if (controlButton.textContent === 'Resume') { isPaused = false; controlButton.textContent = 'Pause'; deleteItems(); } }); document.addEventListener('mouseup', () => { if (controlButton.textContent === 'Resume') { isDraggingDisabled = false; } }); })();