Ability to easily remove multiple followers at once

As a Roblox developer it is currently too hard to remove unwanted followers.

The current method used to accomplish this goal is to navigate to the profile of a user following you and block them? Simple, right?

Well, this practice is very time-consuming and unrealistic to be used in application if the user is experiencing a situation in which they desire to remove hundreds or thousands of unwanted followers. In other words, it is too hard for users to remove followers in bulk (multiple at once).

Consider my example which is one experienced by many other users who have undergone manipulation in follower count. For a few years now, I have had over ten thousand bot followers. I do not wish to keep these followers. The accumulated, unrealistic follower statistic that I have misleads users into believing that I have a false number of followers and subsequently damages my reputation as a Roblox developer once they uncover the truth. I am not going to spend hours and/or days blocking these bot followers one by one. Even if I put my head into blocking over ten thousand bots, I would feel immense stress and frustration during the process because of the quota given to block users, which is at 300 blocks per user - meaning, I would constantly have to change those 300 users I have blocked in order to accomplish my goal. This limitation significantly adds time to the blocking process. Furthermore, some Roblox users have even more severe experiences with bots in which they have over hundreds of thousands or millions of bot followers…good luck getting rid of all of them one by one!

Additionally, the current practice cannot be applied to followers who are deleted from the platform. As a Roblox developer, I want to prove to other users visiting my profile that I have an active community following me. Being able to remove deleted followers from my followers list would enable me to achieve this goal.

If this issue were to be addressed, it would improve my UX using the followers feature.

9 Likes

You can try using plugins like RoSeal in the meanwhile to get around this. RoSeal has a multi-select feature for removing followers.


Back to the topic, yes it’s honestly something overlooked by Roblox. This shouldn’t be such a hassle to normal users.

Thank you for the workaround suggestion,

I have a question, how do I multi-select to unfollow using RoSeal?

By default, I have to navigate to the followers page and for each user open up a quick action menu (3 dots) with a Force Unfollow button action.

I would love to instead select a bunch of them to unfollow at once.

I tried to multi-select by pressing down on my keyboard’s CTRL key, opening up multiple quick action menus and selecting to unfollow one of them. Unfortunately, it’ll only unfollow one so it did not go as I expected.

Nonetheless, thank you for your workaround. It has reduced the time to spend on my efforts by a bit, I appreciate it.

Oh, maybe it was because I used a combination of BTRoblox and Roseal to multi-select followers. Sorry for the confusion…

I’m unable to replicate the feature. The correct extension is probably something other than BTRoblox or if it’s one of the two, the correct extension software was updated to no longer support the feature.


EDIT: I don’t think any extension supports such feature at the moment as there is apparently a ratelimit set in place for blocking/unblocking according to a RoSeal dev I was able to get in touch with through Discord.

I have some Python code here given to me by ChatGPT to block and quickly unblock people who follow you. Of course, it had some of the API endpoints wrong, like “users.roblox.com/v1/users/1/block”, which doesn’t exist, but I’ve corrected that. This code allowed me to get rid of all my followers, leaving only my friends.

import requests
import time

# Replace with your actual user ID and authentication cookie value
user_id = 'USERID'
auth_cookie = 'ROBLOSECURITYCOOKIE'

# Set up headers with the authentication cookie
headers = {
    'Cookie': f'.ROBLOSECURITY={auth_cookie}'
}

# Function to get the CSRF token
def get_csrf_token():
    url = 'https://auth.roblox.com/v2/logout'  # A simple endpoint that returns the CSRF token
    response = requests.post(url, headers=headers)
    if response.status_code == 403:
        return response.headers['x-csrf-token']
    else:
        response.raise_for_status()

# Get the CSRF token
csrf_token = get_csrf_token()
headers.update({'x-csrf-token': csrf_token})

# Function to handle API requests with retry mechanism
def api_request(url, method='GET', data=None):
    retries = 10
    backoff = 1
    for attempt in range(retries):
        if method == 'GET':
            response = requests.get(url, headers=headers)
        elif method == 'POST':
            response = requests.post(url, headers=headers, json=data)
        else:
            raise ValueError("Unsupported HTTP method")
        
        if response.status_code == 429:  # Too Many Requests
            print(f"Rate limited. Retrying in {backoff} seconds...")
            time.sleep(backoff)
            backoff *= 2
        elif response.status_code == 400:
            print(f"Rate limited. Retrying in {backoff} seconds...")
            time.sleep(backoff)
            backoff *= 2

        elif response.status_code == 200:
            return response
        elif response.status_code == 403 and 'x-csrf-token' in response.headers:
            # Update CSRF token and retry
            headers['x-csrf-token'] = response.headers['x-csrf-token']
            continue
        else:
            response.raise_for_status()
    raise Exception(f"API request failed after {retries} retries")

