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