Skip to content

Instantly share code, notes, and snippets.

@ss44
Forked from poteto/FBGroupMemberRemover.js
Last active March 19, 2018 03:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ss44/37db6adad792e55f6731c2f22a34d3d7 to your computer and use it in GitHub Desktop.
Save ss44/37db6adad792e55f6731c2f22a34d3d7 to your computer and use it in GitHub Desktop.
Delete everyone from your Facebook group! Thanks for the dark UX, FB
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