🔍 Filter Manager

Safety & Privacy scripts/twitter
v1.0.0 Updated: 2026-01-26 394 lines by @nichxbt

Configure filters for XActions automation

How to Use

  1. Open any X page
  2. Open Chrome DevTools (F12)
  3. Paste this script and press Enter
  4. Configure filters with XActions.Filters

Full Script

Copy and paste this entire script into your browser DevTools console on x.com.

/**
 * ============================================================
 * ⚙️ Filter Manager
 * ============================================================
 * 
 * @name        filter-manager.js
 * @description Configure filters for XActions automation
 * @author      nichxbt (https://x.com/nichxbt)
 * @version     1.0.0
 * @date        2026-01-26
 * @repository  https://github.com/nirholas/XActions
 * 
 * ============================================================
 * 📋 FEATURES:
 * ============================================================
 * 
 * • Follower count filters (min/max)
 * • Account age filters
 * • Language filters
 * • Bio keyword filters
 * • Verified account handling
 * • Default profile pic detection
 * • Tweet count filters
 * 
 * ============================================================
 * 📋 USAGE INSTRUCTIONS:
 * ============================================================
 * 
 * 1. Open any X page
 * 2. Open Chrome DevTools (F12)
 * 3. Paste this script and press Enter
 * 4. Configure filters with XActions.Filters
 * 
 * ============================================================
 */

/**
 * ============================================================
 * 🚀 SCRIPT START - by nichxbt
 * ============================================================
 */

