Last active
January 3, 2026 09:15
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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); |
Here's work like 300 unretweet a day before your account can't load your profile anymore:
const timer = (ms) => new Promise((res) => setTimeout(res, ms));
let totalUnretweeted = 0;
let isRunning = true;
// Stop the script by running: isRunning = false; in console
window.stopUnretweet = () => {
isRunning = false;
console.log("// Stopping script... //");
};
const unretweetBatch = async () => {
const retweetedTweetList = document.querySelectorAll(
'span[data-testid="socialContext"]',
);
if (retweetedTweetList.length === 0) {
console.log("// No retweets found, scrolling... //");
return 0;
}
let batchCount = 0;
for (const retweet of retweetedTweetList) {
if (!isRunning) break;
const tweetWrapper = retweet.closest('[data-testid="tweet"]');
if (!tweetWrapper) continue;
tweetWrapper.scrollIntoView({ behavior: "smooth", block: "center" });
await timer(800);
const unretweetButton = tweetWrapper.querySelector(
'button[data-testid="unretweet"]',
);
if (unretweetButton) {
try {
unretweetButton.click();
await timer(500);
const confirmButton = document.querySelector(
'div[data-testid="unretweetConfirm"]',
);
if (confirmButton) {
confirmButton.click();
batchCount++;
totalUnretweeted++;
console.log(`β Unretweeted #${totalUnretweeted}`);
}
} catch (error) {
console.error("Error:", error);
}
}
await timer(3000); // 3 second delay between unretweets
}
return batchCount;
};
const autoUnretweet = async () => {
console.log("π Starting autonomous unretweet script...");
console.log("β οΈ To stop at any time, type: stopUnretweet()");
console.log(" ");
while (isRunning) {
const processed = await unretweetBatch();
if (!isRunning) break;
// Scroll down to load more
console.log("π Scrolling to load more tweets...");
window.scrollTo(0, document.body.scrollHeight);
// Wait for new tweets to load
await timer(4000);
// If no tweets were processed, wait longer before trying again
if (processed === 0) {
console.log(
"βΈοΈ No retweets found. Waiting 10 seconds before checking again...",
);
await timer(10000);
}
}
console.log(" ");
console.log("β
Script stopped. Total unretweeted: ${totalUnretweeted}");
};
autoUnretweet();
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Autonomous version
const timer = ms => new Promise(res => setTimeout(res, ms));
let totalUnretweeted = 0;
let isRunning = true;
// Stop the script by running: isRunning = false; in console
window.stopUnretweet = () => {
isRunning = false;
console.log('// Stopping script... //');
};
const unretweetBatch = async () => {
const retweetedTweetList = document.querySelectorAll('span[data-testid="socialContext"]');
if (retweetedTweetList.length === 0) {
console.log('// No retweets found, scrolling... //');
return 0;
}
let batchCount = 0;
for (const retweet of retweetedTweetList) {
if (!isRunning) break;
}
return batchCount;
};
const autoUnretweet = async () => {β οΈ To stop at any time, type: stopUnretweet()');
console.log('π Starting autonomous unretweet script...');
console.log('
console.log(' ');
while (isRunning) {
const processed = await unretweetBatch();
}
console.log(' ');
console.log(
β Script stopped. Total unretweeted: ${totalUnretweeted});};
autoUnretweet();