# Function to get all followers with pagination
def get_all_followers(user_id):
    followers = []
    cursor = ""
    while True:
        followers_url = f'https://friends.roblox.com/v1/users/{user_id}/followers?limit=100&cursor={cursor}'
        response = api_request(followers_url)
        data = response.json()
        followers.extend(data['data'])
        cursor = data.get('nextPageCursor')
        if not cursor:
            break
    return followers

# Function to get all friends with pagination
def get_all_friends(user_id):
    friends = []
    cursor = ""
    while True:
        friends_url = f'https://friends.roblox.com/v1/users/{user_id}/friends?limit=100&cursor={cursor}'
        response = api_request(friends_url)
        data = response.json()
        friends.extend(data['data'])
        cursor = data.get('nextPageCursor')
        if not cursor:
            break
    return friends

# Get list of all followers and friends
followers = get_all_followers(user_id)
friends = get_all_friends(user_id)
friend_ids = {friend['id'] for friend in friends}

# Block and unblock each follower who is not a friend
block_url = 'https://accountsettings.roblox.com/v1/users/{userId}/block'
unblock_url = 'https://accountsettings.roblox.com/v1/users/{userId}/unblock'

for follower in followers:
    follower_id = follower['id']
    if follower_id not in friend_ids:
        # Block the user
        block_response = api_request(block_url.format(userId=follower_id), method='POST', data={"userId": follower_id})
        print(f'Blocked user {follower_id}')
        
        # Wait for 5 seconds
        time.sleep(5)

        # Unblock the user
        unblock_response = api_request(unblock_url.format(userId=follower_id), method='POST', data={"userId": follower_id})
        print(f'Unblocked user {follower_id}')
    else:
        print(f'Skipped friend {follower_id}')

If you don’t have many followers, you can remove set “time.sleep(5)” to 0, because you won’t have to worry very much about rate-limiting. In my case, however, I had to leave it due to how many followers I had at the time. You can just open up Notepad and save this as “remove_followers.py” or something, and then use “python remove_followers.py” and then you should be good to go.

2 Likes

Vouch, this is an absolutely amazing workaround that you and the AI crafted. I was able to remove 6K followers using this method in just about 8 hours.

At the default time.sleep(5) cooldown,

  • You can remove 12 followers per minute
  • 720 followers per hour
  • 17,280 followers per day
If anybody wants to learn a short tutorial on how to use it on Windows 10 or 11 OS, open the arrow.
  1. Navigate to the “Microsoft Store” through your search bar on your computer’s taskbar.

  2. On the Microsoft Store, search “Python”. Download a version that you desire, I’d suggest a recent version. I went with 3.11

  3. Through the search bar of your computer’s taskbar, open up the “Command Prompt” of your computer. In the Command Prompt, write and enter “pip install requests”.

  4. Through the search bar of your computer’s taskbar, open up the “IDLE (Python yourversion)” but right before you’re about to do it, right click on it and select “Run as administrator”.

  5. On the IDLE, select “File” then “New File”. Copy @Beloathed’s code. and paste it onto the new empty file you just opened. On Beloathed’s code, change where it says USERID to your Roblox userID ( it can be found on the URL of your profile) and change ROBLOSECURITYCOOKIE to the value of your ROBLOSECURITYCOOKIE. A simple way to get the cookie is by downloading the EditThisCookie extension to your web browser and then navigating to your Roblox profile. Once there, click on the extension and copy the value of the cookie, beginning after the underscore (_) at the end of the security warning and just paste it onto where you have to paste it.

  6. Once you have finished adjusting those two areas of Beloathed’s code on the IDLE, select, “File” then “Save As” and give the code file a name of your choice.

  7. Once you have saved the file, open the file on the IDLE and click “Run” and in a few moments, the IDLE will begin printing “Blocked user” and “Unblocked user” messages in blue.

This is how the code and the output window should look like after a few moments running the code. Because the ROBLOSECURITYCOOKIE is so long in length, you’ll just see the cookie value after pasting it into the code. I named my code file “test.py”. So, what you’re seeing should look like the screenshot below:

Sometimes, after a short or long while of running the code, you hit a ratelimit. An easy workaround is to stop the code from running (kill it) and clear your web browser cache and cookies. Then update the ROBLOSECURITYCOOKIE in the code and run the code again.

Once again thank you for this, you really cooked! :fire:


EDIT: About a day after writing this reply, I brought my follower count to where I wanted it to be, from 16K+ to 1. Once again thank you! I cannot wait to start fresh on followers!

