Skip to content

Instantly share code, notes, and snippets.

@mohamedebrahim96
Created July 8, 2020 06:42
Show Gist options
  • Select an option

  • Save mohamedebrahim96/7f28041bfe714c4a98b4c2ff4225f55e to your computer and use it in GitHub Desktop.

Select an option

Save mohamedebrahim96/7f28041bfe714c4a98b4c2ff4225f55e to your computer and use it in GitHub Desktop.

Revisions

  1. mohamedebrahim96 created this gist Jul 8, 2020.
    62 changes: 62 additions & 0 deletions unfollow.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,62 @@
    // 1. Go to https://twitter.com/YOUR_USER_NAME/following
    // 2. Open the Developer Console. (COMMAND+ALT+I on Mac)
    // 3. Paste this into the Developer Console and run it
    //
    // Last Updated: 09 April 2020
    (() => {
    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 });

    const followButtons = Array.from(document.querySelectorAll($followButtons));
    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();
    })();