Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature #1

Merged
merged 2 commits into from Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -154,3 +154,7 @@ This script:
- Doesn't try and get you to sign in or take your personal data.
- Automates your web browser to make it click unfollow buttons, scroll down to reveal more, then do it again.
- No tricks, all of the code is here so you can see exactly what it does.

## Contributors

- [Ethan JL](https://github.com/tahajalili) - Added feature to keep track of unfollowed users.
75 changes: 75 additions & 0 deletions UnfollowWDFBLog.js
@@ -0,0 +1,75 @@
(() => {
const $followButtons = '[data-testid$="-unfollow"]';
const $confirmButton = '[data-testid="confirmationSheetConfirm"]';
const unfollowedUsers = []; // Array to hold usernames of unfollowed users

const retry = {
count: 0,
limit: 5,
};

const scrollToTheBottom = () => window.scrollTo(0, document.body.scrollHeight);
const retryLimitReached = () => retry.count >= retry.limit;
const addNewRetry = () => retry.count++;

const sleep = (seconds) =>
new Promise((resolve) => {
console.log(`WAITING FOR ${seconds} SECONDS...`);
setTimeout(resolve, seconds * 1000);
});

const unfollowAll = async (followButtons) => {
console.log(`UNFOLLOWING ${followButtons.length} USERS...`);
for (const button of followButtons) {
// Attempt to extract username for logging purposes
const usernameElement = button.closest('[data-testid="UserCell"]')?.querySelector('[dir="ltr"]');
const username = usernameElement ? usernameElement.textContent : "Unknown";
unfollowedUsers.push(username); // Add username to the array

button.click();
await sleep(2);
document.querySelector($confirmButton)?.click();
await sleep(1);
}
};

const createDownload = () => {
const blob = new Blob([unfollowedUsers.join('\n')], { type: 'text/plain' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'unfollowed-users.txt';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
};

const nextBatch = async () => {
scrollToTheBottom();
await sleep(3);
let followButtons = Array.from(document.querySelectorAll($followButtons));
followButtons = followButtons.filter(button => {

const isFollowingBack = button.closest('[data-testid="UserCell"]')?.querySelector('[data-testid="userFollowIndicator"]');
return !isFollowingBack;
});

if (followButtons.length > 0) {
await unfollowAll(followButtons);
retry.count = 0;
await sleep(3);
nextBatch();
} else if (!retryLimitReached()) {
addNewRetry();
await sleep(3);
nextBatch();
} else {
console.log(`FINISHED PROCESS. TOTAL UNFOLLOWED: ${unfollowedUsers.length}`);
if (unfollowedUsers.length > 0) {
createDownload();
}
}
};

nextBatch();
})();