Block scammer accounts on X from the X scammer blacklist service.
- macOS
- Google Chrome
- Node.js
- Chrome is logged in to the X account that should block scammers
The script only supports macOS + Chrome because it reads Chrome cookies from the macOS keychain and Chrome profile database.
node scripts/block-scammers.mjsThe default run is intentionally conservative:
- fetches up to 100 user ids per batch
- waits 1500 ms between block requests
- prints compact progress every 25 handled accounts
- stops immediately if X returns a rate limit response
- advances the cursor after each blocked or already-gone account
The blacklist endpoint accepts after=<user_id>. The script automatically stores the last handled user_id in:
~/.x-reply-cleaner.cursor
On the next run, the saved value is sent as after, so the blacklist service can continue after the previous run's last handled account and avoid repeat work.
The cursor advances after each account that is blocked or already gone from X. If a block request fails with a real blocker, such as rate limiting or an unexpected API error, the run stops and saves the cursor at the last account that was actually handled. The failed account is retried by a later run.
404 User not found from X is treated as resolved and counted as skipped_not_found, because there is no remaining account to block.
Useful cursor options:
node scripts/block-scammers.mjs --cursor-file ~/.x-reply-cleaner.cursor
node scripts/block-scammers.mjs --no-cursorRecommended: run it once per day with a scheduled task.
For scheduled or long-running use, enable persisted cookies:
node scripts/block-scammers.mjs --persist-cookieThis reads X_COOKIE from ~/.x-reply-cleaner.env. If the file does not exist, or if the saved cookie is malformed or rejected by X, the script refreshes the cookie from Chrome and writes the file again with restricted permissions.
Example cron entry for running once per day at 03:15:
15 3 * * * cd /path/to/x-reply-clean-skill && /usr/local/bin/node scripts/block-scammers.mjs --persist-cookie >> "$HOME/Library/Logs/x-reply-cleaner.log" 2>&1Use the actual absolute paths for this skill directory and your Node binary.
This script is intentionally slow. It blocks accounts one by one and waits between requests so it is gentler on X. The default delay is 1500 ms per account, and X network latency can add more time.
Adjust the delay only when needed:
node scripts/block-scammers.mjs --persist-cookie --delay-ms 3000For a longer unattended run, process multiple batches and pause between them:
node scripts/block-scammers.mjs --persist-cookie --max-batches 5 --batch-sleep-ms 300000If X returns 429 Rate limit exceeded, the script stops immediately and prints a suggested slower retry command.
node scripts/block-scammers.mjs --helpUseful options:
--api <url>: blacklist endpoint URL.--limit <n>: passlimit=<n>to the blacklist endpoint per batch, default 100.--chrome-profile <dir>: Chrome profile directory, defaultDefault.--persist-cookie: read/write~/.x-reply-cleaner.env; recommended for scheduled runs.--cursor-file <path>: read/write the savedaftercursor, default~/.x-reply-cleaner.cursor.--no-cursor: do not read, pass, or update the saved cursor.--dry-run: preview accounts without blocking.--delay-ms <ms>: delay between X block requests, default 1500.--max-batches <n>: fetch and process up tonbatches in one run, default 1.--batch-sleep-ms <ms>: delay between batches.--verbose: print one line per account.