Facebook Activity Auto Deleter (2025)

Automatically deletes Facebook activity log entries, confirms popups, and scrolls to load more. Now with pause/start toggle, error handling, and skip logic.

目前為 2025-04-06 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Facebook Activity Auto Deleter (2025)
// @namespace    https://gf.qytechs.cn/en/users/1454546-shawnfrost13
// @version      3.96
// @description  Automatically deletes Facebook activity log entries, confirms popups, and scrolls to load more. Now with pause/start toggle, error handling, and skip logic.
// @author       shawnfrost13
// @license      MIT
// @match        https://www.facebook.com/*/allactivity*
// @grant        none
// @run-at       document-end
// ==/UserScript==

(function () {
  'use strict';

  let deletionCount = 0;
  let paused = true;
  let skipIndex = 0;

  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 = '40px';
      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 createToggle() {
    const toggle = document.createElement('button');
    toggle.id = 'fb-toggle-btn';
    toggle.textContent = '▶ Start';
    toggle.style.position = 'fixed';
    toggle.style.bottom = '80px';
    toggle.style.right = '10px';
    toggle.style.padding = '10px 15px';
    toggle.style.borderRadius = '10px';
    toggle.style.background = '#333';
    toggle.style.color = 'white';
    toggle.style.border = '1px solid lime';
    toggle.style.zIndex = 9999;
    toggle.style.fontFamily = 'monospace';
    toggle.style.cursor = 'pointer';
    toggle.onclick = function () {
      paused = !paused;
      toggle.textContent = paused ? '▶ Start' : '⏸ Pause';
      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");
      }
    });

    // Close error popup if present
    const errorPopup = Array.from(document.querySelectorAll('[role="alert"]')).find(el =>
      el.textContent.includes("Something went wrong")
    );
    if (errorPopup) {
      console.warn("⚠️ Detected error popup, skipping...");
      const closeBtn = errorPopup.querySelector('[aria-label="Close"]');
      if (closeBtn) closeBtn.click();
    }
  }

  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 || skipIndex >= buttons.length) {
      skipIndex = 0;
      logStatus('No deletable buttons found or end reached. Trying to scroll...');
      autoScrollAndRetry();
      return;
    }

    const btn = buttons[skipIndex];
    btn.scrollIntoView({ behavior: 'smooth', block: 'center' });

    try {
      btn.click();
      logStatus(`Opened menu for item #${deletionCount + 1}`);
      console.log(`📂 Opened menu for item #${deletionCount + 1}`);
    } catch (e) {
      console.warn("⚠️ Failed to click button. Skipping...");
      skipIndex++;
      setTimeout(deleteNext, getRandomDelay());
      return;
    }

    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++;
        skipIndex = 0; // Reset if successful
        logStatus(`Deleted item #${deletionCount}`);
        console.log(`🗑️ Deleted item #${deletionCount}`);
        setTimeout(deleteNext, getRandomDelay());
      } else {
        logStatus(`No delete option. Skipping.`);
        console.log("⚠️ No delete/remove option found. Skipping...");
        skipIndex++;
        setTimeout(deleteNext, getRandomDelay());
      }
    }, 1500);
  }

  setTimeout(() => {
    createToggle();
    logStatus("Ready and paused.");
    setInterval(autoConfirmPopups, 1000);
  }, 2000);
})();

QingJ © 2025

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