Facebook Activity Auto Deleter (2025)

Automatically deletes Facebook activity log entries, confirms popups, and scrolls to load more. Now with pause toggle, stuck-check, and entry skip logic.

当前为 2025-04-06 提交的版本,查看 最新版本

// ==UserScript==
// @name         Facebook Activity Auto Deleter (2025)
// @namespace    https://gf.qytechs.cn/en/users/1454546-shawnfrost13
// @version      3.93
// @description  Automatically deletes Facebook activity log entries, confirms popups, and scrolls to load more. Now with pause toggle, stuck-check, and entry skip logic.
// @author       shawnfrost13
// @license      MIT
// @match        https://www.facebook.com/*/allactivity*
// @grant        none
// @run-at       document-end
// @note         Starts paused. Toggle via the GUI. Skips stuck or undeletable entries.
// ==/UserScript==

(function () {
  'use strict';

  console.log("🔥 FB Auto Deleter v3.93 loaded");

  let deletionCount = 0;
  let paused = true;
  let failedElements = new WeakSet();
  let lastProcessedText = "";
  let skipCurrent = false;

  function getRandomDelay(min = 1100, max = 2100) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  function logStatus(text) {
    let el = document.getElementById('fb-auto-delete-status');
    if (!el) {
      el = document.createElement('div');
      el.id = 'fb-auto-delete-status';
      el.style.position = 'fixed';
      el.style.bottom = '50px';
      el.style.right = '10px';
      el.style.background = '#111';
      el.style.color = 'lime';
      el.style.padding = '10px';
      el.style.borderRadius = '10px';
      el.style.fontFamily = 'monospace';
      el.style.zIndex = '9999';
      document.body.appendChild(el);
    }
    el.textContent = `🧹 ${text}`;
  }

  function createToggleButton() {
    const toggle = document.createElement('button');
    toggle.textContent = '▶️ Start Auto Deleter';
    toggle.style.position = 'fixed';
    toggle.style.bottom = '100px';
    toggle.style.right = '10px';
    toggle.style.padding = '8px 12px';
    toggle.style.borderRadius = '10px';
    toggle.style.background = '#333';
    toggle.style.color = '#fff';
    toggle.style.border = 'none';
    toggle.style.cursor = 'pointer';
    toggle.style.fontFamily = 'monospace';
    toggle.style.zIndex = '10000';
    toggle.addEventListener('click', () => {
      paused = !paused;
      toggle.textContent = paused ? '▶️ Start Auto Deleter' : '⏸️ Pause Auto Deleter';
      logStatus(paused ? 'Script paused.' : 'Script running...');
      if (!paused) deleteNext();
    });
    document.body.appendChild(toggle);
  }

  function findMenuButtons() {
    return Array.from(document.querySelectorAll('[role="button"]')).filter(btn => {
      const label = btn.getAttribute('aria-label') || '';
      return (
        btn.offsetParent !== null &&
        (label.toLowerCase().includes("activity options") ||
          label.toLowerCase().includes("action options"))
      );
    });
  }

  function autoConfirmPopups() {
    const dialogs = Array.from(document.querySelectorAll('[role="dialog"], [role="alertdialog"]'));
    dialogs.forEach(dialog => {
      const deleteBtn = Array.from(dialog.querySelectorAll('div[role="button"], button')).find(btn =>
        btn.offsetParent !== null &&
        btn.innerText.trim().toLowerCase() === "delete"
      );
      if (deleteBtn) {
        console.log("✅ Auto-confirming DELETE dialog");
        deleteBtn.click();
        logStatus("Auto-confirmed delete popup");
      }
    });
  }

  function autoScrollAndRetry() {
    console.log("🔄 Scrolling to load more activity...");
    logStatus("Scrolling to load more items...");
    window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
    setTimeout(deleteNext, 2500);
  }

  function deleteNext() {
    if (paused) return;

    autoConfirmPopups();

    const buttons = findMenuButtons();

    if (buttons.length === 0) {
      logStatus('No deletable buttons found. Trying to scroll...');
      autoScrollAndRetry();
      return;
    }

    const btn = buttons.find(b => !failedElements.has(b));
    if (!btn) {
      logStatus('All found buttons failed before. Scrolling...');
      autoScrollAndRetry();
      return;
    }

    const entryText = btn.closest('[role="article"]')?.innerText || "";
    if (entryText === lastProcessedText) {
      console.log("⚠️ Repeating same item — marking as failed");
      failedElements.add(btn);
      lastProcessedText = "";
      setTimeout(deleteNext, getRandomDelay());
      return;
    }

    lastProcessedText = entryText;

    btn.scrollIntoView({ behavior: 'smooth', block: 'center' });
    btn.click();
    logStatus(`Opened menu for item #${deletionCount + 1}`);
    console.log(`📂 Opened menu for item #${deletionCount + 1}`);

    setTimeout(() => {
      const menuItems = Array.from(document.querySelectorAll('[role="menuitem"]'));
      const deleteOption = menuItems.find(el =>
        el.innerText.includes("Move to Recycle bin") ||
        el.innerText.includes("Delete") ||
        el.innerText.includes("Remove") ||
        el.innerText.includes("Unlike") ||
        el.innerText.includes("Remove reaction") ||
        el.innerText.includes("Remove tag")
      );

      if (deleteOption) {
        deleteOption.click();
        deletionCount++;
        logStatus(`Deleted item #${deletionCount}`);
        console.log(`🗑️ Deleted item #${deletionCount}`);
        setTimeout(deleteNext, getRandomDelay());
      } else {
        failedElements.add(btn);
        logStatus(`No delete option found. Skipping...`);
        console.log("⚠️ No delete/remove option found. Skipping...");
        setTimeout(deleteNext, getRandomDelay());
      }
    }, 1500);
  }

  setTimeout(() => {
    createToggleButton();
    setInterval(autoConfirmPopups, 1000);
    logStatus("Script loaded. Use toggle to start.");
  }, 2000);
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址