Skip to content

Instantly share code, notes, and snippets.

@Sorbh
Created June 20, 2024 05:54
Show Gist options
  • Select an option

  • Save Sorbh/edfc2238cb47886e2dde239b5d2fbb96 to your computer and use it in GitHub Desktop.

Select an option

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.

@Kdinesh13
Copy link

Kdinesh13 commented Oct 28, 2025

I'm not getting data. I see empty file.

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