카카오스토리 완전백업
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
230905