Skip to content

Instantly share code, notes, and snippets.

@antlionguard
Last active December 21, 2024 01:54
Show Gist options
  • Save antlionguard/000e24bb039e8824fa5c58d6e324c78e to your computer and use it in GitHub Desktop.
Save antlionguard/000e24bb039e8824fa5c58d6e324c78e to your computer and use it in GitHub Desktop.
With this script, you can remove all retweets you are retweeted on Twitter.
const timer = ms => new Promise(res => setTimeout(res, ms));
// Unretweet normally
const unretweetTweet = async (tweet) => {
await tweet.querySelector('[data-testid="unretweet"]').click();
await timer(250);
await document.querySelector('[data-testid="unretweetConfirm"]').click();
console.log('****// Unretweeted Successfully //****')
}
// Sometimes twitter shows your retweet but green retweet button is invisible and therefore you need to retweet again for make unreweet. This function is for that.
const unretweetUnretweetedTweet = async (tweet) => {
await tweet.querySelector('[data-testid="retweet"]').click();
await timer(250);
await document.querySelector('[data-testid="retweetConfirm"]').click();
console.log('****// Retweeted Successfully //****')
await timer(250);
unretweetTweet(tweet);
}
setInterval(async () =>
{
// Get all tweets
const retweetedTweetList = document.querySelectorAll('[data-testid="socialContext"]');
console.log('****// Retweeted Tweet List Collected //****')
for (const retweet of retweetedTweetList) {
const tweetWrapper = retweet.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement;
tweetWrapper.scrollIntoView();
const isRetweeted = tweetWrapper.querySelector('[data-testid="unretweet"]');
if (isRetweeted) {
console.log('****// Green Retweet Button Found - Starting "unretweetTweet" process //****')
await unretweetTweet(tweetWrapper);
} else {
console.log('****// Green Retweet Button Not Found - Starting "unretweetUnretweetedTweet" process //****')
await unretweetUnretweetedTweet(tweetWrapper);
}
await timer(2000);
}
console.log('****// List Completed //****')
console.log('****// Scrolling //****')
console.log(' ')
console.log(' ')
console.log(' ')
console.log(' ')
console.log(' ')
console.log(' ')
console.log(' ')
console.log(' ')
await window.scrollTo(0, document.body.scrollHeight);
}, 60000);
@cerkes78
Copy link

it works well. Thx Bossman556.

@antlionguard
Copy link
Author

This code does the same but you dont have to wait.

const timer = ms => new Promise(res => setTimeout(res, ms));

const unretweetTweet = async (tweet) => {
  try {
    await tweet.querySelector('div[data-testid="unretweet"]').click();
    await timer(250);
    await document.querySelector('div[data-testid="unretweetConfirm"]').click();
    console.log('****// Unretweeted Successfully //****');
  } catch (error) {
    console.error('Error during unretweet:', error);
  }
};

const unretweetUnretweetedTweet = async (tweet) => {
  try {
    await tweet.querySelector('div[data-testid="retweet"]').click();
    await timer(250);
    await document.querySelector('div[data-testid="retweetConfirm"]').click();
    console.log('****// Retweeted Successfully //****');
    await timer(250);
    unretweetTweet(tweet);
  } catch (error) {
    console.error('Error during unretweetUnretweetedTweet:', error);
  }
};

const processTweets = async () => {
  const retweetedTweetList = document.querySelectorAll('span[data-testid="socialContext"]');
  console.log('****// Retweeted Tweet List Collected //****');

  for (const retweet of retweetedTweetList) {
    const tweetWrapper = retweet.closest('[data-testid="tweet"]');
    tweetWrapper.scrollIntoView();

    const isRetweeted = tweetWrapper.querySelector('div[data-testid="unretweet"]');
    if (isRetweeted) {
      console.log('****// Green Retweet Button Found - Starting "unretweetTweet" process //****');
      await unretweetTweet(tweetWrapper);
    } else {
      console.log('****// Green Retweet Button Not Found - Starting "unretweetUnretweetedTweet" process //****');
      await unretweetUnretweetedTweet(tweetWrapper);
    }
    await timer(2000);
  }
  console.log('****// List Completed //****');
  console.log('****// Scrolling //****');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  window.scrollTo(0, document.body.scrollHeight);

  // Call processTweets again using requestAnimationFrame to keep the loop going
  requestAnimationFrame(processTweets);
};

