您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
2/25/2024, 11:26:31 PM
当前为
// ==UserScript== // @name [GC] - SDB Contents Collection // @namespace https://greasyfork.org/en/users/1225524-kaitlin // @match https://www.grundos.cafe/safetydeposit/* // @grant GM.setValue // @grant GM.getValue // @grant GM.addStyle // @license MIT // @version 1.1 // @author Cupkait // @icon https://i.imgur.com/4Hm2e6z.png // @description 2/25/2024, 11:26:31 PM // ==/UserScript== let collect = false; let active = false; const sdbStyle = createSdbStyle(); document.head.appendChild(sdbStyle); const collectContainer = createCollectContainer(); document.querySelector('main p:nth-child(4)').append(collectContainer); initialize(); async function initialize() { collect = await GM.getValue('collect', false); active = await GM.getValue('active', false); collect ? showNextButtons() : active ? enableNextPageNavigation() : showEnableButton(); } function createSdbStyle() { const style = document.createElement('style'); style.innerHTML = ` .collect-sdb { text-align: center; margin: 10px; } .collect-sdb a { background-color: var(--grid_head); border: 1px solid grey; padding: 5px 15px; margin: 10px; } `; return style; } function createCollectContainer() { const container = document.createElement('div'); container.classList.add('collect-sdb'); return container; } function showEnableButton() { collectContainer.append(createButton('Begin SDB Data Collection', () => { GM.setValue('collect', true).then(showNextButtons); })); } function showNextButtons() { removeAllButtons(); collectContainer.append( createButton('Collect full SDB', () => setActiveAndNavigate('https://www.grundos.cafe/safetydeposit/?view=100')), createButton('Collect quest only', () => setActiveAndNavigate('https://www.grundos.cafe/safetydeposit/?page=1&&max_rarity=89&view=100')) ); } function createButton(text, onClick) { const button = document.createElement('a'); button.textContent = text; button.addEventListener('click', onClick); return button; } function removeAllButtons() { while (collectContainer.firstChild) collectContainer.firstChild.remove(); } async function setActiveAndNavigate(url) { await Promise.all([GM.setValue('collect', false), GM.setValue('active', true)]); window.location.href = url; } function enableNextPageNavigation() { removeEnableButton(); collectContainer.append(createButton('Cancel/Restart Collection', cancelCollection)); initTableProcessing(); } function removeEnableButton() { const enableButton = collectContainer.querySelector('button'); if (enableButton) enableButton.remove(); } function appendMessages(messageText) { const message = document.createElement('p'); message.innerHTML = messageText; collectContainer.append(message); } async function initTableProcessing() { await processTableData(); displayPageInfo(); setupKeyboardNavigation(); } async function loadSdbContents() { return GM.getValue('sdbContents', []); } async function saveSdbContents(contents) { await GM.setValue('sdbContents', contents); } async function processTableData() { const sdbContents = await loadSdbContents(); const data = document.querySelectorAll('.data'); const rows = []; for (let i = 0; i < data.length; i += 7) { const row = createRow(data, i); const existingItemIndex = sdbContents.findIndex(item => item.n === row.n); if (existingItemIndex > -1) sdbContents[existingItemIndex] = row; else sdbContents.push(row); rows.push(row); } await saveSdbContents(sdbContents); } function createRow(data, index) { return { n: data[index + 1].querySelector('strong').textContent, r: parseInt(data[index + 1].querySelector('span').textContent.match(/\d+/)[0]), p: data[index + 2].querySelector('img').src.split('/').pop(), q: parseInt(data[index + 3].textContent), t: data[index + 4].querySelector('strong').textContent, }; } function setupKeyboardNavigation() { document.addEventListener('keydown', (event) => { if (event.key === 'ArrowRight' && !['INPUT', 'TEXTAREA'].includes(document.activeElement.tagName)) { const nextPageLink = [...document.querySelectorAll('.center a')].find(link => link.textContent.trim().startsWith('Next')); if (nextPageLink) nextPageLink.click(); } }); } async function displayPageInfo() { const pageCount = document.querySelectorAll('#page option').length; const currentPage = parseInt(new URLSearchParams(window.location.search).get('page')) || 1; const sdbContents = await loadSdbContents(); const totalItems = sdbContents.length; const endTotal = parseFloat(document.querySelector('main .center').childNodes[4].textContent.replace(/[^0-9.]/g, '').replace(/,/g, '')); appendMessages(`Total items collected: <strong>${totalItems.toLocaleString()}</strong> <br>You are viewing page <strong>${currentPage.toLocaleString()}</strong> / <strong>${pageCount.toLocaleString()}</strong>.`); appendMessages(`Click "Next" or press the right arrow key to go to the next page.`); if (totalItems === endTotal) appendExportButtons(); } function appendExportButtons() { collectContainer.append(createButton('Export to CSV', exportToCSV), createButton('Copy to Clipboard', copyToClipboard)); appendMessages(`Export to CSV to make a spreadsheet of the results. Copy to Clipboard to paste into a Virtupets.net Checklist.`) } function exportToCSV() { loadSdbContents().then(sdbContents => { const csvContent = "data:text/csv;charset=utf-8," + sdbContents.map(e => Object.values(e).join(",")).join("\n"); const link = document.createElement("a"); link.setAttribute("href", encodeURI(csvContent)); link.setAttribute("download", "sdbContents.csv"); document.body.appendChild(link); link.click(); link.remove(); displayCompletionMessage(); }); } function copyToClipboard() { loadSdbContents().then(sdbContents => { navigator.clipboard.writeText(JSON.stringify(sdbContents)).then(displayCompletionMessage).catch(err => { console.error('Could not copy text: ', err); }); }); } function displayCompletionMessage() { let message = collectContainer.querySelector('.completion-message'); let button = collectContainer.querySelector('button'); button.textContent = 'Done Collecting' if (!message) { message = document.createElement('p'); message.classList.add('completion-message'); collectContainer.append(message); } message.innerHTML = 'Action complete! Press "Done Collecting" to return to your usual SDB view.'; } async function cancelCollection() { await Promise.all([GM.setValue('active', false), GM.setValue('sdbContents', [])]); window.location.href = 'https://www.grundos.cafe/safetydeposit/?view=100'; }