Skip to content

Instantly share code, notes, and snippets.

@chaodonghu
Last active July 28, 2024 03:21
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!");
})();
@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!!

@nikko-guy
Copy link

is there an easy way to add a list of users I don’t want to unfollow?

@chaodonghu
Copy link
Author

is there an easy way to add a list of users I don’t want to unfollow?

@nikko-guy Unfortunately not since the entire script is based on just finding the "Following" button irrespective of the user you are unfollowing.

If you want to add a list of users you don't want to unfollow that would involve finding the "Following" button then the name/username element beside the "Following" button and skipping the iteration if it matches a name/username in some sort of lookup array or object.

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