Maintaining Reciprocal Following To Followers Ratio On X
This revision is from 2024/03/04 19:51. You can Restore it.
Unfollow everyone on X (Formerly Twitter) who doesn't follow you back, by Nicholas Resendez (https://twitter.com/nichxbt)
Go to profile https://twitter.com/Immortality_IMT
Following: https://twitter.com/Immortality_IMT/following
Open the Developer Console. Mozilla Firefox: Ctrl + Shift + K or Ctrl + Shift + I
Paste code into the Developer Console and run it
(() => {
const $followButtons = '[data-testid$="-unfollow"]';
const $confirmButton = '[data-testid="confirmationSheetConfirm"]';
const retry = {
count: 0,
limit: 3,
};
const scrollToTheBottom = () => window.scrollTo(0, document.body.scrollHeight);
const retryLimitReached = () => retry.count === retry.limit;
const addNewRetry = () => retry.count++;
const sleep = ({ seconds }) =>
new Promise((proceed) => {
console.log(`WAITING FOR ${seconds} SECONDS...`);
setTimeout(proceed, seconds * 1000);
});
const unfollowAll = async (followButtons) => {
console.log(`UNFOLLOWING ${followButtons.length} USERS...`);
await Promise.all(
followButtons.map(async (followButton) => {
followButton && followButton.click();
await sleep({ seconds: 1 });
const confirmButton = document.querySelector($confirmButton);
confirmButton && confirmButton.click();
})
);
};
const nextBatch = async () => {
scrollToTheBottom();
await sleep({ seconds: 1 });
let followButtons = Array.from(document.querySelectorAll($followButtons));
followButtons = followButtons.filter(b => b.parentElement?.parentElement?.querySelector('[data-testid="userFollowIndicator"]') === null)
const followButtonsWereFound = followButtons.length > 0;
if (followButtonsWereFound) {
await unfollowAll(followButtons);
await sleep({ seconds: 2 });
return nextBatch();
} else {
addNewRetry();
}
if (retryLimitReached()) {
console.log(`NO ACCOUNTS FOUND, SO I THINK WE'RE DONE`);
console.log(`RELOAD PAGE AND RE-RUN SCRIPT IF ANY WERE MISSED`);
} else {
await sleep({ seconds: 2 });
return nextBatch();
}
};
nextBatch();
})();
Here is another verison
const userField = document.getElementsByClassName("ProfileCard-userFields");
const input = window.prompt("Enter any usernames you want to continue following separated by a space.");
let inputMax = window.prompt("Enter maximum number of seconds to wait between actions. Must be greater than '2'.");
let i = 0;
let t = 0;
let inputFound = [];
let saveNames = input.split(" ");
let rand = Math.round(Math.random() * 10000);
let setMin = 2000;
let setMax = inputMax * 1000;
main();
function main(){
if(inputMax > 2){
randomIntFromInterval(setMin,setMax);
unfollowLoop();
findUsers();
}else{
inputMax = window.prompt("Please enter a number great than 2");
setMax = inputMax * 1000;
main();
}
}
function findUsers(){
if(t < userField.length){
for(u = 0; u < saveNames.length; u++){
if(userField[t].children[1].innerText.includes(saveNames[u])){
inputFound[t] = true;
break;
}else{
inputFound[t] = false;
}
}
t++;
if(t < userField.length){
findUsers();
}
}
}
function randomIntFromInterval(min,max)
{
rand = Math.floor(Math.random()*(max-min+1)+min);
return rand;
}
function unfollowLoop(){
let button = userField[i].previousElementSibling.children[0].children[0].children[0].children[1];
let buttonText = button.innerText;
let stat = userField[i].children[1].children[2];
let follows = "";
if(stat === undefined){
follows = "";
}else{
follows = stat.innerText;
}
setTimeout(function(){
if(follows.includes("Follows you") === false && inputFound[i] === false && buttonText.includes("Following") === true){
button.click();
}
i++;
if(i < userField.length){
randomIntFromInterval(setMin,setMax);
unfollowLoop();
}else{
window.alert("Unfollow Script Finished!");
}
}, rand);
}
IMMORTALITY