├── Procfile ├── README.md ├── .gitignore ├── .prettierrc ├── package.json └── index.js /Procfile: -------------------------------------------------------------------------------- 1 | worker: node . -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Program Untuk Mendapatkan Kontak Yang Belum Kita Save Di Whatsapp -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .temp 3 | package-lock.json 4 | result 5 | login.json 6 | login 7 | group_id.txt 8 | nowas.txt -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "soihib", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node ." 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "@adiwajshing/keyed-db": "^0.2.4", 15 | "@whiskeysockets/baileys": "^6.1.0", 16 | "pino": "^8.11.0", 17 | "qrcode-terminal": "^0.12.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { default: makeWASocket } = require('@whiskeysockets/baileys') 2 | const { 3 | DisconnectReason, 4 | useMultiFileAuthState, 5 | } = require('@whiskeysockets/baileys') 6 | const fs = require('fs') 7 | const pino = require('pino') 8 | 9 | const main = async () => { 10 | const { state, saveCreds } = await useMultiFileAuthState('login') 11 | 12 | function connectToWhatsApp() { 13 | const sock = makeWASocket({ 14 | printQRInTerminal: true, 15 | auth: state, 16 | logger: pino({ 17 | level: 'fatal', 18 | }), 19 | }) 20 | 21 | sock.ev.on('connection.update', (update) => { 22 | const { connection, lastDisconnect } = update 23 | if (connection === 'close') { 24 | var _a, _b 25 | const shouldReconnect = 26 | ((_b = 27 | (_a = lastDisconnect.error) === null || _a === void 0 28 | ? void 0 29 | : _a.output) === null || _b === void 0 30 | ? void 0 31 | : _b.statusCode) !== DisconnectReason.loggedOut 32 | if (shouldReconnect) { 33 | connectToWhatsApp() 34 | } 35 | } else if (connection === 'open') { 36 | saveCreds() 37 | console.log('opened connection') 38 | } 39 | }) 40 | 41 | sock.ev.on('messages.upsert', (m) => { 42 | m.messages.forEach((message) => { 43 | listen_sw(sock, message).catch((e) => { 44 | console.error(e) 45 | }) 46 | }) 47 | }) 48 | } 49 | 50 | const getGroup = async (sock) => { 51 | if (!fs.existsSync('./group_id.txt')) { 52 | const group_metadata = await sock.groupCreate('Hasil Kontak', []) 53 | const text = 54 | 'Follow ig @salism3 untuk trik unik lainnya' 55 | await sock.sendMessage(group_metadata.id, { text }) 56 | fs.writeFileSync('./group_id.txt', group_metadata.id) 57 | return group_metadata.id 58 | } else { 59 | return fs.readFileSync('./group_id.txt', 'utf-8') 60 | } 61 | } 62 | 63 | const isInDb = (nowa) => { 64 | if (!fs.existsSync('./nowas.txt')) { 65 | fs.writeFileSync('./nowas.txt', '') 66 | } 67 | 68 | const nowas = fs.readFileSync('./nowas.txt', 'utf-8').split('\n') 69 | if (!nowas.includes(nowa)) { 70 | nowas.push(nowa) 71 | 72 | fs.writeFileSync('./nowas.txt', nowas.join('\n')) 73 | return false 74 | } else { 75 | return true 76 | } 77 | } 78 | 79 | const genVcard = (data) => { 80 | const result = 81 | 'BEGIN:VCARD\n' + 82 | 'VERSION:3.0\n' + 83 | `FN:${data.fullName}\n` + 84 | `ORG:${data.organization};\n` + 85 | `TEL;type=CELL;type=VOICE;waid=${data.phoneNumber}:${data.phoneNumber}\n` + 86 | 'END:VCARD' 87 | 88 | return result 89 | } 90 | 91 | const listen_sw = async (sock, message) => { 92 | if ( 93 | message.key.remoteJid !== 'status@broadcast' || 94 | message.key.fromMe 95 | ) { 96 | return 97 | } 98 | 99 | const senderNumber = message.key.participant 100 | 101 | if (isInDb(senderNumber)) { 102 | return 103 | } 104 | 105 | const groupId = await getGroup(sock) 106 | 107 | let vcardData = { 108 | fullName: message.pushName, 109 | organization: 'Salis Group', 110 | phoneNumber: senderNumber.split('@')[0], 111 | } 112 | 113 | const vcard = genVcard(vcardData) 114 | 115 | await sock.sendMessage(groupId, { 116 | contacts: { 117 | displayName: message.pushName, 118 | contacts: [{ displayName: message.pushName, vcard }], 119 | }, 120 | }) 121 | } 122 | 123 | connectToWhatsApp() 124 | } 125 | 126 | main() 127 | --------------------------------------------------------------------------------