// Start the process initially
processTweets();

no. i added delay for preventing to rate limit.

@ItIsInx
Copy link

ItIsInx commented Nov 8, 2023

Worked for me ♥
2023

@Lime-oss-hash
Copy link

Wait, so all the content is gone, but why is the number still there?

@maroz14
Copy link

maroz14 commented Jan 7, 2024

@antlionguard , @Bossman556 please would you mind to make this script as chrome addons extension but with popup read and show every thing as showing in console? please

@Mili4Matic
Copy link

Still working

@antlionguard
Copy link
Author

@antlionguard , @Bossman556 please would you mind to make this script as chrome addons extension but with popup read and show every thing as showing in console? please

good idea. i will work on it.

@brunarafaela
Copy link

This code does the same but you dont have to wait.

const timer = ms => new Promise(res => setTimeout(res, ms));

const unretweetTweet = async (tweet) => {
  try {
    await tweet.querySelector('div[data-testid="unretweet"]').click();
    await timer(250);
    await document.querySelector('div[data-testid="unretweetConfirm"]').click();
    console.log('****// Unretweeted Successfully //****');
  } catch (error) {
    console.error('Error during unretweet:', error);
  }
};

const unretweetUnretweetedTweet = async (tweet) => {
  try {
    await tweet.querySelector('div[data-testid="retweet"]').click();
    await timer(250);
    await document.querySelector('div[data-testid="retweetConfirm"]').click();
    console.log('****// Retweeted Successfully //****');
    await timer(250);
    unretweetTweet(tweet);
  } catch (error) {
    console.error('Error during unretweetUnretweetedTweet:', error);
  }
};

const processTweets = async () => {
  const retweetedTweetList = document.querySelectorAll('span[data-testid="socialContext"]');
  console.log('****// Retweeted Tweet List Collected //****');

  for (const retweet of retweetedTweetList) {
    const tweetWrapper = retweet.closest('[data-testid="tweet"]');
    tweetWrapper.scrollIntoView();

    const isRetweeted = tweetWrapper.querySelector('div[data-testid="unretweet"]');
    if (isRetweeted) {
      console.log('****// Green Retweet Button Found - Starting "unretweetTweet" process //****');
      await unretweetTweet(tweetWrapper);
    } else {
      console.log('****// Green Retweet Button Not Found - Starting "unretweetUnretweetedTweet" process //****');
      await unretweetUnretweetedTweet(tweetWrapper);
    }
    await timer(2000);
  }
  console.log('****// List Completed //****');
  console.log('****// Scrolling //****');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  console.log('                  ');
  window.scrollTo(0, document.body.scrollHeight);

  // Call processTweets again using requestAnimationFrame to keep the loop going
  requestAnimationFrame(processTweets);
};

// Start the process initially
processTweets();

no. i added delay for preventing to rate limit.

this is working. thank you!

@mainleblanc
Copy link

Didnt work :(
2024-06-01 (1)

@iAjityadav
Copy link

not working

@c7ffss
Copy link

c7ffss commented Jun 15, 2024

any code for removing retweets from account that blocked you?

@Mede1ro
Copy link

Mede1ro commented Jul 1, 2024

any code for removing retweets from account that blocked you?

I also need

@ElPelado619
Copy link

Script not working on July 3rd, 2024.

const isRetweeted = tweetWrapper.querySelector('div[data-testid="unretweet"]') has value Null.

@antlionguard
Copy link
Author

@Rp2patilrahul
Copy link

image

@Rp2patilrahul
Copy link

It's working but slow !
take pause & start again.

Thank you.

@ElKillThisLove
Copy link

Screenshot_5
Any way to fix it?

@martgil
Copy link

martgil commented Aug 4, 2024

The above code should be simplified to the following. I'm using this to remove unwanted retweets but not retweets my own tweets.

setInterval(
    function() {
        document.querySelector('[data-testid="unretweet"]').click()
        document.querySelector('[data-testid="unretweetConfirm"]').click()
    },
    500
)

Reference: https://gist.github.com/martgil/ddd7da50712105777029bbacb5123265

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