카카오스토리 완전백업

카카오스토리 완전백업

우선 설정에 들어가서 아카이브를 다운로드해둔다. 그렇게 해야지만 사진이 백업된다.

그 다음 다음 코드를 콘솔에서 구동한다. 자동으로 맨 아래까지 스크롤해준다.

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