카카오스토리 완전백업
Warning
This post is more than a year old. Information may be outdated.
우선 설정에 들어가서 아카이브를 다운로드해둔다. 그렇게 해야지만 사진이 백업된다.
그 다음 다음 코드를 콘솔에서 구동한다. 자동으로 맨 아래까지 스크롤해준다.
js
function scrollToBottomOfInfiniteScroll() { let lastHeight = 0; let timer = setInterval(() => { window.scrollTo(0, document.documentElement.scrollHeight);
let currentHeight = document.documentElement.scrollHeight; if (currentHeight === lastHeight) { clearInterval(timer); console.log("Reached the bottom or new content is not loading."); } else { lastHeight = currentHeight; } }, 2000); // 2000 milliseconds (or 2 seconds) between each scroll attempt}
scrollToBottomOfInfiniteScroll();그 다음 이를 실행한다.
js
async function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms));}
async function clickAndWaitForFeed(elementToClick) { return new Promise((resolve) => { const feedObserver = new MutationObserver((mutations, observer) => { for (let mutation of mutations) { if (mutation.type === "childList" && document.querySelector(".feed")) { observer.disconnect(); resolve(); } } });
feedObserver.observe(document.body, { childList: true, subtree: true });
elementToClick.click(); });}
async function downloadTextContent(filename, content) { const blob = new Blob([content], { type: "text/plain" }); const url = URL.createObjectURL(blob);
const a = document.createElement("a"); a.href = url; a.download = filename; a.style.display = "none"; document.body.appendChild(a);
a.click();
URL.revokeObjectURL(url); document.body.removeChild(a);}
async function waitForElement(selector) { return new Promise((resolve) => { const element = document.querySelector(selector); if (element) { resolve(element); return; }
const observer = new MutationObserver((mutations, observerInstance) => { const foundElement = document.querySelector(selector); if (foundElement) { observerInstance.disconnect(); resolve(foundElement); } });
observer.observe(document.body, { childList: true, subtree: true }); });}
async function processActivity(activity) { const linkPost = activity.querySelector("._linkPost"); if (!linkPost) return;
await clickAndWaitForFeed(linkPost); await delay(5000); // Adjusted delay to 5 seconds
const cover = await waitForElement("#cover");
const btnShowFirstComment = cover.querySelector("._btnShowFirstComment"); btnShowFirstComment?.click();
await delay(5000); // Adjusted delay to 5 seconds
const timeValue = cover.querySelector(".time").innerText; downloadTextContent(`${timeValue}.txt`, cover.innerText);}
async function main() { const activities = document.querySelectorAll("._activity"); for (let activity of activities) { await processActivity(activity); }}
main();Backlinks1
230905Comments