Skip to content

Instantly share code, notes, and snippets.

@lifenautjoe
Created March 14, 2017 23:27
Show Gist options
  • Select an option

  • Save lifenautjoe/01828b35132adc096500c2ea9b8c313d to your computer and use it in GitHub Desktop.

Select an option

Save lifenautjoe/01828b35132adc096500c2ea9b8c313d to your computer and use it in GitHub Desktop.
Script to unfollow people in the instagram website
/**
* Instagram web unfollow script
*
* WHAT IS IT?
* A script to unfollow people in the instagram website
*
* WHY?
* I needed to clean my account so I quickly did this
*
* HOW TO USE:
* Go to your instagram profile while logged in and run the following code in your console
*
* WHAT DOES IT DO EXACTLY?
* It opens your followers list and goes one by one unfollowing with a random interval of 1 to 10
* seconds in between
*
* CAN I GET BANNED?
* Yes, although you will first be notified several times about strange activity
* Simply put, use it at your own risk and not for long.
*
* Created on 15/03/17.
* @author Joel Hernandez <involvmnt@gmail.com>
*/
openFollowersWindow().then(function () {
populateUnfollowsPool();
digestUnfollowsPool();
});
function openFollowersWindow() {
var onFollowersWindowWasOpenedListeners = [];
var openWindowTimeout = 3000;
var followersElement = getFollowersElement();
followersElement.click();
function digestOnFollowersWindowWasOpenedListeners() {
onFollowersWindowWasOpenedListeners.forEach(function (onFollowersWindowWasOpenedListener) {
onFollowersWindowWasOpenedListener();
});
}
var wasOpened;
setTimeout(function () {
// TODO Verify that the window was indeed opened
wasOpened = true;
digestOnFollowersWindowWasOpenedListeners();
}, openWindowTimeout);
return {
then: function (onFollowersWindowWasOpened) {
if (wasOpened) {
onFollowersWindowWasOpened();
} else {
onFollowersWindowWasOpenedListeners.push(onFollowersWindowWasOpened);
}
}
};
}
function getFollowersElement() {
return getFollowersElementWithUsername(getUsername());
}
function getUsername() {
var pageTitleElement = document.getElementsByTagName('h1')[0];
if (!pageTitleElement) throw new Error('No title to get username from');
return pageTitleElement.innerHTML;
}
function getFollowersElementWithUsername(username) {
var followersElement = document.querySelectorAll('a[href="/' + username + '/following/"]')[0];
if (!followersElement) throw new Error('No followers element was found');
return followersElement;
}
var unfollowsPool;
function populateUnfollowsPool() {
var buttons = document.getElementsByTagName('button');
unfollowsPool = [];
for (var i = 0; i < buttons.length; i++) {
var button = buttons[i];
if (button.innerHTML.includes('Following')) {
var randomTimeoutForUnfollow = Math.floor((Math.random() * 10) + 1) * 1000;
console.log('Following button!');
var unfollow = {
buttonElement: button,
timeout: randomTimeoutForUnfollow
};
unfollowsPool.push(unfollow);
}
}
}
function digestUnfollowsPool() {
if (unfollowsPool.length === 0) {
console.log('Unfollow pool empty, repopulating');
populateUnfollowsPool();
}
var unfollow = unfollowsPool.shift();
var unfollowTimeout = unfollow.timeout;
console.log('Clicking unfollow button in ', unfollowTimeout);
setTimeout(function () {
var unfollowButtonElement = unfollow.buttonElement;
unfollowButtonElement.scrollIntoView(true);
console.log('Clicking unfollow button');
unfollowButtonElement.click();
console.log('Clicked. Continuing digesting unfollow pool');
digestUnfollowsPool();
}, unfollowTimeout);
}
@davidyang

Copy link
Copy Markdown

Thanks - my account was hacked a while ago (loose API keys) and this will probably get me back into instagram.

@odedharth

odedharth commented Apr 19, 2018

Copy link
Copy Markdown

Seems work for a minute or two and then giving this error
POST https://www.instagram.com/web/friendships/238197293/unfollow/ 403 ()

@moumouh206

Copy link
Copy Markdown

instagram have unfollow limitation per minute with some bot ,if you use this script like it is you will got the error :
POST https://www.instagram.com/web/friendships/238197293/unfollow/ 403 ()
you have to change the interval to bigger values in line 84 if you want to bypass the bot detection exp :
var randomTimeoutForUnfollow = Math.floor((Math.random() * 60) + 58) * 1000;

@greyllmmoder

Copy link
Copy Markdown

var randomTimeoutForUnfollow = Math.floor((Math.random() * 35) + 30) * 1000;

Change to this numbers. This will make it much faster and the Instagram servers won't block you.

@churu88

churu88 commented Jul 14, 2018

