您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Retrieve keys from Bundle Stars
当前为
// ==UserScript== // @name Bundle Stars Keys Retrieve // @namespace http://tampermonkey.net/ // @version 1.1.1 // @description Retrieve keys from Bundle Stars // @icon https://cdn.bundlestars.com/production/brand/apple-touch-icon-180x180.png // @author Bisumaruko // @include http*://*bundlestars.com/* // @grant none // ==/UserScript== (function() { 'use strict'; function getAnchor() { var anchor = document.querySelector('h2'); return anchor && anchor.textContent.trim() === 'Order Keys' ? anchor : null; } function setup() { var anchor = getAnchor(); if (!anchor) return; var BSRetrive = document.createElement('div'), BSTextarea = document.createElement('textarea'), BSBtnContainer = document.createElement('div'), BSBtnReveal = document.createElement('button'), BSBtnRetrieve = document.createElement('button'), BSBtnCopy = document.createElement('button'), BSBtnReset = document.createElement('button'), BSCheckTitle = document.createElement('label'), BSCheckJoin = document.createElement('label'), style = document.createElement('style'); BSRetrive.classList.add('BSRetrive'); BSTextarea.classList.add('BSTextarea'); BSBtnContainer.classList.add('BSBtnContainer'); BSBtnReveal.classList.add('BSBtnReveal'); BSBtnReveal.textContent = 'Reveal'; BSBtnRetrieve.classList.add('BSBtnRetrieve'); BSBtnRetrieve.textContent = 'Retrieve'; BSBtnCopy.classList.add('BSBtnCopy'); BSBtnCopy.textContent = 'Copy'; BSBtnReset.classList.add('BSBtnReset'); BSBtnReset.textContent = 'Reset'; BSCheckTitle.innerHTML = '<input type="checkbox" class="BSCheckTitle">Include Game Title'; BSCheckJoin.innerHTML = '<input type="checkbox" class="BSCheckJoin">Join Keys'; style.type = 'text/css'; style.innerHTML = ` .BSRetrive { width: 100%; height: 200px; display: flex; flex-direction: column; box-sizing: border-box; border: 1px solid #424242; color: #999999; } .BSTextarea { width: 100%; height: 150px; border: none; background-color: #303030; color: #DDD; box-sizing: border-box; resize: none; } .BSBtnContainer { width: 100%; display: flex; padding-top: 5px; flex-grow: 1; box-sizing: border-box; } .BSBtnContainer > button { height: 34px; margin-right: 10px; padding: 6px 12px; border: 1px solid transparent; background-color: #262626; color: #dedede; box-sizing: border-box; outline: none; cursor: pointer; } .BSBtnContainer > button:hover { color: #A8A8A8; } .BSBtnContainer > label { margin-right: 10px; color: #dedede; } `; BSBtnReveal.addEventListener('click', () => { var keys = document.querySelectorAll('a[ng-click^="redeemSerial"]'); for (let key of keys) { if (key.parentNode.classList.contains('ng-hide')) continue; if (!key.closest('td').classList.contains('key-container')) continue; key.click(); } }); BSBtnRetrieve.addEventListener('click', () => { var keys = [], containers = document.querySelectorAll('td.key-container'), separator = document.querySelector('.BSCheckJoin').checked ? ',' : "\n"; for (let container of containers) { let title = container.previousElementSibling.textContent.trim(), key = container.querySelector('input').value.trim(); if (document.querySelector('.BSCheckTitle').checked) key = title + ', ' + key; keys.push(key); } BSTextarea.textContent = keys.join(separator); }); BSBtnCopy.addEventListener('click', () => { BSTextarea.select(); document.execCommand('copy'); }); BSBtnReset.addEventListener('click', () => { BSTextarea.textContent = ''; }); document.head.appendChild(style); BSBtnContainer.appendChild(BSBtnReveal); BSBtnContainer.appendChild(BSBtnRetrieve); BSBtnContainer.appendChild(BSBtnCopy); BSBtnContainer.appendChild(BSBtnReset); BSBtnContainer.appendChild(BSCheckTitle); BSBtnContainer.appendChild(BSCheckJoin); BSRetrive.appendChild(BSTextarea); BSRetrive.appendChild(BSBtnContainer); anchor.parentNode.insertBefore(BSRetrive, anchor); } function observeOrderDetails(target) { new MutationObserver(mutations => { for (let mutation of mutations) { if (!mutation.addedNodes.length) continue; if (mutation.addedNodes[0].classList.contains('ng-scope')) { setup(); } } }).observe(target, {childList: true}); } var anchor = getAnchor(); if (anchor) { setup(); observeOrderDetails(anchor.closest('body > div.ng-scope')); } else { var bodyObserver = new MutationObserver(mutations => { for (let mutation of mutations) { if (!mutation.addedNodes.length) continue; if (mutation.addedNodes[0].classList.contains('ng-scope')) { observeOrderDetails(mutation.addedNodes[0]); bodyObserver.disconnect(); } } }); bodyObserver.observe(document.body, {childList: true}); } })();