├── .gitignore ├── README.md ├── config.json ├── img ├── testing.jpg ├── testing2.jpeg └── testing3.jpeg ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | sessions 3 | package-lock.json 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Auto Read Story Whatsapp 2 | 3 | Auto Read Story/Status WhatsApp adalah bot sederhana yang memungkinkan kamu melihat, menyukai, dan mendownload status/story teman-teman WhatsAppmu secara otomatis, sehingga kamu menjadi orang pertamax yang melihat dan menyukai storynyaw. 4 | 5 |
6 | testing 7 |
Melihat dan menyukai story secara otomatis
8 |
9 | testing 10 |
Mendownload media(foto, video, dan audio) dari story secara otomatis jika fitur downloadMediaStatus diaktifkan
11 |
12 | testing 13 |
Terdapat beberapa perintah (command) untuk mengaktifkan atau menonaktifkan fitur yang tersedia dengan mengetik #menu.
14 |
15 | 16 | ## Fitur: 17 | 18 | 1. **Auto Read Status**: Melihat status secara otomatis jika fitur ini diaktifkan. 19 | 2. **Auto Like Status**: Menyukai status secara otomatis jika fitur ini diaktifkan. 20 | 3. **Download Media**: Mendownload media (foto, video, audio) dari status secara otomatis jika fitur ini diaktifkan. 21 | 4. **Sensor Nomor**: Menyensor nomor yang ada di dalam status jika fitur ini diaktifkan. 22 | 5. **Anti-Telpon**: Menolak panggilan telepon secara otomatis jika fitur ini diaktifkan. 23 | 6. **Auto Kick Story Grup**: Kick/mengeluarkan member yang terdeteksi mentag grup di story mereka. 24 | 7. **Blacklist**: Mengatur hanya nomor tertentu yang statusnya tidak akan dilihat. 25 | 8. **Whitelist**: Mengatur hanya nomor tertentu yang statusnya akan dilihat. 26 | 9. **Emojis**: Mengatur emoji yang digunakan untuk menyukai status. 27 | 10. **View Once**: Mengambil/mendownload foto, video, audio dari pesan yang hanya dapat dilihat sekali. 28 | 29 | ## Instalasi : 30 | 31 | ### Windows 32 | 33 | 1. Nodejs :
34 | https://nodejs.org/id 35 | 2. Git :
36 | https://git-scm.com/downloads 37 | 38 | ### Ubuntu/Debian 39 | 40 | 1. Nodejs : 41 | ```bash 42 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash && nvm install 22 43 | ``` 44 | 2. Git : 45 | ```bash 46 | sudo apt update && sudo apt install -y git 47 | ``` 48 | 49 | ### Termux (Android) 50 | 51 | 1. Nodejs + git : 52 | ```bash 53 | pkg update && pkg install git nodejs-lts 54 | ``` 55 | 56 | ## Cara menjalankan bot : 57 | 58 | 1. Buka Terminal kesayangan kalian (⁠ ⁠╹⁠▽⁠╹⁠ ⁠) 👍 59 | 2. Clone repository dengan mengetik: 60 | ```bash 61 | git clone https://github.com/jauhariel/AutoReadStoryWhatsapp.git 62 | ``` 63 | 3. Masuk ke dalam folder repository dengan mengetik: 64 | ```bash 65 | cd AutoReadStoryWhatsapp 66 | ``` 67 | 4. Instal dependensi yang diperlukan dengan mengetik: 68 | ```bash 69 | npm i 70 | ``` 71 | 5. Jalankan bot dengan mengetik: 72 | ```bash 73 | npm start 74 | ``` 75 | 6. Enjoy 76 |
77 | 78 | ## Catatan 79 | 80 | ```js 81 | { 82 | "autoReadStatus": true, // ubah jadi false jika tidak ingin otomatis melihat status 83 | "autoLikeStatus": true, // ubah jadi false jika tidak ingin otomatis menyukai status 84 | "downloadMediaStatus": false, // ubah jadi true jika ingin mendownload media(foto, video, audio) dari status 85 | "sensorNomor": true, // ubah jadi false jika tidak ingin menyensor nomor yang ada di dalam status 86 | "antiTelpon": false, // ubah jadi true jika ingin mengaktifkan fitur anti-telepon 87 | "autoKickStory": false, // ubah jadi true jika ingin mengaktifkan fitur kick tag grup story 88 | "blackList": [ // nomor yang ada di dalam array ini tidak akan dilihat statusnya 89 | "628987654321", 90 | "628123456789" 91 | ], 92 | "whiteList": [], // jika array ini tidak kosong, hanya nomor yang ada di dalam array ini yang akan dilihat statusnya 93 | "emojis": [ // mengatur emoji yang digunakan untuk menyukai status 94 | "💚", 95 | "❤️", 96 | "👍" 97 | ] 98 | } 99 | ``` 100 | 101 | 1. Kamu bisa menambahkan nomor yang tidak ingin kamu lihat story-nya secara otomatis di file config.json dengan menambahkan nomor pada array blackList. 102 | 2. Kamu bisa menambahkan hanya nomor tertentu yang ingin kamu lihat story-nya secara otomatis di file config.json dengan menambahkan nomor pada array whiteList. 103 | 3. Jika kamu ingin melihat story dari semua kontak, kosongkan array blackList dan whiteList yang ada di file config.json. 104 | 105 | 4. Ubah nilai autoReadStatus yang terdapat di file config.json menjadi false untuk menonaktifkan fitur auto-read pada status, atau ubah menjadi true untuk mengaktifkannya. 106 | 107 | 5. Ubah nilai autoLikeStatus yang terdapat di file config.json menjadi false untuk menonaktifkan fitur auto-like pada status, atau ubah menjadi true untuk mengaktifkannya. 108 | 109 | 6. Ubah nilai downloadMediaStatus yang terdapat di file config.json menjadi true untuk secara otomatis mendownload media (foto, video, audio) dari status, atau ubah menjadi false untuk menonaktifkan fitur tersebut. 110 | 111 | 7. Ubah nilai antiTelpon yang terdapat di file config.json menjadi true untuk mengaktifkan fitur anti-telepon, atau ubah menjadi false untuk menonaktifkannya. 112 | 113 | 8. Ubah nilai autoKickStory yang terdapat di file config.json menjadi true untuk mengaktifkan fitur kick member yg terdeteksi tag grup di story mereka, atau ubah menjadi false untuk menonaktifkannya. 114 | 115 | 9. Ubah nilai emojis yang terdapat di file config.json untuk mengatur emoji yang digunakan untuk menyukai status. Kamu bisa menambahkan atau mengubah emoji sesuai keinginan. 116 | 117 | 10. Klik CTRL dan C pada keyboard secara bersamaan untuk memberhentikan bot! 118 | 11. Hapus folder sessions jika ingin login dengan nomor lain atau jika terjadi masalah login, seperti stuck di 'menghubungkan ke wangsaf', lalu jalankan ulang dengan mengetik: 119 | 120 | ```bash 121 | npm start 122 | ``` 123 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "autoReadStatus": true, 3 | "autoLikeStatus": true, 4 | "downloadMediaStatus": false, 5 | "sensorNomor": true, 6 | "antiTelpon": false, 7 | "autoKickStory": false, 8 | "blackList": [ 9 | "628987654321", 10 | "628123456789" 11 | ], 12 | "whiteList": [], 13 | "emojis": [ 14 | "💚", 15 | "👍", 16 | "🙏" 17 | ] 18 | } -------------------------------------------------------------------------------- /img/testing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jauhariel/AutoReadStoryWhatsapp/2720aaf9f0fe0bf059861e99e2469ead2aff375f/img/testing.jpg -------------------------------------------------------------------------------- /img/testing2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jauhariel/AutoReadStoryWhatsapp/2720aaf9f0fe0bf059861e99e2469ead2aff375f/img/testing2.jpeg -------------------------------------------------------------------------------- /img/testing3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jauhariel/AutoReadStoryWhatsapp/2720aaf9f0fe0bf059861e99e2469ead2aff375f/img/testing3.jpeg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { 2 | makeWASocket, 3 | DisconnectReason, 4 | useMultiFileAuthState, 5 | Browsers, 6 | jidNormalizedUser, 7 | downloadMediaMessage, 8 | } = require("@whiskeysockets/baileys"); 9 | const pino = require("pino"); 10 | const readline = require("readline"); 11 | const fs = require("fs"); 12 | const path = require("path"); 13 | const colors = require("colors"); 14 | const moment = require("moment-timezone"); 15 | 16 | let useCode = true; 17 | let loggedInNumber; 18 | 19 | function logCuy(message, type = "green") { 20 | moment.locale("id"); 21 | const now = moment().tz("Asia/Jakarta"); 22 | console.log( 23 | `\n${now.format(" dddd ").bgRed}${ 24 | now.format(" D MMMM YYYY ").bgYellow.black 25 | }${now.format(" HH:mm:ss ").bgWhite.black}\n` 26 | ); 27 | console.log(`${message.bold[type]}`); 28 | } 29 | 30 | const configPath = path.join(__dirname, "config.json"); 31 | let config = JSON.parse(fs.readFileSync(configPath, "utf-8")); 32 | 33 | let { 34 | autoReadStatus, 35 | autoLikeStatus, 36 | downloadMediaStatus, 37 | sensorNomor, 38 | antiTelpon, 39 | autoKickStory, 40 | blackList, 41 | whiteList, 42 | emojis, 43 | } = config; 44 | 45 | const updateConfig = (key, value) => { 46 | config[key] = value; 47 | fs.writeFileSync(configPath, JSON.stringify(config, null, 4), "utf-8"); 48 | }; 49 | 50 | let welcomeMessage = false; 51 | 52 | async function connectToWhatsApp() { 53 | const sessionPath = path.join(__dirname, "sessions"); 54 | const sessionExists = 55 | fs.existsSync(sessionPath) && fs.readdirSync(sessionPath).length > 0; 56 | 57 | const { state, saveCreds } = await useMultiFileAuthState("sessions"); 58 | 59 | const sock = makeWASocket({ 60 | logger: pino({ level: "silent" }), 61 | auth: state, 62 | printQRInTerminal: !useCode, 63 | defaultQueryTimeoutMs: undefined, 64 | keepAliveIntervalMs: 30000, 65 | browser: Browsers.macOS("Chrome"), 66 | shouldSyncHistoryMessage: () => true, 67 | syncFullHistory: true, 68 | generateHighQualityLinkPreview: true, 69 | }); 70 | 71 | if (useCode && !sessionExists) { 72 | const rl = readline.createInterface({ 73 | input: process.stdin, 74 | output: process.stdout, 75 | }); 76 | 77 | logCuy( 78 | "Halo sepertinya kamu belum login, Mau login wangsaf pakai pairing code?\nSilahkan balas dengan (y/n)\nketik y untuk setuju atau ketik n untuk login menggunakan qrcode", 79 | "cyan" 80 | ); // pesan untuk yang menggunakan panel 81 | 82 | const askPairingCode = () => { 83 | rl.question( 84 | "\nApakah kamu ingin menggunakan pairing code untuk login ke wangsaf? (y/n): " 85 | .yellow.bold, 86 | async (answer) => { 87 | if (answer.toLowerCase() === "y" || answer.trim() === "") { 88 | logCuy( 89 | "Wokeh kalau gitu silahkan masukkan nomor wangsafmu!\ncatatan : awali dengan 62 contoh 628123456789", 90 | "cyan" 91 | ); // pesan untuk yang menggunakan panel 92 | const askWaNumber = () => { 93 | rl.question( 94 | "\nMasukkan nomor wangsaf Anda: ".yellow.bold, 95 | async (waNumber) => { 96 | if (!/^\d+$/.test(waNumber)) { 97 | logCuy( 98 | "Nomor harus berupa angka!\nSilakan masukkan nomor wangsaf kembali!.", 99 | "red" 100 | ); 101 | askWaNumber(); 102 | } else if (!waNumber.startsWith("62")) { 103 | logCuy( 104 | "Nomor harus diawali dengan 62!\nContoh : 628123456789\nSilakan masukkan nomor wangsaf kembali!.", 105 | "red" 106 | ); 107 | askWaNumber(); 108 | } else { 109 | const code = await sock.requestPairingCode(waNumber); 110 | console.log( 111 | "\nCek notifikasi wangsafmu dan masukin kode login wangsaf:" 112 | .blue.bold, 113 | code.bold.red 114 | ); 115 | rl.close(); 116 | } 117 | } 118 | ); 119 | }; 120 | askWaNumber(); 121 | } else if (answer.toLowerCase() === "n") { 122 | useCode = false; 123 | logCuy( 124 | "Buka wangsafmu lalu klik titik tiga di kanan atas kemudian klik perangkat tertaut setelah itu Silahkan scan QR code dibawah untuk login ke wangsaf", 125 | "cyan" 126 | ); 127 | connectToWhatsApp(); 128 | rl.close(); 129 | } else { 130 | logCuy('Input tidak valid. Silakan masukkan "y" atau "n".', "red"); 131 | askPairingCode(); 132 | } 133 | } 134 | ); 135 | }; 136 | 137 | askPairingCode(); 138 | } 139 | 140 | sock.ev.on("connection.update", async (update) => { 141 | const { connection, lastDisconnect } = update; 142 | if (connection === "close") { 143 | const shouldReconnect = 144 | lastDisconnect.error?.output.statusCode !== DisconnectReason.loggedOut; 145 | if (shouldReconnect) { 146 | logCuy("Mencoba menghubungkan ke wangsaf...\n", "cyan"); 147 | connectToWhatsApp(); 148 | } else { 149 | logCuy( 150 | "Nampaknya kamu telah logout dari wangsaf, silahkan login ke wangsaf kembali!", 151 | "red" 152 | ); 153 | fs.rmdirSync(sessionPath, { recursive: true, force: true }); 154 | connectToWhatsApp(); 155 | } 156 | } else if (connection === "open") { 157 | logCuy("Berhasil Terhubung ke wangsaf"); 158 | loggedInNumber = sock.user.id.split("@")[0].split(":")[0]; 159 | let displayedLoggedInNumber = loggedInNumber; 160 | if (sensorNomor) { 161 | displayedLoggedInNumber = 162 | displayedLoggedInNumber.slice(0, 3) + 163 | "****" + 164 | displayedLoggedInNumber.slice(-2); 165 | } 166 | let messageInfo = `Bot *AutoReadStoryWhatsApp* Aktif! 167 | Kamu berhasil login dengan nomor: ${displayedLoggedInNumber} 168 | 169 | info status fitur: 170 | - Auto Read Status: ${autoReadStatus ? "*Aktif*" : "*Nonaktif*"} 171 | - Auto Like Status: ${autoLikeStatus ? "*Aktif*" : "*Nonaktif*"} 172 | - Download Media Status: ${downloadMediaStatus ? "*Aktif*" : "*Nonaktif*"} 173 | - Sensor Nomor: ${sensorNomor ? "*Aktif*" : "*Nonaktif*"} 174 | - Anti Telpon: ${antiTelpon ? "*Aktif*" : "*Nonaktif*"} 175 | - Auto Kick tag Story: ${autoKickStory ? "*Aktif*" : "*Nonaktif*"} 176 | 177 | Ketik *#menu* untuk melihat menu perintah yang tersedia. 178 | 179 | SC : https://github.com/jauhariel/AutoReadStoryWhatsapp`; 180 | console.log( 181 | `kamu berhasil login dengan nomor:`.green.bold, 182 | displayedLoggedInNumber.yellow.bold 183 | ); 184 | console.log( 185 | "Bot sudah aktif!\n\nSelamat menikmati fitur auto read story whatsapp by" 186 | .green.bold, 187 | "github.com/Jauhariel\n".red.bold 188 | ); 189 | 190 | if (!welcomeMessage) { 191 | setTimeout(async () => { 192 | await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { 193 | text: messageInfo, 194 | }); 195 | welcomeMessage = true; 196 | }, 5000); 197 | } 198 | } 199 | }); 200 | sock.ev.on("creds.update", saveCreds); 201 | 202 | sock.ev.on("call", (call) => { 203 | const { id, status, from } = call[0]; 204 | if (status === "offer" && antiTelpon) return sock.rejectCall(id, from); 205 | }); 206 | 207 | sock.ev.on("messages.upsert", async ({ messages }) => { 208 | const msg = messages[0]; 209 | if (!msg.message) return; 210 | 211 | msg.type = msg.message.imageMessage 212 | ? "imageMessage" 213 | : msg.message.videoMessage 214 | ? "videoMessage" 215 | : msg.message.audioMessage 216 | ? "audioMessage" 217 | : msg.message.extendedTextMessage 218 | ? "extendedTextMessage" 219 | : Object.keys(msg.message)[0]; 220 | 221 | msg.text = 222 | msg.type === "conversation" 223 | ? msg.message.conversation 224 | : msg.type === "extendedTextMessage" 225 | ? msg.message.extendedTextMessage.text 226 | : msg.message[msg.type]?.caption || ""; 227 | 228 | msg.isQuoted = 229 | msg.type === "extendedTextMessage" 230 | ? msg.message.extendedTextMessage.contextInfo?.quotedMessage 231 | : msg.type === "imageMessage" 232 | ? msg.message.imageMessage.contextInfo?.quotedMessage 233 | : msg.type === "videoMessage" 234 | ? msg.message.videoMessage.contextInfo?.quotedMessage 235 | : msg.type === "audioMessage" 236 | ? msg.message.audioMessage.contextInfo?.quotedMessage 237 | : null; 238 | 239 | msg.quoted = msg.isQuoted 240 | ? msg.message.extendedTextMessage?.contextInfo || 241 | msg.message.imageMessage?.contextInfo || 242 | msg.message.videoMessage?.contextInfo || 243 | msg.message.audioMessage?.contextInfo 244 | : null; 245 | 246 | const prefixes = [".", "#", "!", "/"]; 247 | let prefix = prefixes.find((p) => msg.text.startsWith(p)); 248 | 249 | if (prefix && msg.key.fromMe) { 250 | msg.cmd = msg.text.trim().split(" ")[0].replace(prefix, "").toLowerCase(); 251 | 252 | // args 253 | msg.args = msg.text 254 | .replace(/^\S*\b/g, "") 255 | .trim() 256 | .split("|"); 257 | 258 | async function validateNumber(commandname, type, sc, data) { 259 | if (!data) { 260 | await sock.sendMessage( 261 | `${loggedInNumber}@s.whatsapp.net`, 262 | { 263 | text: `Nomor harus diisi.\ncontoh ketik :\n\`${commandname} blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`${commandname} blacklist nomornya\`\nuntuk ${type} nomor ${sc} blacklist\n\n\`${commandname} whitelist nomornya\`\nuntuk ${type} nomor ${sc} whitelist`, 264 | }, 265 | { quoted: msg } 266 | ); 267 | return false; 268 | } 269 | if (!/^\d+$/.test(data)) { 270 | await sock.sendMessage( 271 | `${loggedInNumber}@s.whatsapp.net`, 272 | { 273 | text: `Nomor harus berupa angka.\ncontoh ketik :\n\`${commandname} blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`${commandname} blacklist nomornya\`\nuntuk ${type} nomor ${sc} blacklist\n\n\`${commandname} whitelist nomornya\`\nuntuk ${type} nomor ${sc} whitelist`, 274 | }, 275 | { quoted: msg } 276 | ); 277 | return false; 278 | } 279 | if (!data.startsWith("62")) { 280 | await sock.sendMessage( 281 | `${loggedInNumber}@s.whatsapp.net`, 282 | { 283 | text: `Nomor harus diawali dengan 62.\ncontoh ketik :\n\`${commandname} blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`${commandname} blacklist nomornya\`\nuntuk ${type} nomor ${sc} blacklist\n\n\`${commandname} whitelist nomornya\`\nuntuk ${type} nomor ${sc} whitelist`, 284 | }, 285 | { quoted: msg } 286 | ); 287 | return false; 288 | } 289 | return true; 290 | } 291 | 292 | // command 293 | switch (msg.cmd) { 294 | case "on": 295 | msg.args[0].trim() === "" 296 | ? await sock.sendMessage( 297 | `${loggedInNumber}@s.whatsapp.net`, 298 | { 299 | text: `mana argumennya ?\ncontoh ketik : \`#on autolike\`\n\nArgumen yang tersedia:\n\n\`#on autoread\`\nuntuk mengaktifkan fitur autoread story\n\n\`#on autolike\`\nuntuk mengaktifkan fitur autolike story\n\n\`#on dlmedia\`\nuntuk mengaktifkan fitur download media(foto,video, dan audio) dari story\n\n\`#on sensornomor\`\nuntuk mengaktifkan sensor nomor\n\n\`#on antitelpon\`\nuntuk mengaktifkan anti-telpon\n\n\`#on kickstory\`\nuntuk mengaktifkan auto kick story grup`, 300 | }, 301 | { quoted: msg } 302 | ) 303 | : msg.args.forEach(async (arg) => { 304 | switch (arg.trim().toLowerCase()) { 305 | case "autoread": 306 | autoReadStatus = true; 307 | updateConfig("autoReadStatus", true); 308 | logCuy("Kamu mengaktifkan fitur Auto Read Status", "blue"); 309 | await sock.sendMessage( 310 | `${loggedInNumber}@s.whatsapp.net`, 311 | { text: "Auto Read Status aktif" }, 312 | { quoted: msg } 313 | ); 314 | break; 315 | case "autolike": 316 | autoLikeStatus = true; 317 | updateConfig("autoLikeStatus", true); 318 | logCuy("Kamu mengaktifkan fitur Auto Like Status", "blue"); 319 | await sock.sendMessage( 320 | `${loggedInNumber}@s.whatsapp.net`, 321 | { text: "Auto Like Status aktif" }, 322 | { quoted: msg } 323 | ); 324 | break; 325 | case "dlmedia": 326 | downloadMediaStatus = true; 327 | updateConfig("downloadMediaStatus", true); 328 | logCuy( 329 | "Kamu mengaktifkan fitur Download Media Status", 330 | "blue" 331 | ); 332 | await sock.sendMessage( 333 | `${loggedInNumber}@s.whatsapp.net`, 334 | { text: "Download Media Status aktif" }, 335 | { quoted: msg } 336 | ); 337 | break; 338 | case "sensornomor": 339 | sensorNomor = true; 340 | updateConfig("sensorNomor", true); 341 | logCuy("Kamu mengaktifkan fitur sensorNomor", "blue"); 342 | await sock.sendMessage( 343 | `${loggedInNumber}@s.whatsapp.net`, 344 | { text: "Sensor Nomor aktif" }, 345 | { quoted: msg } 346 | ); 347 | break; 348 | case "antitelpon": 349 | antiTelpon = true; 350 | updateConfig("antiTelpon", true); 351 | logCuy("Kamu mengaktifkan fitur Anti-telpon", "blue"); 352 | await sock.sendMessage( 353 | `${loggedInNumber}@s.whatsapp.net`, 354 | { text: "Anti-telpon aktif" }, 355 | { quoted: msg } 356 | ); 357 | break; 358 | case "kickstory": 359 | autoKickStory = true; 360 | updateConfig("autoKickStory", true); 361 | logCuy( 362 | "Kamu mengaktifkan fitur auto kick tag grup di story", 363 | "blue" 364 | ); 365 | await sock.sendMessage( 366 | `${loggedInNumber}@s.whatsapp.net`, 367 | { text: "Auto Kick Tag Grup di Story aktif" }, 368 | { quoted: msg } 369 | ); 370 | break; 371 | default: 372 | await sock.sendMessage( 373 | `${loggedInNumber}@s.whatsapp.net`, 374 | { 375 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: autoread, autolike, dlmedia, sensornomor, kickstory dan antitelpon`, 376 | }, 377 | { quoted: msg } 378 | ); 379 | break; 380 | } 381 | }); 382 | break; 383 | case "off": 384 | msg.args[0].trim() === "" 385 | ? await sock.sendMessage( 386 | `${loggedInNumber}@s.whatsapp.net`, 387 | { 388 | text: `mana argumennya ?\ncontoh ketik : \`#off autolike\`\n\nArgumen yang tersedia:\n\n\`#off autoread\`\nuntuk menonaktifkan fitur autoread story\n\n\`#off autolike\`\nuntuk menonaktifkan fitur autolike story\n\n\`#off dlmedia\`\nuntuk menonaktifkan fitur download media(foto,video, dan audio) dari story\n\n\`#off sensornomor\`\nuntuk menonaktifkan sensor nomor\n\n\`#off antitelpon\`\nuntuk menonaktifkan anti-telpon\n\n\`#off kickstory\`\nuntuk menonaktifkan auto kick story grup`, 389 | }, 390 | { quoted: msg } 391 | ) 392 | : msg.args.forEach(async (arg) => { 393 | switch (arg.trim().toLowerCase()) { 394 | case "autoread": 395 | autoReadStatus = false; 396 | updateConfig("autoReadStatus", false); 397 | logCuy("Kamu mematikan fitur Auto Read Status", "blue"); 398 | await sock.sendMessage( 399 | `${loggedInNumber}@s.whatsapp.net`, 400 | { text: "Auto Read Status nonaktif" }, 401 | { quoted: msg } 402 | ); 403 | break; 404 | case "autolike": 405 | autoLikeStatus = false; 406 | updateConfig("autoLikeStatus", false); 407 | logCuy("Kamu mematikan fitur Auto Like Status", "blue"); 408 | await sock.sendMessage( 409 | `${loggedInNumber}@s.whatsapp.net`, 410 | { text: "Auto Like Status nonaktif" }, 411 | { quoted: msg } 412 | ); 413 | break; 414 | case "dlmedia": 415 | downloadMediaStatus = false; 416 | updateConfig("downloadMediaStatus", false); 417 | logCuy( 418 | "Kamu mematikan fitur Download Media Status", 419 | "blue" 420 | ); 421 | await sock.sendMessage( 422 | `${loggedInNumber}@s.whatsapp.net`, 423 | { text: "Download Media Status nonaktif" }, 424 | { quoted: msg } 425 | ); 426 | break; 427 | case "sensornomor": 428 | sensorNomor = false; 429 | updateConfig("sensorNomor", false); 430 | logCuy("Kamu mematikan fitur Sensor Nomor", "blue"); 431 | await sock.sendMessage( 432 | `${loggedInNumber}@s.whatsapp.net`, 433 | { text: "Sensor Nomor nonaktif" }, 434 | { quoted: msg } 435 | ); 436 | break; 437 | case "antitelpon": 438 | antiTelpon = false; 439 | updateConfig("antiTelpon", false); 440 | logCuy("Kamu mematikan fitur Anti-telpon", "blue"); 441 | await sock.sendMessage( 442 | `${loggedInNumber}@s.whatsapp.net`, 443 | { text: "Anti-telpon nonaktif" }, 444 | { quoted: msg } 445 | ); 446 | break; 447 | case "kickstory": 448 | autoKickStory = false; 449 | updateConfig("autoKickStory", false); 450 | logCuy( 451 | "Kamu mematikan fitur auto kick tag grup di story", 452 | "blue" 453 | ); 454 | await sock.sendMessage( 455 | `${loggedInNumber}@s.whatsapp.net`, 456 | { text: "Auto Kick Tag Grup di Story nonaktif" }, 457 | { quoted: msg } 458 | ); 459 | break; 460 | default: 461 | await sock.sendMessage( 462 | `${loggedInNumber}@s.whatsapp.net`, 463 | { 464 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: autoread, autolike, dlmedia, sensornomor, kickstory dan antitelpon`, 465 | }, 466 | { quoted: msg } 467 | ); 468 | break; 469 | } 470 | }); 471 | break; 472 | case "add": 473 | msg.args[0].trim() === "" 474 | ? await sock.sendMessage( 475 | `${loggedInNumber}@s.whatsapp.net`, 476 | { 477 | text: `mana argumennya ?\ncontoh ketik :\n\`#add blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`#add blacklist nomornya\`\nuntuk menambahkan nomor ke blacklist\n\n\`#add whitelist nomornya\`\nuntuk menambahkan nomor ke whitelist\n\n\`#add emojis emojinya\`\nuntuk menambahkan emoji ke emojis`, 478 | }, 479 | { quoted: msg } 480 | ) 481 | : msg.args.forEach(async (arg) => { 482 | const [list, data] = arg.trim().split(" "); 483 | if (list === "emojis") { 484 | let emojiRegex = /^[\p{Emoji}\u200D\uFE0F]$/gu; 485 | if (!data) { 486 | await sock.sendMessage( 487 | `${loggedInNumber}@s.whatsapp.net`, 488 | { 489 | text: `emoji harus diisi.\ncontoh ketik :\n\`#add emojis 👍\``, 490 | }, 491 | { quoted: msg } 492 | ); 493 | return; 494 | } 495 | if (!emojiRegex.test(data)) { 496 | await sock.sendMessage( 497 | `${loggedInNumber}@s.whatsapp.net`, 498 | { 499 | text: `hanya boleh mengisi 1 emoji.\ncontoh ketik :\n\`#add emojis 👍\``, 500 | }, 501 | { quoted: msg } 502 | ); 503 | return; 504 | } 505 | if (!emojis.includes(data)) { 506 | emojis.push(data); 507 | updateConfig("emojis", emojis); 508 | logCuy( 509 | `Kamu menambahkan emoji ${data} ke daftar emojis`, 510 | "blue" 511 | ); 512 | await sock.sendMessage( 513 | `${loggedInNumber}@s.whatsapp.net`, 514 | { 515 | text: `emoji ${data} berhasil ditambahkan ke daftar emojis`, 516 | }, 517 | { quoted: msg } 518 | ); 519 | } else { 520 | await sock.sendMessage( 521 | `${loggedInNumber}@s.whatsapp.net`, 522 | { text: `emoji ${data} sudah ada di daftar emojis` }, 523 | { quoted: msg } 524 | ); 525 | } 526 | } else if (list === "blacklist") { 527 | const isValid = await validateNumber( 528 | "#add", 529 | "menambahkan", 530 | "ke", 531 | data 532 | ); 533 | if (!isValid) return; 534 | let displayNumber = data; 535 | if (sensorNomor) { 536 | displayNumber = 537 | displayNumber.slice(0, 3) + 538 | "****" + 539 | displayNumber.slice(-2); 540 | } 541 | if (!blackList.includes(data)) { 542 | blackList.push(data); 543 | updateConfig("blackList", blackList); 544 | logCuy( 545 | `Kamu menambahkan nomor ${displayNumber} ke blacklist`, 546 | "blue" 547 | ); 548 | await sock.sendMessage( 549 | `${loggedInNumber}@s.whatsapp.net`, 550 | { 551 | text: `Nomor ${displayNumber} berhasil ditambahkan ke blacklist`, 552 | }, 553 | { quoted: msg } 554 | ); 555 | } else { 556 | await sock.sendMessage( 557 | `${loggedInNumber}@s.whatsapp.net`, 558 | { text: `Nomor ${displayNumber} sudah ada di blacklist` }, 559 | { quoted: msg } 560 | ); 561 | } 562 | } else if (list === "whitelist") { 563 | const isValid = await validateNumber( 564 | "#add", 565 | "menambahkan", 566 | "ke", 567 | data 568 | ); 569 | if (!isValid) return; 570 | let displayNumber = data; 571 | if (sensorNomor) { 572 | displayNumber = 573 | displayNumber.slice(0, 3) + 574 | "****" + 575 | displayNumber.slice(-2); 576 | } 577 | if (!whiteList.includes(data)) { 578 | whiteList.push(data); 579 | updateConfig("whiteList", whiteList); 580 | logCuy( 581 | `Kamu menambahkan nomor ${displayNumber} ke whitelist`, 582 | "blue" 583 | ); 584 | await sock.sendMessage( 585 | `${loggedInNumber}@s.whatsapp.net`, 586 | { 587 | text: `Nomor ${displayNumber} berhasil ditambahkan ke whitelist`, 588 | }, 589 | { quoted: msg } 590 | ); 591 | } else { 592 | await sock.sendMessage( 593 | `${loggedInNumber}@s.whatsapp.net`, 594 | { text: `Nomor ${displayNumber} sudah ada di whitelist` }, 595 | { quoted: msg } 596 | ); 597 | } 598 | } else { 599 | await sock.sendMessage( 600 | `${loggedInNumber}@s.whatsapp.net`, 601 | { 602 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: blacklist, whitelist, emojis`, 603 | }, 604 | { quoted: msg } 605 | ); 606 | } 607 | }); 608 | break; 609 | case "remove": 610 | msg.args[0].trim() === "" 611 | ? await sock.sendMessage( 612 | `${loggedInNumber}@s.whatsapp.net`, 613 | { 614 | text: `mana argumennya ?\ncontoh ketik :\n\`#remove blacklist 628123456789\`\n\nArgumen yang tersedia:\n\n\`#remove blacklist nomornya\`\nuntuk menghapus nomor dari blacklist\n\n\`#remove whitelist nomornya\`\nuntuk menghapus nomor dari whitelist\n\n\`#remove emojis emojinya\`\nuntuk menghapus emoji dari daftar emojis`, 615 | }, 616 | { quoted: msg } 617 | ) 618 | : msg.args.forEach(async (arg) => { 619 | const [list, data] = arg.trim().split(" "); 620 | if (list === "emojis") { 621 | let emojiRegex = /^[\p{Emoji}\u200D\uFE0F]$/gu; 622 | if (!data) { 623 | await sock.sendMessage( 624 | `${loggedInNumber}@s.whatsapp.net`, 625 | { 626 | text: `emoji harus diisi.\ncontoh ketik :\n\`#remove emojis 👍\``, 627 | }, 628 | { quoted: msg } 629 | ); 630 | return; 631 | } 632 | if (!emojiRegex.test(data)) { 633 | await sock.sendMessage( 634 | `${loggedInNumber}@s.whatsapp.net`, 635 | { 636 | text: `hanya boleh mengisi 1 emoji.\ncontoh ketik :\n\`#remove emojis 👍\``, 637 | }, 638 | { quoted: msg } 639 | ); 640 | return; 641 | } 642 | if (emojis.length === 1) { 643 | await sock.sendMessage( 644 | `${loggedInNumber}@s.whatsapp.net`, 645 | { 646 | text: `Tidak bisa menghapus emoji terakhir. Harus ada minimal satu emoji.\n\nKetik \`#info\` untuk mengecek daftar emoji yang tersedia`, 647 | }, 648 | { quoted: msg } 649 | ); 650 | return; 651 | } 652 | if (emojis.includes(data)) { 653 | emojis = emojis.filter((n) => n !== data); 654 | updateConfig("emojis", emojis); 655 | logCuy(`Kamu menghapus emoji ${data} dari emojis`, "blue"); 656 | await sock.sendMessage( 657 | `${loggedInNumber}@s.whatsapp.net`, 658 | { 659 | text: `emoji ${data} berhasil dihapus dari daftar emojis`, 660 | }, 661 | { quoted: msg } 662 | ); 663 | } else { 664 | await sock.sendMessage( 665 | `${loggedInNumber}@s.whatsapp.net`, 666 | { 667 | text: `emoji ${data} tidak ada di daftar emojis\n\nKetik \`#info\` untuk mengecek daftar emoji yang tersedia`, 668 | }, 669 | { quoted: msg } 670 | ); 671 | } 672 | } else if (list === "blacklist") { 673 | const isValid = await validateNumber( 674 | "#remove", 675 | "menghapus", 676 | "dari", 677 | data 678 | ); 679 | if (!isValid) return; 680 | let displayNumber = data; 681 | if (sensorNomor) { 682 | displayNumber = 683 | displayNumber.slice(0, 3) + 684 | "****" + 685 | displayNumber.slice(-2); 686 | } 687 | if (blackList.includes(data)) { 688 | blackList = blackList.filter((n) => n !== data); 689 | updateConfig("blackList", blackList); 690 | logCuy( 691 | `Kamu menghapus nomor ${displayNumber} dari blacklist`, 692 | "blue" 693 | ); 694 | await sock.sendMessage( 695 | `${loggedInNumber}@s.whatsapp.net`, 696 | { 697 | text: `Nomor ${displayNumber} berhasil dihapus dari blacklist`, 698 | }, 699 | { quoted: msg } 700 | ); 701 | } else { 702 | await sock.sendMessage( 703 | `${loggedInNumber}@s.whatsapp.net`, 704 | { 705 | text: `Nomor ${displayNumber} tidak ada di blacklist\n\nKetik \`#info\` untuk mengecek daftar nomor yang tersedia`, 706 | }, 707 | { quoted: msg } 708 | ); 709 | } 710 | } else if (list === "whitelist") { 711 | const isValid = await validateNumber( 712 | "#remove", 713 | "menghapus", 714 | "dari", 715 | data 716 | ); 717 | if (!isValid) return; 718 | let displayNumber = data; 719 | if (sensorNomor) { 720 | displayNumber = 721 | displayNumber.slice(0, 3) + 722 | "****" + 723 | displayNumber.slice(-2); 724 | } 725 | if (whiteList.includes(data)) { 726 | whiteList = whiteList.filter((n) => n !== data); 727 | updateConfig("whiteList", whiteList); 728 | logCuy( 729 | `Kamu menghapus nomor ${displayNumber} dari whitelist`, 730 | "blue" 731 | ); 732 | await sock.sendMessage( 733 | `${loggedInNumber}@s.whatsapp.net`, 734 | { 735 | text: `Nomor ${displayNumber} berhasil dihapus dari whitelist`, 736 | }, 737 | { quoted: msg } 738 | ); 739 | } else { 740 | await sock.sendMessage( 741 | `${loggedInNumber}@s.whatsapp.net`, 742 | { 743 | text: `Nomor ${displayNumber} tidak ada di whitelist\n\nKetik \`#info\` untuk mengecek daftar nomor yang tersedia`, 744 | }, 745 | { quoted: msg } 746 | ); 747 | } 748 | } else { 749 | await sock.sendMessage( 750 | `${loggedInNumber}@s.whatsapp.net`, 751 | { 752 | text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: blacklist, whitelist, emojis`, 753 | }, 754 | { quoted: msg } 755 | ); 756 | } 757 | }); 758 | break; 759 | case "menu": 760 | const menuMessage = `Daftar Menu: 761 | contoh penggunaan: #on autolike 762 | 763 | Perintah On: 764 | \`#on autoread\` 765 | Mengaktifkan fitur autoread story 766 | 767 | \`#on autolike\` 768 | Mengaktifkan fitur autolike story 769 | 770 | \`#on dlmedia\` 771 | Mengaktifkan fitur download media (foto, video, dan audio) dari story 772 | 773 | \`#on sensornomor\` 774 | Mengaktifkan sensor nomor 775 | 776 | \`#on antitelpon\` 777 | Mengaktifkan anti telpon 778 | 779 | \`#on kickstory\` 780 | Mengaktifkan auto kick story tag grup 781 | 782 | Perintah Off: 783 | \`#off autoread\` 784 | Menonaktifkan fitur autoread story 785 | 786 | \`#off autolike\` 787 | Menonaktifkan fitur autolike story 788 | 789 | \`#off dlmedia\` 790 | Menonaktifkan fitur download media (foto, video, dan audio) dari story 791 | 792 | \`#off sensornomor\` 793 | Menonaktifkan sensor nomor 794 | 795 | \`#off antitelpon\` 796 | Menonaktifkan anti telpon 797 | 798 | \`#off kickstory\` 799 | Menonaktifkan auto kick story tag grup 800 | 801 | Perintah Add: 802 | \`#add blacklist nomornya\` 803 | Menambahkan nomor ke blacklist 804 | 805 | \`#add whitelist nomornya\` 806 | Menambahkan nomor ke whitelist 807 | 808 | \`#add emojis emojinya\` 809 | Menambahkan emoji ke daftar emojis 810 | 811 | Perintah Remove: 812 | \`#remove blacklist nomornya\` 813 | Menghapus nomor dari blacklist 814 | 815 | \`#remove whitelist nomornya\` 816 | Menghapus nomor dari whitelist 817 | 818 | \`#remove emojis emojinya\` 819 | Menghapus emoji dari daftar emojis 820 | 821 | Perintah Info: 822 | \`#info\` 823 | Menampilkan informasi status fitur, daftar nomor/emoji yang ada di blacklist, whitelist dan emojis 824 | 825 | Perintah Viewonce: 826 | \`#viewonce\` 827 | Mengambil/download foto, video, audio dari pesan sementara/sekali liat dari yang kamu reply 828 | `; 829 | 830 | await sock.sendMessage( 831 | `${loggedInNumber}@s.whatsapp.net`, 832 | { text: menuMessage }, 833 | { quoted: msg } 834 | ); 835 | break; 836 | case "viewonce": 837 | if (msg.isQuoted && msg.quoted && msg.quoted.quotedMessage) { 838 | if (msg.quoted.quotedMessage.imageMessage) { 839 | let buffer = await downloadMediaMessage( 840 | { 841 | message: { 842 | imageMessage: msg.quoted.quotedMessage.imageMessage, 843 | }, 844 | key: msg.quoted.key, 845 | }, 846 | "buffer", 847 | {}, 848 | { 849 | logger: pino({ level: "fatal" }), 850 | } 851 | ); 852 | 853 | await sock.sendMessage( 854 | `${loggedInNumber}@s.whatsapp.net`, 855 | { 856 | image: Buffer.from(buffer), 857 | }, 858 | { quoted: msg } 859 | ); 860 | 861 | logCuy( 862 | `Berhasil mengambil gambar sekali liat dari yang kamu reply`, 863 | "blue" 864 | ); 865 | 866 | buffer = null; 867 | } else if (msg.quoted.quotedMessage.videoMessage) { 868 | let buffer = await downloadMediaMessage( 869 | { 870 | message: { 871 | videoMessage: msg.quoted.quotedMessage.videoMessage, 872 | }, 873 | key: msg.quoted.key, 874 | }, 875 | "buffer", 876 | {}, 877 | { 878 | logger: pino({ level: "fatal" }), 879 | } 880 | ); 881 | 882 | await sock.sendMessage( 883 | `${loggedInNumber}@s.whatsapp.net`, 884 | { 885 | video: Buffer.from(buffer), 886 | }, 887 | { quoted: msg } 888 | ); 889 | 890 | logCuy( 891 | `Berhasil mengambil video sekali liat dari yang kamu reply`, 892 | "blue" 893 | ); 894 | 895 | buffer = null; 896 | } else if (msg.quoted.quotedMessage.audioMessage) { 897 | let buffer = await downloadMediaMessage( 898 | { 899 | message: { 900 | audioMessage: msg.quoted.quotedMessage.audioMessage, 901 | }, 902 | key: msg.quoted.key, 903 | }, 904 | "buffer", 905 | {}, 906 | { 907 | logger: pino({ level: "fatal" }), 908 | } 909 | ); 910 | 911 | await sock.sendMessage( 912 | `${loggedInNumber}@s.whatsapp.net`, 913 | { 914 | audio: Buffer.from(buffer), 915 | }, 916 | { quoted: msg } 917 | ); 918 | 919 | logCuy( 920 | `Berhasil mengambil audio sekali liat dari yang kamu reply`, 921 | "blue" 922 | ); 923 | 924 | buffer = null; 925 | } else { 926 | await sock.sendMessage( 927 | `${loggedInNumber}@s.whatsapp.net`, 928 | { 929 | text: `Pesan yang kamu reply bukan pesan yang bertipe foto, video, audio dan sekali liat`, 930 | }, 931 | { quoted: msg } 932 | ); 933 | logCuy( 934 | `Pesan yang kamu reply bukan pesan yang bertipe foto, video, audio dan sekali liat`, 935 | "yellow" 936 | ); 937 | } 938 | } else { 939 | await sock.sendMessage( 940 | `${loggedInNumber}@s.whatsapp.net`, 941 | { 942 | text: `Reply/balas pesan sekali liat dengan perintah #viewonce`, 943 | }, 944 | { quoted: msg } 945 | ); 946 | } 947 | break; 948 | case "info": 949 | const infoMessage = `Informasi Status Fitur: 950 | - Auto Read Status: ${autoReadStatus ? "*Aktif*" : "*Nonaktif*"} 951 | - Auto Like Status: ${autoLikeStatus ? "*Aktif*" : "*Nonaktif*"} 952 | - Download Media Status: ${downloadMediaStatus ? "*Aktif*" : "*Nonaktif*"} 953 | - Sensor Nomor: ${sensorNomor ? "*Aktif*" : "*Nonaktif*"} 954 | - Anti Telpon: ${antiTelpon ? "*Aktif*" : "*Nonaktif*"} 955 | - Auto Kick tag Story: ${autoKickStory ? "*Aktif*" : "*Nonaktif*"}`; 956 | 957 | const formatList = (list) => 958 | list 959 | .map((number, index) => { 960 | let displayNumber = number; 961 | if (sensorNomor) { 962 | displayNumber = 963 | displayNumber.slice(0, 3) + 964 | "****" + 965 | displayNumber.slice(-2); 966 | } 967 | return `\u25CF ${displayNumber}`; 968 | }) 969 | .join("\n"); 970 | const formatEmojiList = (list) => 971 | list.map((emoji, index) => `${emoji}`).join(", "); 972 | 973 | const blacklistMessage = 974 | blackList.length > 0 975 | ? `Blacklist:\n${formatList(blackList)}` 976 | : "Blacklist kosong."; 977 | const whitelistMessage = 978 | whiteList.length > 0 979 | ? `Whitelist:\n${formatList(whiteList)}` 980 | : "Whitelist kosong."; 981 | const emojisMessage = 982 | emojis.length > 0 983 | ? `Emojis:\n${formatEmojiList(emojis)}` 984 | : "Emojis kosong."; 985 | const listMessage = `\n\n${blacklistMessage}\n\n${whitelistMessage}\n\n${emojisMessage}\n\nKetik \`#add\` untuk menambahkan nomor atau emoji ke blacklist, whitelist, dan emojis\nKetik \`#remove\` untuk menghapus nomor atau emoji dari blacklist, whitelist, dan emojis\nKetik \`#on\` untuk mengaktifkan fitur\nKetik \`#off\` untuk menonaktifkan fitur\nKetik \`#menu\` untuk melihat menu perintah yang tersedia`; 986 | 987 | await sock.sendMessage( 988 | `${loggedInNumber}@s.whatsapp.net`, 989 | { text: infoMessage + listMessage }, 990 | { quoted: msg } 991 | ); 992 | break; 993 | } 994 | } 995 | 996 | if (autoKickStory) { 997 | if (msg.message.groupStatusMentionMessage && !msg.key.fromMe) { 998 | const groupId = msg.key.remoteJid; 999 | const participant = msg.key.participant; 1000 | 1001 | const groupMetadata = await sock.groupMetadata(groupId); 1002 | const groupName = groupMetadata.subject; 1003 | const botNumber = sock.user.id.split(":")[0] + "@s.whatsapp.net"; 1004 | const isAdmin = groupMetadata.participants.some( 1005 | (member) => member.id === botNumber && member.admin !== null 1006 | ); 1007 | 1008 | if (isAdmin) { 1009 | await sock.sendMessage( 1010 | groupId, 1011 | { 1012 | text: `@${ 1013 | participant.split("@")[0] 1014 | } terdeteksi tag grup di story, kamu akan dikick.`, 1015 | mentions: [participant], 1016 | }, 1017 | { quoted: msg } 1018 | ); 1019 | 1020 | await sock.groupParticipantsUpdate(groupId, [participant], "remove"); 1021 | logCuy( 1022 | `Kamu mengeluarkan sesorang dari group ${groupName} karena telah tag grup di story.`, 1023 | "red" 1024 | ); 1025 | } else { 1026 | // await sock.sendMessage( 1027 | // `${loggedInNumber}@s.whatsapp.net`, 1028 | // { 1029 | // text: `terdeteksi ada yang tag grup di story, namun bot bukan admin jadi tidak bisa kick.`, 1030 | // }, 1031 | // { quoted: msg } 1032 | // ); 1033 | logCuy( 1034 | `Kamu bukan admin di grup ${groupName} jadi tidak bisa kick.`, 1035 | "yellow" 1036 | ); 1037 | } 1038 | } 1039 | } 1040 | 1041 | // status 1042 | if ( 1043 | msg.key.remoteJid === "status@broadcast" && 1044 | msg.key.participant !== `${loggedInNumber}@s.whatsapp.net` && 1045 | autoReadStatus 1046 | ) { 1047 | let senderNumber = msg.key.participant 1048 | ? msg.key.participant.split("@")[0] 1049 | : "Tidak diketahui"; 1050 | let displaySendernumber = senderNumber; 1051 | const senderName = msg.pushName || "Tidak diketahui"; 1052 | 1053 | if (sensorNomor && displaySendernumber !== "Tidak diketahui") { 1054 | displaySendernumber = 1055 | displaySendernumber.slice(0, 3) + 1056 | "****" + 1057 | displaySendernumber.slice(-2); 1058 | } 1059 | 1060 | if (msg.message.protocolMessage) { 1061 | logCuy( 1062 | `Status dari ${senderName} (${displaySendernumber}) telah dihapus.`, 1063 | "red" 1064 | ); 1065 | } else if (!msg.message.reactionMessage) { 1066 | if (blackList.includes(senderNumber)) { 1067 | logCuy( 1068 | `${senderName} (${displaySendernumber}) membuat status tapi karena ada di blacklist. Status tidak akan dilihat.`, 1069 | "yellow" 1070 | ); 1071 | return; 1072 | } 1073 | 1074 | if (whiteList.length > 0 && !whiteList.includes(senderNumber)) { 1075 | logCuy( 1076 | `${senderName} (${displaySendernumber}) membuat status tapi karena tidak ada di whitelist. Status tidak akan dilihat.`, 1077 | "yellow" 1078 | ); 1079 | return; 1080 | } 1081 | 1082 | const myself = jidNormalizedUser(sock.user.id); 1083 | const emojiToReact = emojis[Math.floor(Math.random() * emojis.length)]; 1084 | 1085 | if (msg.key.remoteJid && msg.key.participant) { 1086 | await sock.readMessages([msg.key]); 1087 | 1088 | if (autoLikeStatus) { 1089 | await sock.sendMessage( 1090 | msg.key.remoteJid, 1091 | { react: { key: msg.key, text: emojiToReact } }, 1092 | { statusJidList: [msg.key.participant, myself] } 1093 | ); 1094 | } 1095 | 1096 | logCuy( 1097 | `Berhasil melihat ${ 1098 | autoLikeStatus ? "dan menyukai " : "" 1099 | }status dari: ${senderName} (${displaySendernumber})`, 1100 | "green" 1101 | ); 1102 | 1103 | const targetNumber = loggedInNumber; 1104 | let messageContent = `Status dari *${senderName}* (${displaySendernumber}) telah dilihat ${ 1105 | autoLikeStatus ? "dan disukai" : "" 1106 | }`; 1107 | let caption = 1108 | msg.message.imageMessage?.caption || 1109 | msg.message.videoMessage?.caption || 1110 | msg.message.extendedTextMessage?.text || 1111 | "Tidak ada caption"; 1112 | 1113 | if (downloadMediaStatus) { 1114 | if (msg.type === "imageMessage" || msg.type === "videoMessage") { 1115 | let mediaType = msg.type === "imageMessage" ? "image" : "video"; 1116 | messageContent = `Status ${ 1117 | mediaType === "image" ? "gambar" : "video" 1118 | } dari *${senderName}* (${displaySendernumber}) telah dilihat ${ 1119 | autoLikeStatus ? "dan disukai" : "" 1120 | }`; 1121 | 1122 | try { 1123 | let buffer = await downloadMediaMessage( 1124 | msg, 1125 | "buffer", 1126 | {}, 1127 | { 1128 | logger: pino({ level: "fatal" }), 1129 | } 1130 | ); 1131 | 1132 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1133 | [mediaType]: Buffer.from(buffer), 1134 | caption: `${messageContent} dengan caption : "*${caption}*"`, 1135 | }); 1136 | 1137 | buffer = null; 1138 | } catch (error) { 1139 | logCuy(`Error uploading media: ${error}`, "red"); 1140 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1141 | text: `${messageContent} namun Gagal mengunggah media dari status ${ 1142 | mediaType === "image" ? "gambar" : "video" 1143 | } dari *${senderName}* (${displaySendernumber}).`, 1144 | }); 1145 | } 1146 | } else if (msg.type === "audioMessage") { 1147 | messageContent = `Status audio dari *${senderName}* (${displaySendernumber}) telah dilihat ${ 1148 | autoLikeStatus ? "dan disukai" : "" 1149 | }. Berikut audionya.`; 1150 | 1151 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1152 | text: messageContent, 1153 | }); 1154 | 1155 | try { 1156 | let buffer = await downloadMediaMessage( 1157 | msg, 1158 | "buffer", 1159 | {}, 1160 | { 1161 | logger: pino({ level: "fatal" }), 1162 | } 1163 | ); 1164 | 1165 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1166 | audio: Buffer.from(buffer), 1167 | caption: "", 1168 | }); 1169 | 1170 | buffer = null; 1171 | } catch (error) { 1172 | logCuy(`Error uploading media: ${error}`, "red"); 1173 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1174 | text: `Gagal mengunggah audio dari status audio dari *${senderName}* (${displaySendernumber}).`, 1175 | }); 1176 | } 1177 | } else { 1178 | messageContent = `Status teks dari *${senderName}* (${displaySendernumber}) telah dilihat ${ 1179 | autoLikeStatus ? "dan disukai" : "" 1180 | } dengan caption: "*${caption}*"`; 1181 | 1182 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1183 | text: messageContent, 1184 | }); 1185 | } 1186 | } else { 1187 | await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { 1188 | text: messageContent, 1189 | }); 1190 | } 1191 | } 1192 | } 1193 | } 1194 | }); 1195 | } 1196 | 1197 | connectToWhatsApp(); 1198 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "auto-read-story-wa-jauhariel", 3 | "version": "3.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "node index" 7 | }, 8 | "keywords": [ 9 | "auto-read-story", 10 | "whatsapp-bot", 11 | "whatsapp-status-viewer", 12 | "auto-view-whatsapp-story", 13 | "bot-whatsapp" 14 | ], 15 | "author": "github.com/jauhariel", 16 | "license": "ISC", 17 | "description": "Auto Read Story/Status WhatsApp adalah bot sederhana yang memungkinkan kamu untuk melihat status/story teman-teman WhatsApp secara otomatis, sehingga kamu menjadi orang pertama yang melihat story mereka.", 18 | "dependencies": { 19 | "@whiskeysockets/baileys": "github:jauhariel/Baileys", 20 | "colors": "^1.4.0", 21 | "moment-timezone": "^0.5.47", 22 | "qrcode-terminal": "^0.12.0" 23 | } 24 | } 25 | --------------------------------------------------------------------------------