Although the workaround has no limitation other than the 5 second delay per block, I can see it being widely used in application by those who have n<100K+ followers. So, once again, amazing workaround and I can definitely see the workaround being used by those who don’t have an absurdly high number of followers.

1 Like

Thank you so much for this amazing tool! I’ve been searching for an efficient way to do this for a year!

I asked ChatGPT to edit the script to remove likely bot accounts (uses 0 followers and 0 friends as a benchmark).

import requests
import time

# Replace with your actual user ID and authentication cookie value
user_id = 'USERID'
auth_cookie = 'ROBLOSECURITYCOOKIE'

# Set up headers with the authentication cookie
headers = {
    'Cookie': f'.ROBLOSECURITY={auth_cookie}'
}

# Function to get the CSRF token
def get_csrf_token():
    url = 'https://auth.roblox.com/v2/logout'  # A simple endpoint that returns the CSRF token
    response = requests.post(url, headers=headers)
    if response.status_code == 403:
        return response.headers['x-csrf-token']
    else:
        response.raise_for_status()

# Get the CSRF token
csrf_token = get_csrf_token()
headers.update({'x-csrf-token': csrf_token})

# Function to handle API requests with retry mechanism and improved logging
def api_request(url, method='GET', data=None):
    retries = 10
    backoff = 1
    for attempt in range(retries):
        try:
            if method == 'GET':
                response = requests.get(url, headers=headers)
            elif method == 'POST':
                response = requests.post(url, headers=headers, json=data)
            else:
                raise ValueError("Unsupported HTTP method")
            
            if response.status_code == 429:
                print(f"Rate limit exceeded. Retrying in {backoff} seconds...")
                time.sleep(backoff)
                backoff *= 2
            elif response.status_code == 500:
                print(f"Server error (500). Retrying in {backoff} seconds...")
                time.sleep(backoff)
                backoff *= 2
            elif response.status_code == 200:
                return response
            elif response.status_code == 403 and 'x-csrf-token' in response.headers:
                headers['x-csrf-token'] = response.headers['x-csrf-token']
                continue
            else:
                response.raise_for_status()
        
        except requests.RequestException as e:
            print(f"Request failed: {e}. Retrying in {backoff} seconds...")
            time.sleep(backoff)
            backoff *= 2
    
    raise Exception(f"API request failed after {retries} retries")

# Function to get all followers with pagination
def get_all_followers(user_id):
    followers = []
    cursor = ""
    while True:
        followers_url = f'https://friends.roblox.com/v1/users/{user_id}/followers?limit=100&cursor={cursor}'
        response = api_request(followers_url)
        data = response.json()
        followers.extend(data['data'])
        cursor = data.get('nextPageCursor')
        if not cursor:
            break
    return followers

# Function to get all friends with pagination
def get_all_friends(user_id):
    friends = []
    cursor = ""
    while True:
        friends_url = f'https://friends.roblox.com/v1/users/{user_id}/friends?limit=100&cursor={cursor}'
        response = api_request(friends_url)
        data = response.json()
        friends.extend(data['data'])
        cursor = data.get('nextPageCursor')
        if not cursor:
            break
    return friends

# Function to check if a user is a bot
def is_bot(follower_id):
    url = f'https://friends.roblox.com/v1/users/{follower_id}/followers/count'
    followers_response = api_request(url)
    followers_count = followers_response.json().get('count', 0)

    url = f'https://friends.roblox.com/v1/users/{follower_id}/friends/count'
    friends_response = api_request(url)
    friends_count = friends_response.json().get('count', 0)

    return followers_count == 0 and friends_count == 0

# Get list of all followers and friends
followers = get_all_followers(user_id)
friends = get_all_friends(user_id)
friend_ids = {friend['id'] for friend in friends}

# Block and unblock each follower who is not a friend and is a bot
block_url = 'https://accountsettings.roblox.com/v1/users/{userId}/block'
unblock_url = 'https://accountsettings.roblox.com/v1/users/{userId}/unblock'

for follower in followers:
    follower_id = follower['id']
    if follower_id not in friend_ids:
        if is_bot(follower_id):
            # Block the user
            block_response = api_request(block_url.format(userId=follower_id), method='POST', data={"userId": follower_id})
            print(f'Blocked bot user {follower_id}')
            
            # Wait for 5 seconds
            time.sleep(5)

            # Unblock the user
            unblock_response = api_request(unblock_url.format(userId=follower_id), method='POST', data={"userId": follower_id})
            print(f'Unblocked bot user {follower_id}')
        else:
            print(f'Skipped non-bot follower {follower_id}')
    else:
        print(f'Skipped friend {follower_id}')