-
-
Save chaodonghu/c942b6ca8f8c247ccacd3b0123ff3580 to your computer and use it in GitHub Desktop.
// 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!"); | |
})(); |
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
@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 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 theUNFOLLOW_INTERVAL
on line 48 which is by default a multiple of 5 seconds. Either increase theTOTAL_DURATION
or decrease theUNFOLLOW_INTERVAL
or play with theUNFOLLOW_LIMIT
andBREAK_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.
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.
may be a silly question, but how do you stop the code from running?
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
thank you!!
is there an easy way to add a list of users I don’t want to unfollow?
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.
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.