您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button to export Steam Family Library as TSV
当前为
// 👋 Hola, usa 🐒Tampermonkey 👇 // https://www.tampermonkey.net/ // ==UserScript== // @name Export Steam Family Games // @name:es Exportar Biblioteca Familiar de Steam // @name:it Esporta Giochi della Famiglia Steam // @name:fr Exporter les Jeux de la Famille Steam // @name:de Steam-Familienbibliothek exportieren // @namespace https://jlcareglio.github.io/ // @version 1.0.1 // @description Adds a button to export Steam Family Library as TSV // @description:es Agrega un botón para exportar como TSV la biblioteca familiar de Steam // @description:it Aggiunge un pulsante per esportare la Libreria Familiare di Steam come TSV // @description:fr Ajoute un bouton pour exporter la Bibliothèque Familiale Steam en TSV // @description:de Fügt eine Schaltfläche hinzu, um die Steam-Familienbibliothek als TSV zu exportieren // @icon https://www.google.com/s2/favicons?sz=64&domain=store.steampowered.com // @grant none // @author Jesús Lautaro Careglio Albornoz // @source https://gist.githubusercontent.com/JLCareglio/6366b1367428baae04151dfef6ceae47/raw/ // @match https://store.steampowered.com/account/familymanagement* // @supportURL https://gist.githubusercontent.com/JLCareglio/6366b1367428baae04151dfef6ceae47/ // ==/UserScript== (async () => { const waitForElement = ( querySelector, timeout = null, parentElement = document ) => { return new Promise((resolve, reject) => { const observer = new MutationObserver(() => { const element = parentElement.querySelector(querySelector); if (element) { observer.disconnect(); resolve(element); } }); observer.observe(document.body, { childList: true, subtree: true }); const element = parentElement.querySelector(querySelector); if (element) { observer.disconnect(); resolve(element); } if (timeout !== null) { setTimeout(() => { observer.disconnect(); reject( `Elemento con selector "${querySelector}" no encontrado dentro del tiempo límite de ${timeout}ms.` ); }, timeout); } }); }; const panelsContainer = await waitForElement("._3Pnf9j-DVi9cm7cJ383yI1"); const panels = panelsContainer.querySelectorAll("._1o7lKXffOJjZ_CpH1bHfY-"); const maxWaitingTime = 50000; // If this maxWaitingTime is reached, an error has occurred const exportAllGames = async (e) => { const allGames = []; const btnExport = e.target; const panel = btnExport.parentElement.parentElement.parentElement; const numGames = parseInt( panel.querySelector("._3x604kYqXRJbqWmeLWAHrj").innerText.match(/\d+/)[0] ); for (const p of panels) if (p != panel) p.remove(); const btnShowAll = panel.querySelector( "div:nth-child(2)._1ve5nrPCrUjlbKp1PXsiJD > button" ); btnShowAll.click(); let rowIndex = 0; let lastColIndex = 7; try { const firstRow = await waitForElement( ".-padb24TteB2RGJuMHdLn", maxWaitingTime, panel ); lastColIndex = firstRow?.childElementCount || 7; } catch (e) {} while (allGames.length < numGames) { const row = panel.querySelector(`[data-index="${rowIndex}"]`); if (row) { row.scrollIntoView(); try { const lastRow = await waitForElement( `[data-index="${rowIndex}"]`, maxWaitingTime, panel ); for ( let colIndex = 1; colIndex <= lastColIndex && allGames.length < numGames; colIndex++ ) { try { const gameSelector = `[data-index="${rowIndex}"] > div > [data-key]:nth-child(${colIndex})`; const game = await waitForElement( gameSelector, maxWaitingTime, lastRow ); const appId = game .querySelector("img") ?.src.match(/apps\/(\d+)\//)?.[1]; const verticalImgBanner = `https://cdn.cloudflare.steamstatic.com/steam/apps/${appId}/library_600x900.jpg`; const horizontalImgBanner = `https://cdn.cloudflare.steamstatic.com/steam/apps/${appId}/header.jpg`; const capsuleImg = `https://cdn.cloudflare.steamstatic.com/steam/apps/${appId}/capsule_231x87.jpg`; const title = game.querySelector("img")?.alt; const owners = game.querySelector(".OchtG0jyJQXcr2o0t34q7")?.innerText || "1"; allGames.push({ appId, title, owners, capsuleImg, verticalImgBanner, horizontalImgBanner, }); console.log( `Procesado juego ${allGames.length}/${numGames}: ${title}` ); } catch (error) { lastColIndex = colIndex - 1; console.log( `Tamaño máximo de columnas cambiado a ${lastColIndex}` ); break; } } rowIndex++; } catch (error) { console.error(`Error procesando fila ${rowIndex}:`, error); break; } } else { console.log(`No se encontró más filas después de ${rowIndex}`); break; } } const headers = "App ID\tTitle\tOwners\tCapsule Image\tVertical Image Banner\tHorizontal Image Banner"; let tsvContent = allGames .map( (game) => `${game.appId}\t${game.title}\t${game.owners}\t${game.capsuleImg}\t${game.verticalImgBanner}\t${game.horizontalImgBanner}` ) .join("\n"); tsvContent = `${headers}\n${tsvContent}`; let blob = new Blob([tsvContent], { type: "text/tab-separated-values" }); let url = URL.createObjectURL(blob); let a = document.createElement("a"); a.href = url; a.download = "steam_family_games.tsv"; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; for (const panel of panels) { const btnShowAll = panel.querySelector( "div:nth-child(2)._1ve5nrPCrUjlbKp1PXsiJD" ); let btnExport = btnShowAll.cloneNode(true); btnExport.addEventListener("click", exportAllGames); btnExport.querySelector("button").innerText = "Export TSV"; btnShowAll.parentElement.appendChild(btnExport); } })();