Skip to content

Instantly share code, notes, and snippets.

@antlionguard
Last active May 1, 2024 23:22
Show Gist options
  • Star 51 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • 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('div[data-testid="unretweet"]').click();
await timer(250);
await document.querySelector('div[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('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);
}
setInterval(async () =>
{
// Get all tweets
const retweetedTweetList = document.querySelectorAll('span[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('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(' ')
await window.scrollTo(0, document.body.scrollHeight);
}, 60000);
@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!

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