Skip to content

Instantly share code, notes, and snippets.

@chaodonghu
Last active July 2, 2024 02:20
Show Gist options
  • Save chaodonghu/c942b6ca8f8c247ccacd3b0123ff3580 to your computer and use it in GitHub Desktop.
Save chaodonghu/c942b6ca8f8c247ccacd3b0123ff3580 to your computer and use it in GitHub Desktop.
Google Chrome script that allows user to mass unfollow instagram users on user's profile
// Run GOOGLE CHROME - WORKING AS OF DEC 26 2023
// Please @ me in the comments if this stops working, I will try to get it working again within the month
// INSTRUCTIONS
// 1. Open Instagram in Chrome
// 2. Click on "FOLLOWING" on your Instagram profile
// 3. Open developer tools by right clicking on the page and clicking "INSPECT"
// 4. Copy the code below and paste in the developer tools console and press enter to run
// 5. Script will not run if tab is navigated away from, minimized of unfocused (It is recommended to open a new chrome window or push tab to the side and let script run in background)
const unfollowEveryone = (async () => {
// Modify these variables to your liking
const UNFOLLOW_LIMIT = 800;
const BREAK_DURATION = 5 * 60 * 1000; // 5 minutes break
const TOTAL_DURATION = 10 * 60 * 1000; // 10 minutes duration - Timeout after 10 minutes
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
// Find target button
const findButton = (txt) =>
[...document.querySelectorAll("button").entries()]
.map(([pos, btn]) => btn)
.filter((btn) => btn.innerText === txt)[0];
console.log("Start unfollowing script...");
let startTime = new Date().getTime();
while (new Date().getTime() - startTime < TOTAL_DURATION) {
for (let i = 0; i < UNFOLLOW_LIMIT; i++) {
const followingButton = findButton("Following");
if (!followingButton) {
continue;
}
followingButton.scrollIntoViewIfNeeded();
followingButton.click();
await delay(100);
const confirmUnfollowButton = findButton("Unfollow");
if (confirmUnfollowButton) {
await confirmUnfollowButton.click(); // Wait for the unfollow to complete
}
// Increase UNFOLLOW_INTERVAL if you are getting rate limited
// Set this to 0 unfollow as quickly as possible - not recommended
// Random unfollow interval for each follow to avoid rate limiting
const UNFOLLOW_INTERVAL = Math.floor(Math.random() * 10 + 1) * 5000;
console.log(`Wait ${UNFOLLOW_INTERVAL} milliseconds`);
await delay(UNFOLLOW_INTERVAL);
console.log(`Unfollowed #${i}`);
}
console.log(`Taking a break for ${BREAK_DURATION / 1000} seconds...`);
await delay(BREAK_DURATION); // Take a break to avoid rate limiting
startTime = new Date().getTime(); // Reset start time for the next cycle
}
console.log("Unfollow script complete!");
})();
@chaodonghu
Copy link
Author

This script should be working as of Dec 26 2023. Thanks @DimVat1 for that piece of code, i've added a wait interval and log to your code and added some comments/instructions for users.

Hope this helps!

@superbarney
Copy link

The script works but only for the 20 or so accounts displayed. It is not able to load more accounts after that. A manual reload of the page is required to refresh the list of accounts.

@chaodonghu
Copy link
Author

The script works but only for the 20 or so accounts displayed. It is not able to load more accounts after that. A manual reload of the page is required to refresh the list of accounts.

@superbarney There is a TOTAL_DURATION on line 18 that defines how long the script runs, by default I have it set at 10 minutes so the script will only run for 10 minutes. This in combination with the UNFOLLOW_INTERVAL on line 48 which is by default a multiple of 5 seconds. Either increase the TOTAL_DURATION or decrease the UNFOLLOW_INTERVAL or play with the UNFOLLOW_LIMIT and BREAK_DURATION constants.

I've confirmed it to be still working as intended, a manual reload of the page isn't needed -> https://cdn.zappy.app/883b402c34b4343d3280c20730ee36fa.mp4

@chaodonghu
Copy link
Author

@Alaryne Yes both the "Following" modal and the "Followers" modal should work with this script if you're on an account page that is not yours.

