Skip to content

Instantly share code, notes, and snippets.

@aymericbeaumet
Last active April 14, 2024 07:47
Show Gist options
  • Save aymericbeaumet/d1d6799a1b765c3c8bc0b675b1a1547d to your computer and use it in GitHub Desktop.
Save aymericbeaumet/d1d6799a1b765c3c8bc0b675b1a1547d to your computer and use it in GitHub Desktop.
[Recipe] Delete all your likes/favorites from Twitter

Ever wanted to delete all your likes/favorites from Twitter but only found broken/expensive tools? You are in the right place.

  1. Go to: https://twitter.com/{username}/likes
  2. Open the console and run the following JavaScript code:
setInterval(() => {
  for (const d of document.querySelectorAll('div[data-testid="unlike"]')) {
    d.click()
  }
  window.scrollTo(0, document.body.scrollHeight)
}, 1000)
@nikolaydubina
Copy link

this is incredible 👍

@nikolaydubina
Copy link

nikolaydubina commented Feb 17, 2024

I added more scripts for https://github.com/nikolaydubina/twitter-remover

  • removing tweets
  • removing retweets
  • removing replies
  • removing followers

@skibideetoilet
Copy link

is there one that likes and unlikes the tweets in your likes that for some reason are unliked but haven't been removed?

@schmutzie
Copy link

schmutzie commented Feb 22, 2024 via email

@LetyEspinosa19
Copy link

It does not work for me, I also tried this script:

setInterval(() => {
const d = document.querySelector('div[data-testid="unlike"]')
if(d) {
d.click()
} else {
window.scrollTo(0, document.body.scrollHeight)
}
}, 1000)

And didn't worked also ):

Copy link

ghost commented Mar 13, 2024

Is there anyone who deletes DMs chat?

@NewWestSon
Copy link

It didn't work for me, so I tried waiting 100 milliseconds and it seemed to work, odd.
setInterval(() => {
for (const d of document.querySelectorAll('div[data-testid="unlike"]')) {
d.click()
}
window.scrollTo(0, document.body.scrollHeight)
setTimeout(pass, 100);
}, 1000)

@Kafsu
Copy link

Kafsu commented Apr 4, 2024

function getAllTweetButtons() {
return Array.from(document.querySelectorAll('.tweet-interact-favorite'));
}

function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

async function processTweet(tweetButton) {
tweetButton.focus();
tweetButton.click(); // Click to like (if not liked) or unlike (if liked)
await wait(1000); // Reduced wait time

// Check if the tweet is still liked, if so, click again to unlike
if (tweetButton.classList.contains('tweet-interact-favorited')) {
tweetButton.click(); // Click again to ensure it's unliked
await wait(500); // Reduced wait time
console.log('Ensured tweet is unliked');
} else {
console.log('Processed tweet');
}
}

async function removeAll() {
let count = 0;
let tweetButtons = getAllTweetButtons();

while (count < 500 && tweetButtons.length > 0) {
for (let i = 0; i < tweetButtons.length && count < 500; i++) {
await processTweet(tweetButtons[i]);
count++;
if (count % 50 === 0) {
console.log('Waiting to prevent rate-limiting');
await wait(15000); // Wait to prevent rate-limiting
}
}

// Scroll to the bottom of the page to load more tweets
window.scrollTo(0, document.body.scrollHeight);
await wait(3000); // Wait for more tweets to load
tweetButtons = getAllTweetButtons(); // Refresh the list of tweet buttons

}

console.log('Finished, count =', count);
}

removeAll();


Fix for shadow likes on feed
Works with Old Twitter layouts
Modify the rate limiting waiting as neccessary

@Anon14j1
Copy link

Anon14j1 commented Apr 5, 2024

function getAllTweetButtons() { return Array.from(document.querySelectorAll('.tweet-interact-favorite')); }

function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }

async function processTweet(tweetButton) { tweetButton.focus(); tweetButton.click(); // Click to like (if not liked) or unlike (if liked) await wait(1000); // Reduced wait time

// Check if the tweet is still liked, if so, click again to unlike if (tweetButton.classList.contains('tweet-interact-favorited')) { tweetButton.click(); // Click again to ensure it's unliked await wait(500); // Reduced wait time console.log('Ensured tweet is unliked'); } else { console.log('Processed tweet'); } }

async function removeAll() { let count = 0; let tweetButtons = getAllTweetButtons();

while (count < 500 && tweetButtons.length > 0) { for (let i = 0; i < tweetButtons.length && count < 500; i++) { await processTweet(tweetButtons[i]); count++; if (count % 50 === 0) { console.log('Waiting to prevent rate-limiting'); await wait(15000); // Wait to prevent rate-limiting } }

// Scroll to the bottom of the page to load more tweets
window.scrollTo(0, document.body.scrollHeight);
await wait(3000); // Wait for more tweets to load
tweetButtons = getAllTweetButtons(); // Refresh the list of tweet buttons

}

console.log('Finished, count =', count); }

removeAll();

Fix for shadow likes on feed Works with Old Twitter layouts Modify the rate limiting waiting as neccessary

Im getting a Promise error when i try this
"promise {: undefined}"

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