Copy link
Copy Markdown

Is it still working? Instagram has enabled a second confirmation button that needs to be clicked.

@pejman-saberin

Copy link
Copy Markdown

@churu88
For the second confirm add this:

//Second confirm
var el=document.getElementsByClassName("aOOlW -Cab_ ");
for (var i=0;i<el.length; i++) {
el[i].click();
}

The whole code then will be then the following:

/**

  • Instagram web unfollow script
  • WHAT IS IT?
  • A script to unfollow people in the instagram website
  • WHY?
  • I needed to clean my account so I quickly did this
  • HOW TO USE:
  • Go to your instagram profile while logged in and run the following code in your console
  • WHAT DOES IT DO EXACTLY?
  • It opens your followers list and goes one by one unfollowing with a random interval of 1 to 10
  • seconds in between
  • CAN I GET BANNED?
  • Yes, although you will first be notified several times about strange activity
  • Simply put, use it at your own risk and not for long.
  • Created on 15/03/17.
  • @author Joel Hernandez involvmnt@gmail.com
    */

openFollowersWindow().then(function () {
populateUnfollowsPool();
digestUnfollowsPool();
});

function openFollowersWindow() {
var onFollowersWindowWasOpenedListeners = [];
var openWindowTimeout = 3000;

var followersElement = getFollowersElement();
followersElement.click();

function digestOnFollowersWindowWasOpenedListeners() {
    onFollowersWindowWasOpenedListeners.forEach(function (onFollowersWindowWasOpenedListener) {
        onFollowersWindowWasOpenedListener();
    });
}

var wasOpened;
setTimeout(function () {
    // TODO Verify that the window was indeed opened
    wasOpened = true;
    digestOnFollowersWindowWasOpenedListeners();
}, openWindowTimeout);
return {
    then: function (onFollowersWindowWasOpened) {
        if (wasOpened) {
            onFollowersWindowWasOpened();
        } else {
            onFollowersWindowWasOpenedListeners.push(onFollowersWindowWasOpened);
        }
    }
};

}

function getFollowersElement() {
return getFollowersElementWithUsername(getUsername());
}

function getUsername() {
var pageTitleElement = document.getElementsByTagName('h1')[0];
if (!pageTitleElement) throw new Error('No title to get username from');
return pageTitleElement.innerHTML;
}

function getFollowersElementWithUsername(username) {
var followersElement = document.querySelectorAll('a[href="/' + username + '/following/"]')[0];
if (!followersElement) throw new Error('No followers element was found');
return followersElement;
}

var unfollowsPool;

function populateUnfollowsPool() {
var buttons = document.getElementsByTagName('button');
unfollowsPool = [];
for (var i = 0; i < buttons.length; i++) {
var button = buttons[i];
if (button.innerHTML.includes('Following')) {
var randomTimeoutForUnfollow = Math.floor((Math.random() * 60) + 58) * 1000;
console.log('Following button!');

        var unfollow = {
            buttonElement: button,
            timeout: randomTimeoutForUnfollow
        };

        unfollowsPool.push(unfollow);
    }
}

}

function digestUnfollowsPool() {
if (unfollowsPool.length === 0) {
console.log('Unfollow pool empty, repopulating');
populateUnfollowsPool();
}
var unfollow = unfollowsPool.shift();
var unfollowTimeout = unfollow.timeout;
console.log('Clicking unfollow button in ', unfollowTimeout);
setTimeout(function () {
var unfollowButtonElement = unfollow.buttonElement;
unfollowButtonElement.scrollIntoView(true);
console.log('Clicking unfollow button');
unfollowButtonElement.click();
//Second confirm
var el=document.getElementsByClassName("aOOlW -Cab_ ");
for (var i=0;i<el.length; i++) {
el[i].click();
}
console.log('Clicked. Continuing digesting unfollow pool');
digestUnfollowsPool();
}, unfollowTimeout);
}

@pejman-saberin

Copy link
Copy Markdown

And thanks to @lifenautjoe who wrote and shared!

@mikikuke

Copy link
Copy Markdown

how exactly to use this script? Inside google chrome?

@domtaylor

domtaylor commented Apr 26, 2019

Copy link
Copy Markdown

legend! it works!

@pedrodiastc

Copy link
Copy Markdown

I am getting this error.

VM15346:79 Uncaught TypeError: Cannot read property 'timeout' of undefined
    at digestUnfollowsPool (<anonymous>:79:36)
    at <anonymous>:3:5
    at <anonymous>:15:13
    at Array.forEach (<anonymous>)
    at digestOnFollowersWindowWasOpenedListeners (<anonymous>:14:45)
    at <anonymous>:23:9

Someone could help me ?

@1der1

1der1 commented Jun 18, 2019

Copy link
Copy Markdown

