Haz copia de todo lo que has guardado en Reddit, posts y comentarios, en una hoja de cálculo, una nota Markdown para Notion u Obsidian, o una lista de enlaces.
Funciona en old.reddit.com (la misma cuenta, con páginas más simples que no cambian). Inicia sesión, abre tus guardados y ejecuta el script.
// Responsive Muse · Reddit Saved Posts Exporter · v1.0 · 2026-10-22
// Saves everything you saved on Reddit (posts and comments) to CSV, Markdown or TXT: subreddit,
// title, author, date, link and the text of saved comments. Reddit's own list stops at about
// 1,000 items, so export it before it fills up. Runs only on old.reddit.com, whose pages stay
// the same for years: it opens your saved list page by page in a hidden frame of the same site,
// like clicking "next" yourself. It makes no network requests of its own and never reads
// cookies, passwords or tokens.
(async () => {
const TOOL = 'Exportar guardados de Reddit';
const FORMAT = 'csv'; // 'csv' (Excel, Sheets), 'md' (Notion, Obsidian) or 'txt' (links only)
if (location.hostname !== 'old.reddit.com' || !/^\/user\/[^/]+\/saved/.test(location.pathname)) {
alert('Abre primero tus guardados en old Reddit (con tu sesión iniciada):\nhttps://old.reddit.com/user/me/saved/');
return;
}
// Must be your own list: old Reddit shows the signed-in user in the header
const me = (document.querySelector('#header .user a[href*="/user/"]')?.textContent || '').trim();
const owner = (location.pathname.split('/')[2] || '').toLowerCase();
if (owner !== me.toLowerCase()) {
alert(me
? `Esta no es tu lista. Abre:\nhttps://old.reddit.com/user/${me}/saved/`
: 'Inicia sesión en old.reddit.com y abre tu propia lista de guardados.');
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 = '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]]);
};
const sleep = ms => new Promise(r => setTimeout(r, ms));
// Load one page of the list in a hidden frame of the same site and wait for it
const loadPage = path => new Promise(resolve => {
const frame = document.createElement('iframe');
frame.style.cssText = 'position:absolute;left:-9999px;width:1000px;height:800px';
const done = doc => { resolve(doc); setTimeout(() => frame.remove(), 0); };
frame.onload = () => done(frame.contentDocument);
setTimeout(() => done(null), 30000);
frame.src = new URL(path, location.origin).href;
document.body.appendChild(frame);
});
// Read the saved items of one page
const items = new Map();
const read = doc => {
for (const t of doc.querySelectorAll('#siteTable > .thing[data-fullname]')) {
const id = t.dataset.fullname;
if (items.has(id)) continue;
const comment = id.startsWith('t1_');
const ts = Number(t.dataset.timestamp);
items.set(id, {
type: comment ? 'comment' : 'post',
subreddit: t.dataset.subredditPrefixed || (t.dataset.subreddit ? 'r/' + t.dataset.subreddit : ''),
title: (t.querySelector('a.title')?.textContent || '').trim(),
author: t.dataset.author || '',
date: ts ? new Date(ts).toISOString().slice(0, 10) : '',
score: t.dataset.score || '',
text: comment ? (t.querySelector('.usertext-body .md')?.innerText || '').trim() : '',
link: t.dataset.url && !t.dataset.url.startsWith('/r/') ? t.dataset.url : '',
permalink: 'https://www.reddit.com' + (t.dataset.permalink || ''),
});
}
return doc.querySelector('.next-button a')?.getAttribute('href') || '';
};
// 1. Page through the whole list
let stop = false;
panel.stoppable(() => { stop = true; });
let next = read(document);
let page = 1;
while (next && !stop) {
panel.text(`Leyendo la página ${++page}… ${many(items.size, 'elemento')} hasta ahora`);
const doc = await loadPage(next);
if (!doc) break;
next = read(doc);
await sleep(1000); // a human pace between pages
}
const list = [...items.values()];
if (!list.length) {
panel.finish('Aún no tienes nada guardado, o Reddit ha cambiado su diseño. Si tienes guardados, avísanos en responsive-muse.com.');
return 0;
}
// 2. Build the file and offer it
const cell = v => '"' + String(v).replace(/"/g, '""') + '"';
const body = FORMAT === 'txt' ? list.map(i => i.permalink).join('\n')
: FORMAT === 'md' ? list.map(i => `- **${i.subreddit}** · ${i.date} · [${(i.title || 'comment').replace(/[[\]]/g, '')}](${i.permalink})` +
(i.link ? ` · [link](${i.link})` : '') + (i.text ? `\n > ${i.text.replace(/\n/g, '\n > ')}` : '')).join('\n')
: ['Tipo,Subreddit,Título,Autor,Fecha,Puntos,Texto del comentario,Enlace,URL de Reddit',
...list.map(i => [i.type, i.subreddit, i.title, i.author, i.date, i.score, i.text, i.link, i.permalink].map(cell).join(','))].join('\n');
deliver(`${stop ? 'Parado antes de terminar. ' : ''}Listo: ${many(list.length, 'elemento guardado')}.`, body, `reddit-saved.${FORMAT}`);
return list.length;
})();
Marcador: arrastra el botón del medio a tu barra de marcadores, abre old.reddit.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 old.reddit.com cargando tu lista.
- No toca tu sesión. No lee cookies, contraseñas, tokens ni el almacenamiento del navegador.
- Solo funciona en old.reddit.com. En cualquier otra web se detiene antes de hacer nada.
- Corto y legible. 148 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:
7169030975cb9f37…
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 old.reddit.com.
Cómo usarlo
- Abre old.reddit.com/user/me/saved con tu sesión iniciada.
- Abre la consola: F12 o Ctrl+Mayús+J (Cmd+Opción+J en Mac). Si Chrome te lo pide, escribe
permitir pegar(oallow pastingsi lo tienes en inglés) y pulsa Enter. - Elige las opciones, copia el script, pégalo en la consola y pulsa Enter. Al terminar aparece un recuadro: pulsa Descargar (o Copiar).
¿Por qué exportarlas?
Reddit solo conserva tus últimos 1.000 elementos guardados y no tiene buscador para ellos. Cuando la lista se llena, los más antiguos desaparecen sin avisar. Con el CSV tienes una copia que puedes ordenar por subreddit o por fecha.
Preguntas frecuentes
¿Por qué old.reddit.com?
Es el mismo Reddit, con la misma cuenta y los mismos guardados, pero sus páginas mantienen la misma estructura desde hace años, así que el script sigue funcionando aunque cambie el diseño nuevo.
¿Hay algún límite?
Reddit solo conserva tus últimos 1.000 elementos guardados. Expórtalos antes de que se llene la lista: los más antiguos desaparecen y no se pueden recuperar.
¿Incluye los comentarios guardados?
Sí. Los comentarios guardados salen con su texto, subreddit, fecha y enlace al hilo.
