您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Displays a text area with game titles and keys so you can copy them out easily.
当前为
// ==UserScript== // @name Fanatical Keys Backup // @namespace Lex@GreasyFork // @version 0.1 // @description Displays a text area with game titles and keys so you can copy them out easily. // @author Lex // @match https://www.fanatical.com/en/orders/* // @grant none // ==/UserScript== (function() { 'use strict'; // Formats games array to a string to be displayed // Games is an array [ [title, key], ... ] function formatGames(games) { // Ignore games which do not have keys revealed games = games.filter(e => e[1]); // Format the output as tab-separated games = games.map(e => e[0]+"\t"+e[1]); return games.join("\n"); } function getGames(bundle) { let is = bundle.querySelectorAll(".order-item"); return Array.prototype.map.call(is, i => { const gameTitleElement = i.getElementsByClassName("game-name"); const gameTitle = gameTitleElement.length > 0 ? gameTitleElement[0].textContent.trim() : ""; const keyElement = i.querySelector("[aria-label='reveal-key']"); const gameKey = keyElement ? keyElement.value : ""; return [gameTitle, gameKey]; }); } // Adds a textarea to the bottom of the games listing with all the titles and keys function handleBundle(bundle) { const bundleName = bundle.querySelector("h5.my-4") ? bundle.querySelector("h5.my-4").textContent.trim() : "No Title"; let games = getGames(bundle); const gameCount = games.length; const keyCount = games.filter(e => e[1]).length; const gameStr = formatGames(games); let notify = document.createElement("div"); notify.className = "ktt-notify"; const color = gameCount == keyCount ? "" : "red"; notify.innerHTML = `Dumping keys for ${bundleName}: Found ${gameCount} items and <span style="background-color:${color}">${keyCount} keys</span>.`; if (gameCount != keyCount) { notify.innerHTML += " Are some keys not revealed?"; } bundle.append(notify); // Find an old textarea on the active bundle let area = bundle.querySelector("textarea.ktt"); // otherwise make a new one if (!area) { area = document.createElement("textarea"); area.className = "ktt"; bundle.append(area); } area.value = gameStr; area.style.width = "100%"; // Adjust the height so all the contents are visible area.style.height = ""; area.style.height = area.scrollHeight + 20 + "px"; } var loopCount = 0; function handleOrderPage() { // There can be more than one bundle in an order const bundles = document.querySelectorAll("hr.mb-4 ~ div"); if (bundles.length > 0) { console.log(`Found ${bundles.length} bundle(s)`); bundles.forEach(handleBundle); } else { if (loopCount++ < 100) { setTimeout(handleOrderPage, 100); } } } handleOrderPage(); })();