(function filterManager() {
  console.log('╔════════════════════════════════════════════════════════════╗');
  console.log('║  ⚙️ FILTER MANAGER                                         ║');
  console.log('║  by nichxbt - https://github.com/nirholas/XActions         ║');
  console.log('╚════════════════════════════════════════════════════════════╝');
  console.log('');
  
  const STORAGE_KEY = 'xactions_filters';
  
  // Default filter configuration
  const defaultFilters = {
    // Follower counts
    followers: {
      min: 0,
      max: Infinity,
      enabled: false
    },
    
    // Following counts
    following: {
      min: 0,
      max: Infinity,
      enabled: false
    },
    
    // Follower/Following ratio
    ratio: {
      min: 0,      // Minimum followers/following ratio
      max: Infinity,
      enabled: false
    },
    
    // Tweet count
    tweets: {
      min: 1,
      max: Infinity,
      enabled: false
    },
    
    // Account age (days)
    accountAge: {
      min: 30,    // At least 30 days old
      enabled: false
    },
    
    // Bio requirements
    bio: {
      required: false,           // Must have bio
      keywords: [],              // Must contain these words
      excludeKeywords: [],       // Must NOT contain these
      minLength: 0,
      enabled: false
    },
    
    // Profile picture
    profilePic: {
      required: false,           // Must have profile pic (not default)
      enabled: false
    },
    
    // Language
    language: {
      allowed: [],               // Empty = all languages
      enabled: false
    },
    
    // Verified status
    verified: {
      skip: false,               // Skip verified accounts
      only: false,               // Only verified accounts
      enabled: false
    },
    
    // Activity
    activity: {
      lastTweetDays: 30,         // Must have tweeted in last X days
      enabled: false
    },
    
    // Spam detection
    spam: {
      skipNoTweets: true,
      skipSuspicious: true,      // Suspicious follower/following ratio
      skipBotPatterns: true,     // Username looks like bot
      enabled: true
    }
  };
  
  // Storage helpers
  const getFilters = () => {
    try {
      const data = localStorage.getItem(STORAGE_KEY);
      return data ? { ...defaultFilters, ...JSON.parse(data) } : { ...defaultFilters };
    } catch {
      return { ...defaultFilters };
    }
  };
  
  const saveFilters = (filters) => {
    localStorage.setItem(STORAGE_KEY, JSON.stringify(filters));
  };
  
  // Create XActions interface
  window.XActions = window.XActions || {};
  window.XActions.Filters = {
    
    // Get current filters
    get: () => getFilters(),
    
    // Set a specific filter
    set: (category, key, value) => {
      const filters = getFilters();
      if (filters[category]) {
        filters[category][key] = value;
        saveFilters(filters);
        console.log(`✅ Set ${category}.${key} = ${value}`);
      } else {
        console.error(`❌ Unknown filter category: ${category}`);
      }
    },
    
    // Enable a filter category
    enable: (category) => {
      const filters = getFilters();
      if (filters[category]) {
        filters[category].enabled = true;
        saveFilters(filters);
        console.log(`✅ Enabled ${category} filter`);
      }
    },
    
    // Disable a filter category
    disable: (category) => {
      const filters = getFilters();
      if (filters[category]) {
        filters[category].enabled = false;
        saveFilters(filters);
        console.log(`✅ Disabled ${category} filter`);
      }
    },
    
    // Quick presets
    presets: {
      // Quality followers (engaged users)
      quality: () => {
        const filters = getFilters();
        filters.followers.min = 100;
        filters.followers.max = 50000;
        filters.followers.enabled = true;
        filters.tweets.min = 10;
        filters.tweets.enabled = true;
        filters.bio.required = true;
        filters.bio.enabled = true;
        filters.profilePic.required = true;
        filters.profilePic.enabled = true;
        filters.accountAge.min = 90;
        filters.accountAge.enabled = true;
        saveFilters(filters);
        console.log('✅ Applied QUALITY preset');
      },
      
      // Influencers (high follower counts)
      influencers: () => {
        const filters = getFilters();
        filters.followers.min = 10000;
        filters.followers.max = Infinity;
        filters.followers.enabled = true;
        filters.verified.only = false;
        filters.verified.enabled = false;
        saveFilters(filters);
        console.log('✅ Applied INFLUENCERS preset');
      },
      
      // Small accounts (easier to engage)
      small: () => {
        const filters = getFilters();
        filters.followers.min = 50;
        filters.followers.max = 5000;
        filters.followers.enabled = true;
        filters.activity.lastTweetDays = 7;
        filters.activity.enabled = true;
        saveFilters(filters);
        console.log('✅ Applied SMALL ACCOUNTS preset');
      },
      
      // Anti-spam
      antiSpam: () => {
        const filters = getFilters();
        filters.spam.skipNoTweets = true;
        filters.spam.skipSuspicious = true;
        filters.spam.skipBotPatterns = true;
        filters.spam.enabled = true;
        filters.tweets.min = 5;
        filters.tweets.enabled = true;
        filters.profilePic.required = true;
        filters.profilePic.enabled = true;
        saveFilters(filters);
        console.log('✅ Applied ANTI-SPAM preset');
      },
      
      // No filters
      none: () => {
        saveFilters(defaultFilters);
        console.log('✅ Reset to default (no filters)');
      }
    },
    
    // Check if user passes all filters (helper for other scripts)
    check: (userData) => {
      const filters = getFilters();
      const failures = [];
      
      // Followers
      if (filters.followers.enabled) {
        if (userData.followers < filters.followers.min) {
          failures.push(`followers < ${filters.followers.min}`);
        }
        if (userData.followers > filters.followers.max) {
          failures.push(`followers > ${filters.followers.max}`);
        }
      }
      
      // Following
      if (filters.following.enabled) {
        if (userData.following < filters.following.min) {
          failures.push(`following < ${filters.following.min}`);
        }
        if (userData.following > filters.following.max) {
          failures.push(`following > ${filters.following.max}`);
        }
      }
      
      // Tweets
      if (filters.tweets.enabled) {
        if (userData.tweets < filters.tweets.min) {
          failures.push(`tweets < ${filters.tweets.min}`);
        }
      }
      
      // Bio
      if (filters.bio.enabled && filters.bio.required && !userData.bio) {
        failures.push('no bio');
      }
      
      // Profile pic
      if (filters.profilePic.enabled && filters.profilePic.required && !userData.hasProfilePic) {
        failures.push('no profile pic');
      }
      
      // Verified
      if (filters.verified.enabled) {
        if (filters.verified.skip && userData.isVerified) {
          failures.push('is verified');
        }
        if (filters.verified.only && !userData.isVerified) {
          failures.push('not verified');
        }
      }
      
      return {
        passes: failures.length === 0,
        failures
      };
    },
    
    // Show current configuration
    show: () => {
      const filters = getFilters();
      console.log('');
      console.log('═'.repeat(50));
      console.log('⚙️ CURRENT FILTER CONFIGURATION');
      console.log('═'.repeat(50));
      
      Object.entries(filters).forEach(([category, settings]) => {
        const status = settings.enabled ? '✅' : '⭕';
        console.log(`${status} ${category}:`);
        Object.entries(settings).forEach(([key, value]) => {
          if (key !== 'enabled') {
            console.log(`   ${key}: ${JSON.stringify(value)}`);
          }
        });
      });
      
      console.log('═'.repeat(50));
      console.log('');
    },
    
    // Reset to defaults
    reset: () => {
      if (confirm('⚠️ Reset all filters to defaults?')) {
        saveFilters(defaultFilters);
        console.log('✅ Filters reset to defaults.');
      }
    },
    
    // Export
    export: () => {
      const filters = getFilters();
      const json = JSON.stringify(filters, null, 2);
      console.log('📋 Filter config (copy this):');
      console.log(json);
      navigator.clipboard?.writeText(json);
      console.log('✅ Copied to clipboard!');
    },
    
    // Import
    import: (jsonString) => {
      try {
        const imported = typeof jsonString === 'string' ? JSON.parse(jsonString) : jsonString;
        const merged = { ...getFilters(), ...imported };
        saveFilters(merged);
        console.log('✅ Filters imported.');
      } catch (e) {
        console.error('❌ Invalid JSON:', e.message);
      }
    },
    
    // Help
    help: () => {
      console.log('');
      console.log('📋 FILTER MANAGER COMMANDS:');
      console.log('');
      console.log('   XActions.Filters.show()           - Show current config');
      console.log('   XActions.Filters.get()            - Get filters object');
      console.log('   XActions.Filters.set(cat,key,val) - Set specific filter');
      console.log('   XActions.Filters.enable("bio")    - Enable filter');
      console.log('   XActions.Filters.disable("bio")   - Disable filter');
      console.log('');
      console.log('📦 PRESETS:');
      console.log('   XActions.Filters.presets.quality()');
      console.log('   XActions.Filters.presets.influencers()');
      console.log('   XActions.Filters.presets.small()');
      console.log('   XActions.Filters.presets.antiSpam()');
      console.log('   XActions.Filters.presets.none()');
      console.log('');
      console.log('📤 EXPORT/IMPORT:');
      console.log('   XActions.Filters.export()');
      console.log('   XActions.Filters.import(json)');
      console.log('   XActions.Filters.reset()');
      console.log('');
    }
  };
  
  const filters = getFilters();
  const enabledCount = Object.values(filters).filter(f => f.enabled).length;
  
  console.log(`⚙️ Filter Manager loaded! (${enabledCount} filters enabled)`);
  console.log('   Run XActions.Filters.help() for commands.');
  console.log('   Run XActions.Filters.show() to see current config.');
  console.log('');
})();

⚡ More XActions Scripts

Browse 300+ free browser scripts for X/Twitter automation. No API keys, no fees.

Browse All Scripts