Descarga la lista de todos tus juegos de Steam en una hoja de cálculo: horas jugadas, fecha de la última partida, logros y enlace a la tienda. Gratis, en tu navegador, sin clave de la API de Steam y sin conectar tu cuenta a ninguna web.
Inicia sesión en steamcommunity.com y abre tu página de Juegos (Perfil > Juegos > Todos los juegos); luego ejecuta el script. También funciona con la biblioteca de un amigo si sus detalles de juegos son públicos.
// Responsive Muse · Steam Library Exporter · v1.0 · 2026-10-31
// Saves a Steam game library (yours, or a friend's if their game details are public) to CSV or TXT:
// game, hours played, last played, achievements and store link. Handy to back up your list, see
// what you never played or share it. Runs only on a steamcommunity.com profile's Games page. It
// reads the list the page already loaded: it makes no network requests of its own and never reads
// cookies, passwords or tokens.
(async () => {
const TOOL = 'Exportar biblioteca de Steam';
const FORMAT = 'csv'; // 'csv' (Excel, Sheets) or 'txt' ("Game - link", one per line)
const SORT = 'hours'; // 'hours' (most played first), 'name' (A to Z) or 'recent' (last played first)
if (location.hostname !== 'steamcommunity.com' || !/^\/(id|profiles)\/[^/]+\/games/.test(location.pathname)) {
alert('Abre primero una página de Juegos, por ejemplo la tuya:\nhttps://steamcommunity.com/my/games/?tab=all');
return;
}
// A small box on the page shows progress and asks before changing anything,
// so you never need to read or edit the console.
const many = (n, word) => `${n} ${n === 1 ? word : ({ canal: 'canales', 'canción': 'canciones', 'publicación': 'publicaciones', 'elemento guardado': 'elementos guardados' })[word] || word + 's'}`; // 1 vídeo, 2 vídeos
const panel = (() => {
const box = document.createElement('div');
box.style.cssText = 'display:block!important;position:fixed;right:16px;bottom:16px;z-index:2147483647;width:340px;max-width:calc(100vw - 32px);' +
'background:#111318;color:#e6e8ee;font:14px/1.5 system-ui,sans-serif;border-radius:12px;padding:16px;' +
'box-shadow:0 8px 30px rgba(0,0,0,.4);text-align:left';
const head = document.createElement('strong');
head.textContent = TOOL;
const msg = document.createElement('p');
msg.style.cssText = 'margin:8px 0 12px;white-space:pre-line';
const row = document.createElement('div');
row.style.cssText = 'display:flex;flex-wrap:wrap;gap:8px;justify-content:flex-end';
box.append(head, msg, row);
document.body.append(box);
const button = (label, primary, onClick) => {
const b = document.createElement('button');
b.textContent = label;
b.style.cssText = 'font:600 14px system-ui,sans-serif;padding:8px 14px;border-radius:8px;cursor:pointer;' +
(primary ? 'background:#0f766e;color:#fff;border:1px solid #0f766e' : 'background:none;color:#e6e8ee;border:1px solid #3a3f4b');
b.onclick = onClick;
row.append(b);
};
return {
text(t) { msg.textContent = t; },
ask(t, yes) {
msg.textContent = t;
row.replaceChildren();
return new Promise(r => {
button('Cancelar', false, () => { row.replaceChildren(); r(false); });
button(yes, true, () => { row.replaceChildren(); r(true); });
});
},
stoppable(onStop) { row.replaceChildren(); button('Parar', false, onStop); },
actions(t, list) {
msg.textContent = t;
row.replaceChildren();
list.forEach(([label, primary, run]) => button(label, primary, run));
},
finish(t) { this.actions(t, [['Cerrar', true, () => box.remove()]]); },
close() { box.remove(); },
};
})();
// Offer the result as a downloaded file or as clipboard text (a real click, so it always works)
const deliver = (summary, body, file) => {
const save = () => {
const a = document.createElement('a');
a.href = URL.createObjectURL(new Blob([/\.csv$/.test(file) ? '\ufeff' + body : body], { type: 'text/plain;charset=utf-8' }));
a.download = file;
a.click();
setTimeout(() => URL.revokeObjectURL(a.href), 5000);
panel.text(`${summary}\nGuardado como ${file} (mira tu carpeta de Descargas).`);
};
const copy = () => navigator.clipboard.writeText(body)
.then(() => panel.text(`${summary}\nCopiado. Pégalo en una hoja de cálculo o en una nota.`))
.catch(() => panel.text(`${summary}\nEl navegador ha bloqueado el portapapeles: usa Descargar.`));
panel.actions(summary, [['Cerrar', false, () => panel.close()], ['Copiar', false, copy], ['Descargar', true, save]]);
};
// 1. The whole library (and achievement progress) comes with the page itself
let games = [];
const ach = new Map();
try {
const cache = JSON.parse(window.SSR.renderContext.queryData).queries;
games = cache.find(q => q.queryKey[0] === 'OwnedGames')?.state.data || [];
for (const q of cache) {
const d = q.queryKey[0] === 'AchievementProgress' && q.state.data;
if (d?.appid) ach.set(d.appid, d);
}
} catch (e) { /* not loaded yet, handled below */ }
if (!Array.isArray(games) || !games.length) {
panel.finish('No se han encontrado juegos. Recarga esta página (F5) y vuelve a ejecutar el script. Si sigue vacía, los detalles de juegos del perfil son privados o no tiene juegos.');
return 0;
}
// 2. One row per game
const day = t => t ? new Date(t * 1000).toISOString().slice(0, 10) : '';
const hours = m => m ? (m / 60).toFixed(1) : '0';
const list = games.map(g => {
const a = ach.get(g.appid);
return {
name: g.name || `App ${g.appid}`,
minutes: g.playtime_forever || 0,
recent: g.playtime_2weeks || 0,
last: g.rtime_last_played || 0,
achievements: a?.total ? `${a.unlocked}/${a.total}` : '',
percent: a?.total ? Math.round(a.unlocked * 100 / a.total) + '%' : '',
appid: g.appid,
url: `https://store.steampowered.com/app/${g.appid}/`,
};
});
const byName = (x, y) => x.name.localeCompare(y.name, undefined, { sensitivity: 'base' });
list.sort(SORT === 'name' ? byName
: SORT === 'recent' ? (x, y) => y.last - x.last || byName(x, y)
: (x, y) => y.minutes - x.minutes || byName(x, y));
// 3. Build the file and offer it
const cell = v => '"' + String(v).replace(/"/g, '""') + '"';
const body = FORMAT === 'txt'
? list.map(g => `${g.name} - ${g.url}`).join('\n')
: ['Juego,Horas jugadas,Horas últimas 2 semanas,Última partida,Logros,Logros %,App ID,URL de la tienda', ...list.map(g =>
[g.name, hours(g.minutes), hours(g.recent), day(g.last), g.achievements, g.percent, g.appid, g.url].map(cell).join(','))].join('\n');
const total = Math.round(list.reduce((s, g) => s + g.minutes, 0) / 60);
const never = list.filter(g => !g.minutes).length;
const owner = (document.title.split('::')[1] || 'steam').trim();
deliver(`Listo: ${many(list.length, 'juego')}: ${total} horas jugadas, ${never} sin jugar nunca.`, body,
`steam-library-${owner.replace(/[\\/:*?"<>|\s]+/g, '_')}.${FORMAT}`);
return list.length;
})();
🛡️ ¿Chrome te dice «No pegues código…»? Es normal. Escribe allow pasting en la consola (o permitir pegar si tu Chrome está en español), pulsa Intro y vuelve a pegar. Solo hace falta una vez.
¿Por qué avisa Chrome?
Chrome lo muestra la primera vez que alguien pega algo en la consola, para proteger de estafas en las que te piden pegar código desconocido. Hace bien en avisar, y por eso este script está entero a la vista: 126 líneas comentadas que no envían nada a ningún sitio ni tocan tus contraseñas o cookies. Por qué es seguro.
¿Prefieres no usar la consola? Arrastra el botón Exportar biblioteca de Steam a tu barra de marcadores y haz clic en él estando en steamcommunity.com. Así no sale el aviso.
Marcador: arrastra el botón del medio a tu barra de marcadores, abre steamcommunity.com y pulsa el marcador. Ejecuta el mismo script con las opciones de arriba.
- No envía nada a ningún sitio. Sin fetch, XHR ni scripts externos. La única actividad de red es la de steamcommunity.com cargando tu lista.
- No toca tu sesión. No lee cookies, contraseñas, tokens ni el almacenamiento del navegador.
- Solo funciona en steamcommunity.com. En cualquier otra web se detiene antes de hacer nada.
- Corto y legible. 126 líneas comentadas, sin minificar ni ofuscar.
- Muestra su progreso en la página. Un pequeño recuadro te dice qué está haciendo y al final te ofrece Descargar o Copiar.
- El mismo código para todos. SHA-256 de la versión por defecto:
e1f24d202197bdfc…
Compruébalo tú mismo en 30 segundos
- Léelo: todas las líneas están arriba, con comentarios.
- Busca en el código
fetch,XMLHttpRequest,cookie,localStorageoeval. No aparece ninguna. - Abre la pestaña Red (Network) antes de ejecutarlo: solo verás peticiones a steamcommunity.com.
Cómo usarlo
- Inicia sesión en steamcommunity.com y abre tu página de Juegos (Perfil > Juegos > Todos los juegos).
- Abre la consola: F12 o Ctrl+Mayús+J (Cmd+Opción+J en Mac). Si Chrome te lo pide, escribe
permitir pegary pulsa Enter. - Copia el script, pégalo en la consola y pulsa Enter. Lee la lista que la página ya ha cargado y te ofrece el archivo al momento.
Qué obtienes
Una fila por juego: nombre, horas jugadas, horas en las últimas 2 semanas, fecha de la última partida, logros conseguidos (por ejemplo 40/50) y porcentaje, App ID y enlace a la tienda. El recuadro también te dice tus horas totales y cuántos juegos no has jugado nunca. Elige TXT para una lista simple «Juego – enlace».
¿Por qué no una web o una clave de API?
La mayoría de exportadores de bibliotecas de Steam piden una clave de la API web de Steam, necesitan que tu perfil sea público o son programas que hay que instalar. Este es corto, se puede leer entero y solo funciona en steamcommunity.com, en tu pestaña y con la sesión que ya tienes.
Preguntas frecuentes
¿Steam tiene un botón para exportar la biblioteca?
No. Steam solo te deja ver la lista. Puedes pedir tus datos a Soporte de Steam, pero tarda y llega como página web, no como hoja de cálculo. Este script te da el CSV en un segundo.
¿Necesito una clave de API o dar mi contraseña?
No. A diferencia de los exportadores que piden una clave de la API web de Steam o que tu perfil sea público, el script lee la página de Juegos que ya tienes abierta con tu sesión. No envía nada a ningún sitio.
¿Por qué faltan algunos juegos?
Los juegos gratuitos que nunca abriste, las betas retiradas y los juegos de Préstamo familiar de otras cuentas pueden no salir en tu página de Juegos, así que no se pueden exportar. Se exporta todo lo que muestra la página.
¿Por qué la columna de logros sale vacía en algunos juegos?
Esos juegos no tienen logros de Steam, o Steam no los muestra en la página de Juegos.
¿Puedo exportar la biblioteca de un amigo?
Sí, si los detalles de juegos de su perfil son públicos (o visibles para amigos y lo sois). Abre su página de Juegos y ejecuta el script. Si dice 0 juegos, sus detalles de juegos son privados.