If you mean removing followers that follow your account, I haven't tried it but you can modify line 33 and line 40 to find the "Remove" button instead.

@superbarney
Copy link

@superbarney There is a TOTAL_DURATION on line 18 that defines how long the script runs, by default I have it set at 10 minutes so the script will only run for 10 minutes. This in combination with the UNFOLLOW_INTERVAL on line 48 which is by default a multiple of 5 seconds. Either increase the TOTAL_DURATION or decrease the UNFOLLOW_INTERVAL or play with the UNFOLLOW_LIMIT and BREAK_DURATION constants.

I've confirmed it to be still working as intended, a manual reload of the page isn't needed -> https://cdn.zappy.app/883b402c34b4343d3280c20730ee36fa.mp4

Thanks. I tried again and it did work as intended, although strangely, not consistently. Sometimes, it reaches a point and displays the message "Waiting 300 seconds ..." and it resumes after a period of time, but many times, it hangs at that stage.

I have managed to unfollow close to 3000 accounts with the script but had to do it over the course of about a week. To others seeking to do the same, I'd be patient and not mess with the default values as you will hit the rate limit much faster and be locked out from further reducing followers.

@chaodonghu Thanks for the script, much appreciated.

@isalmanhaider
Copy link

I can verify that the code operates as intended, but it encounters timeouts. Below is an enhanced version of the code, with a particular focus on respecting Instagram's rate limits—both unofficial and official—to mitigate spam and abuse, and improving error handling.

(async function () {
    const UNFOLLOW_LIMIT = 200; // Reduced to stay under potential rate limits
    const UNFOLLOW_INTERVAL = 5000; // Increased interval to be more respectful of rate limits
    const BREAK_DURATION = 5 * 60 * 1000; // 5 minutes break
    const TOTAL_DURATION = 10 * 60 * 1000; // 10 minutes duration

    const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

    const findButtonByText = (text) => 
        Array.from(document.querySelectorAll("button"))
        .find((button) => button.innerText === text);

    console.log("Start");

    let startTime = Date.now();
    let unfollowCount = 0;

    while (Date.now() - startTime < TOTAL_DURATION) {
        for (let i = 0; i < UNFOLLOW_LIMIT; i++) {
            const followButton = findButtonByText("Following");
            if (!followButton) {
                console.log("No more users to unfollow or unable to find button.");
                break;
            }
            followButton.scrollIntoViewIfNeeded();
            followButton.click();
            await delay(100); // Short delay to wait for modal

            const confirmButton = findButtonByText("Unfollow");
            if (confirmButton) {
                await confirmButton.click(); // Confirm unfollow
                unfollowCount++;
                console.log(`Unfollowed #${unfollowCount}`);
            } else {
                console.log("Confirmation button not found.");
            }

            await delay(UNFOLLOW_INTERVAL);
        }

        console.log(`Taking a break for ${BREAK_DURATION / 1000} seconds...`);
        await delay(BREAK_DURATION);
        startTime = Date.now(); // Reset start time for the next cycle
    }

    console.log("The end");
})();
  • Reduced UNFOLLOW_LIMIT and Increased UNFOLLOW_INTERVAL: These changes help to stay under Instagram's rate limits.
    Improved Button Selection: Uses Array.from() for better readability and directly finds the button instead of mapping and then filtering.
  • Added Basic Logging: Basic logging for when no more follow buttons are found or the confirmation button isn't found, which helps in understanding the script's state.
  • Error Handling and Debugging: While explicit error handling isn't added, logging helps identify issues. For actual production scripts, consider try-catch blocks around actions that might fail.

@pauldgayle
Copy link

may be a silly question, but how do you stop the code from running?

@chaodonghu
Copy link
Author

may be a silly question, but how do you stop the code from running?

@pauldgayle You can refresh the page or manually set a limit to stop it from running after a certain limit as mentioned in the script.

  // Modify these variables to your liking
  const UNFOLLOW_LIMIT = 800;

  const BREAK_DURATION = 5 * 60 * 1000; // 5 minutes break

  const TOTAL_DURATION = 10 * 60 * 1000; // 10 minutes duration - Timeout after 10 minutes

@pauldgayle
Copy link

thank you!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment