Skip to content

Instantly share code, notes, and snippets.

@Sorbh
Created June 20, 2024 05:54
Show Gist options
  • Save Sorbh/edfc2238cb47886e2dde239b5d2fbb96 to your computer and use it in GitHub Desktop.
Save Sorbh/edfc2238cb47886e2dde239b5d2fbb96 to your computer and use it in GitHub Desktop.
WhatsApp Group Contacts Export: This will download the members of group with their phone number, whatsapp name and if contact is stored on phone

Create a bookmark with any name and enter this whole code in url

javascript:(function()%7Bvar%20_contacts%20%3D%20%5B%5D%3B%0Aclass%20ContactFinder%20%7B%0A%20%20%23db%3B%0A%20%20%23chatToFind%3B%0A%20%20%23dbName%20%3D%20%22model-storage%22%3B%0A%20%20%23chatsCol%20%3D%20%22chat%22%3B%0A%20%20%23contactCol%20%3D%20%22contact%22%3B%0A%20%20%23groupCol%20%3D%20%22participant%22%3B%0A%0A%20%20constructor(chatGroupName)%20%7B%0A%20%20%20%20this.%23chatToFind%20%3D%20chatGroupName%3B%0A%20%20%7D%0A%0A%20%20async%20openConnection()%20%7B%0A%20%20%20%20if%20(!this.%23db)%20%7B%0A%20%20%20%20%20%20const%20dbName%20%3D%20this.%23dbName%3B%0A%20%20%20%20%20%20this.%23db%20%3D%20await%20new%20Promise((resolve%2C%20reject)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20let%20request%20%3D%20indexedDB.open(dbName)%3B%0A%20%20%20%20%20%20%20%20request.onerror%20%3D%20(event)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20reject(event)%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20request.onsuccess%20%3D%20(event)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20resolve(event.target.result)%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20this.%23db%3B%0A%20%20%7D%0A%0A%20%20async%20%23promisifyCol(collection%2C%20query%2C%20count)%20%7B%0A%20%20%20%20const%20db%20%3D%20await%20this.openConnection()%3B%0A%20%20%20%20return%20new%20Promise((resolve%2C%20reject)%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20request%20%3D%20db.transaction(collection).objectStore(collection).getAll(query%2C%20count)%3B%0A%0A%20%20%20%20%20%20request.onerror%20%3D%20(event)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20reject(event)%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20request.onsuccess%20%3D%20(event)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20resolve(event.target.result)%3B%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D)%3B%0A%20%20%7D%0A%0A%20%20async%20%23getChats()%20%7B%0A%20%20%20%20const%20allChats%20%3D%20await%20this.%23promisifyCol(this.%23chatsCol)%3B%0A%20%20%20%20const%20chatToFind%20%3D%20this.%23chatToFind%3B%0A%20%20%20%20return%20allChats.filter((chat)%20%3D%3E%20%7B%0A%20%20%20%20%20%20return%20chat.name%20%26%26%20chat.name.includes(chatToFind)%3B%0A%20%20%20%20%7D)%3B%0A%20%20%7D%0A%0A%20%20async%20%23getGroups()%20%7B%0A%20%20%20%20const%20chats%20%3D%20(await%20this.%23getChats()).map((chat)%20%3D%3E%20chat.id)%3B%0A%20%20%20%20const%20allGroups%20%3D%20await%20this.%23promisifyCol(this.%23groupCol)%3B%0A%0A%20%20%20%20return%20allGroups.filter((group)%20%3D%3E%20%7B%0A%20%20%20%20%20%20return%20group.groupId%20%26%26%20chats.includes(group.groupId)%3B%0A%20%20%20%20%7D)%3B%0A%20%20%7D%0A%0A%20%20async%20%23getGroupParticipants()%20%7B%0A%20%20%20%20const%20groups%20%3D%20await%20this.%23getGroups()%3B%0A%20%20%20%20const%20map%20%3D%20new%20Map()%3B%0A%0A%20%20%20%20groups.forEach((group)%20%3D%3E%20%7B%0A%20%20%20%20%20%20group.participants.forEach((par)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20const%20num%20%3D%20par.replace(%22%40c.us%22%2C%20%22%22)%3B%0A%20%20%20%20%20%20%20%20map.set(num%2C%20num)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D)%3B%0A%0A%20%20%20%20return%20map%3B%0A%20%20%7D%0A%0A%20%20async%20%23getContacts()%20%7B%0A%20%20%20%20return%20this.%23promisifyCol(this.%23contactCol)%3B%0A%20%20%7D%0A%0A%20%20async%20getGroupMembers()%20%7B%0A%20%20%20%20const%20members%20%3D%20await%20this.%23getGroupParticipants()%3B%0A%20%20%20%20const%20contacts%20%3D%20await%20this.%23getContacts()%3B%0A%0A%20%20%20%20contacts.forEach((contact)%20%3D%3E%20%7B%0A%20%20%20%20%20%20var%20num%3B%0A%20%20%20%20%20%20if%20(contact.phoneNumber)%20%7B%0A%20%20%20%20%20%20%20%20num%20%3D%20contact.phoneNumber.split(%22%40%22)%5B0%5D%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(contact.id)%20%7B%0A%20%20%20%20%20%20%20%20num%20%3D%20contact.id.split(%22%40%22)%5B0%5D%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20if%20(num%20%26%26%20members.get(num))%20%7B%0A%20%20%20%20%20%20%20%20var%20m%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20phoneNum%3A%20num%2C%0A%20%20%20%20%20%20%20%20%20%20name%3A%20contact.name%2C%0A%20%20%20%20%20%20%20%20%20%20pushname%3A%20contact.pushname%2C%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20members.set(num%2C%20m)%3B%0A%20%20%20%20%20%20%20%20_contacts.push(m)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D)%3B%0A%20%20%20%20return%20members%3B%0A%20%20%7D%0A%0A%0A%20%20async%20downloadMembersAsCSV()%20%7B%0A%20%20%20%20const%20members%20%3D%20await%20this.getGroupMembers()%3B%0A%20%20%20%20let%20csvContent%20%3D%20%22data%3Atext%2Fcsv%3Bcharset%3Dutf-8%2C%22%3B%0A%20%20%20%20%20%20%20%20csvContent%20%2B%3D%20'%22Phone%22%2C%22Name%22%2C%22Push%20Name%22%5Cr%5Cn'%3B%0A%0A%20%20%20%20for%20(const%20%5Bkey%2C%20value%5D%20of%20members.entries())%20%7B%0A%20%20%20%20%20%20const%20values%20%3D%20%5B%0A%20%20%20%20%20%20%20%20value.phoneNum%20%7C%7C%20%22%22%2C%0A%20%20%20%20%20%20%20%20value.name%20%7C%7C%20%22%22%2C%0A%20%20%20%20%20%20%20%20value.pushname%20%7C%7C%20%22%22%2C%0A%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20const%20row%20%3D%20values.map((value)%20%3D%3E%20%60%22%24%7Bvalue%7D%22%60).join(%22%2C%22)%3B%0A%20%20%20%20%20%20csvContent%20%2B%3D%20row%20%2B%20%22%5Cr%5Cn%22%3B%0A%20%20%20%20%7D%0A%20%20%20%20console.log(csvContent)%3B%0A%0A%20%20%20%20const%20encodedUri%20%3D%20encodeURI(csvContent)%3B%0A%20%20%20%20var%20link%20%3D%20document.createElement(%22a%22)%3B%0A%20%20%20%20link.setAttribute(%22href%22%2C%20encodedUri)%3B%0A%20%20%20%20link.setAttribute(%22download%22%2C%20%22WhatsAppContacts.csv%22)%3B%0A%20%20%20%20document.body.appendChild(link)%3B%20%2F%2F%20Required%20for%20FF%0A%20%20%20%20link.click()%3B%0A%20%20%7D%0A%0A%0A%0A%7D%0A%0A(async%20()%20%3D%3E%20%7B%0A%20%20const%20contactFinder%20%3D%20new%20ContactFinder(window.prompt(%22Nombre%20del%20grupo%3A%22))%3B%0A%20%20const%20members%20%3D%20await%20contactFinder.getGroupMembers()%3B%20%2F%2F%20This%20will%20return%20a%20JS%20Map%20Object%0A%20%20await%20contactFinder.downloadMembersAsCSV()%3B%20%2F%2F%20This%20will%20download%20the%20contacts%20as%20CSV%0A%20%20console.log(_contacts)%3B%0A%7D)()%3B%7D)()%3B

Open the whats web now and click on this bookmark. It will ask for the group name, put the exact group name you want to export contacts for education purpose. bookmark will prompt you to save the csv file.

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