I had to fix several issues before I could get it running. However, although I chose long delays between the calls, Instagram took away the "Unfollow" button for me after about one and a half days. There were no warnings before and I am not banned, but stuck with a lot of following I did not initiate.

ghost commented Oct 30, 2019

Copy link
Copy Markdown

Any chance we can get one that does the same thing but follows instead of unfollows?

Thanks in advance guys!

@Grogdor

Grogdor commented Nov 23, 2019

Copy link
Copy Markdown

Just confirming that @pejman-saberin 's revision for the unfollow confirmation button works great, but combined with @bennyxavier007 's timings I only got thru 15 unfollows before getting 403'd. Will try again tomorrow!

ghost commented Nov 23, 2019 via email

Copy link
Copy Markdown

@Grogdor

Grogdor commented Nov 25, 2019

Copy link
Copy Markdown

Plugged thru the remaining couple hundred with the original timings just fine, thanks!

@qSebastiaNp

Copy link
Copy Markdown

I am getting this error.

VM15346:79 Uncaught TypeError: Cannot read property 'timeout' of undefined
    at digestUnfollowsPool (<anonymous>:79:36)
    at <anonymous>:3:5
    at <anonymous>:15:13
    at Array.forEach (<anonymous>)
    at digestOnFollowersWindowWasOpenedListeners (<anonymous>:14:45)
    at <anonymous>:23:9

It's a shame that nobody helped you with that. You use instagram in a different language. E.g. if you use Instagram in German, you would have to search for the word "Following" and replace it with "Abonniert" (using @pejman-saberin 's Code as a reference). It will work then.

ghost commented Feb 14, 2020 via email

Copy link
Copy Markdown

@vinicio1

Copy link
Copy Markdown

Agradezco el amigo de ayuda, pero lo estoy usando en inglés. Contraté a alguien en fiverr para dejar de seguir toda mi lista. ¡Gracias de todos modos! El 14 de febrero de 2020 a las 18:12, Sebastian notifications@github.com escribió: Recibo este error. VM15346: 79 Error de tipo no capturado: no se puede leer la propiedad 'tiempo de espera' de undefined en digestUnfollowsPool (<anónimo>: 79: 36) en <anónimo>: 3: 5 en <anónimo>: 15: 13 en Array.forEach (<anónimo>) en digestOnFollowersWindowWasOpenedListeners (<anónimo>: 14: 45) en <anónimo>: 23: 9 Es una pena que nadie te haya ayudado con eso. Usas instagram en un idioma diferente. Por ejemplo, si usa Instagram en alemán, tendría que buscar la palabra "Siguiente" y reemplazarla con "Abonniert" (usando @ pejman-saberin's Code como referencia). Funcionará entonces. —Estás recibiendo esto porque has comentado. Responde directamente a este correo electrónico, míralo en GitHub o cancela la suscripción.

can you please send me your fiverr script. im using it in english too and i have the same error...

@dfc201692

Copy link
Copy Markdown

Buena tarde amigo, este Script todavia sirve ? necesito borrar un poco de de seguidos, aproximadamente 7000 y quiero borrarlos a todos, este es mi perfil, https://www.instagram.com/dafecruz2/ Necesito de su colaboracion

@SuvanSth

Copy link
Copy Markdown

How do i use this

@adminy

adminy commented Aug 31, 2021

Copy link
Copy Markdown

here is the updated version

@Mohsinparay

Copy link
Copy Markdown

not working

@sevakmaheshr

Copy link
Copy Markdown

not a js programmer, so don't understand all parts of the script. tried to make code changes on my local copy to see if i could populate the list with only 100 followers, but i obviously don't know js, so things didn't work. wondering if the original dev (@adminy) would be interested in making this change in the script, so that in stead of populating the list with "all" followers, populate the list with only 100 odd followers. that would also be good to ensure that we don't get banned by instag.

this is urgent, because (1) i have maintained a private account so far, (2) i am following over 1000 accounts, most of which i do not wish to share with others - friends and family (3) a new, "very close friend" wants to follow me or see the list of people i am following. #3 mandates that i clean up my list asap. your help is appreciated.

@camilo0119

Copy link
Copy Markdown

try this

const unfollow = setInterval(()=>{
const allElements = document.getElementsByClassName("_aacl _aaco _aacw _adda _aad6 _aade");
for (const el of allElements) {
el.click();
setTimeout(() => console.log('espera'), 1000);
setTimeout(() => {
const xpath = "//a[text()='Dejar de seguir']";
const matchingElement = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
matchingElement.click();
},2000);
setTimeout(() => console.log('espera'), 1000);
}
}, 2000);

clearInterval(unfollow);

@mikeknapp

Copy link
Copy Markdown

@mygirlwantfly

Copy link
Copy Markdown

How to use it like how to open it.

im new in that and im with c#

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