-
-
Save ss44/37db6adad792e55f6731c2f22a34d3d7 to your computer and use it in GitHub Desktop.
Delete everyone from your Facebook group! Thanks for the dark UX, FB
This file contains 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
class FBGroupMemberRemover { | |
constructor() { | |
this.adminText = 'Admin'; | |
this.removeMemberModalHeadingText = 'Remove Member'; | |
this.memberElementSelector = '[data-name="GroupProfileGridItem"]'; | |
this.memberContextMenuSelector = 'button[aria-label="Member Settings"]'; | |
this.removeMemberButtonSelector = 'a[data-testid="leave_group"]' | |
this.removalOptions = { | |
delete_posts: true, | |
delete_comments: true, | |
delete_invites: true, | |
ban_user: true | |
} | |
} | |
*visibleMembers() { | |
for (let el of Array.from( | |
document.querySelectorAll(this.memberElementSelector) | |
).filter(el => !el.textContent.includes(this.adminText))) { | |
yield el; | |
} | |
} | |
openContextMenuForMember(memberEl) { | |
if (memberEl.querySelector(this.memberContextMenuSelector) !== null) { | |
memberEl.querySelector(this.memberContextMenuSelector).click(); | |
} | |
} | |
openRemoveMemberDialog() { | |
const el = document.querySelector(this.removeMemberButtonSelector) | |
if (el === null) { | |
return false; | |
} | |
el.click(); | |
el.remove(); // clean up old element since querySelector picks the first one | |
} | |
setRemovalOptions() { | |
for (let key in this.removalOptions) { | |
const value = this.removalOptions[key]; | |
if (value === false) { return; } | |
this.removeMemberModalEl | |
.querySelector(`input[type="checkbox"][name="${key}"]`).click(); | |
} | |
} | |
confirmRemoveMember() { | |
if (this.removeMemberModalEl) { | |
this.removeMemberModalEl.querySelector('button').click(); | |
} | |
} | |
wait(ms) { | |
return new Promise((resolve) => setTimeout(resolve, ms)); | |
} | |
get removeMemberModalEl() { | |
return Array.from(document.querySelectorAll('form')) | |
.find(el => el.textContent.includes(this.removeMemberModalHeadingText)) | |
} | |
async start() { | |
for (let memberEl of this.visibleMembers()) { | |
this.openContextMenuForMember(memberEl); | |
await this.wait(100); | |
this.openRemoveMemberDialog(); | |
await this.wait(1000); | |
// this.setRemovalOptions(); // if you care about deleting posts etc | |
// await this.wait(100); | |
this.confirmRemoveMember(); | |
} | |
} | |
} | |
const fbgmr = new FBGroupMemberRemover(); | |
fbgmr.start(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment