-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathindex.js
311 lines (264 loc) · 17.3 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
let { autoLikeStatus, downloadMediaStatus, sensorNomor, blackList, whiteList } = require('./config');
const { makeWASocket, DisconnectReason, useMultiFileAuthState, Browsers, jidNormalizedUser, downloadMediaMessage} = require('@whiskeysockets/baileys');
const pino = require('pino');
const readline = require('readline');
const fs = require('fs');
const path = require('path');
let useCode = true;
let loggedInNumber;
async function connectToWhatsApp(){
const sessionPath = path.join(__dirname, 'sessions');
const sessionExists = fs.existsSync(sessionPath) && fs.readdirSync(sessionPath).length > 0;
const { state, saveCreds } = await useMultiFileAuthState('sessions');
const sock = makeWASocket({
logger: pino({ level: 'fatal' }),
auth: state,
printQRInTerminal: !useCode,
defaultQueryTimeoutMs: undefined,
keepAliveIntervalMs: 30000,
browser: Browsers.macOS('Chrome'),
shouldSyncHistoryMessage: () => true,
markOnlineOnConnect: true,
syncFullHistory: true,
generateHighQualityLinkPreview: true
});
if (useCode && !sessionExists) {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log("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") // pesan untuk yang menggunakan panel
const askPairingCode = () => {
rl.question('\nApakah kamu ingin menggunakan pairing code untuk login ke wangsaf? (y/n): ', async (answer) => {
if (answer.toLowerCase() === 'y' || answer.trim() === '') {
console.log("\nWokeh kalau gitu silahkan masukkan nomor wangsafmu!\ncatatan : awali dengan 62 contoh 628123456789") // pesan untuk yang menggunakan panel
const askWaNumber = () => {
rl.question('\nMasukkan nomor wangsaf Anda: ', async (waNumber) => {
if (!/^\d+$/.test(waNumber)) {
console.log('\nNomor harus berupa angka!\nSilakan masukkan nomor wangsaf kembali!.');
askWaNumber();
} else if (!waNumber.startsWith('62')) {
console.log('\nNomor harus diawali dengan 62!\nContoh : 628123456789\nSilakan masukkan nomor wangsaf kembali!.');
askWaNumber();
} else {
const code = await sock.requestPairingCode(waNumber);
console.log('\nCek notifikasi wangsafmu dan masukin kode login wangsaf:', code);
rl.close();
}
});
};
askWaNumber();
} else if (answer.toLowerCase() === 'n') {
useCode = false;
console.log('\nBuka wangsafmu lalu klik titik tiga di kanan atas kemudian klik perangkat tertaut setelah itu Silahkan scan QR code dibawah untuk login ke wangsaf');
connectToWhatsApp();
rl.close();
} else {
console.log('\nInput tidak valid. Silakan masukkan "y" atau "n".');
askPairingCode();
}
});
};
askPairingCode();
}
sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect } = update;
if(connection === 'close') {
const shouldReconnect = lastDisconnect.error?.output.statusCode !== DisconnectReason.loggedOut;
if(shouldReconnect) {
console.log('Mencoba menghubungkan ke wangsaf...\n');
connectToWhatsApp();
} else {
console.log('Terputus dari wangsaf, silahkan hapus folder sessions dan login ke wangsaf kembali');
}
} else if(connection === 'open') {
console.log('Terhubung ke wangsaf')
loggedInNumber = sock.user.id.split('@')[0].split(':')[0];
let displayedLoggedInNumber = loggedInNumber;
if (sensorNomor) {
displayedLoggedInNumber = displayedLoggedInNumber.slice(0, 3) + '****' + displayedLoggedInNumber.slice(-2);
}
let messageInfo = `Bot *AutoReadStoryWhatsApp* Aktif!
Kamu berhasil login dengan nomor: ${displayedLoggedInNumber}
info status fitur:
- Auto Like Status: ${autoLikeStatus ? "*Aktif*" : "*Nonaktif*"}
- Download Media Status: ${downloadMediaStatus ? "*Aktif*" : "*Nonaktif*"}
- Sensor Nomor: ${sensorNomor ? "*Aktif*" : "*Nonaktif*"}
Ketik *#menu* untuk melihat menu perintah yang tersedia.
SC : https://github.com/jauhariel/AutoReadStoryWhatsapp`;
setTimeout(async () => {
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: messageInfo });
}, 5000);
console.log(`kamu berhasil login dengan nomor: ${displayedLoggedInNumber} \n`);
console.log("Bot sudah aktif!\n\nSelamat menikmati fitur auto read story whatsapp by github.com/Jauhariel\n\nCatatan :\n1. Kamu bisa menambahkan nomor yang tidak ingin kamu lihat story-nya secara otomatis di file config.js dengan menambahkan nomor pada variabel array blackList.\n\n2. Kamu bisa menambahkan hanya nomor tertentu yang ingin kamu lihat story-nya secara otomatis di file config.js dengan menambahkan nomor pada variabel array whiteList.\n\n3. Jika kamu ingin melihat story dari semua kontak, kosongkan variabel array blackList dan whiteList yang ada di file config.js.\n\n4. Ubah nilai variabel autoLikeStatus yang terdapat di file config.js menjadi false untuk menonaktifkan fitur auto-like pada status, atau ubah menjadi true untuk mengaktifkannya.\n\n5. Ubah nilai variabel downloadMediaStatus yang terdapat di file config.js menjadi true untuk secara otomatis mendownload media (foto, video, audio) dari status, atau ubah menjadi false untuk menonaktifkan fitur tersebut.\n\n6. Klik CTRL dan C pada keyboard secara bersamaan untuk memberhentikan bot!\n\n7. 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: npm start\n");
}
})
sock.ev.on('creds.update', saveCreds);
sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
if (!msg.message) return;
msg.type = msg.message.imageMessage ? "imageMessage" : msg.message.videoMessage ? "videoMessage" : msg.message.audioMessage ? "audioMessage" : Object.keys(msg.message)[0];
msg.text = msg.type == "conversation" ? msg.message.conversation : "";
const prefixes = [".", "#", "!", "/"];
let prefix = prefixes.find(p => msg.text.startsWith(p));
if (prefix) {
msg.cmd = msg.text.trim().split(" ")[0].replace(prefix, "").toLowerCase();
// args
msg.args = msg.text.replace(/^\S*\b/g, "").trim().split("|");
// command
switch (msg.cmd) {
case "on":
msg.args[0].trim() === ""
? await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: `mana argumennya ?\ncontoh ketik : #on autolike\n\nArgumen yang tersedia:\n\n#on autolike\nuntuk mengaktifkan fitur autolike\n\n#on dlmedia\nuntuk mengaktifkan fitur download media(foto,video, dan audio) dari story\n\n#on sensornomor\nuntuk mengaktifkan sensor nomor` }, { quoted: msg })
: msg.args.forEach(async arg => {
switch (arg.trim().toLowerCase()) {
case "autolike":
autoLikeStatus = true;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: "Auto Like Status aktif" }, { quoted: msg });
break;
case "dlmedia":
downloadMediaStatus = true;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: "Download Media Status aktif" }, { quoted: msg });
break;
case "sensornomor":
sensorNomor = true;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: "Sensor Nomor aktif" }, { quoted: msg });
break;
default:
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: autolike, dlmedia, sensornomor` }, { quoted: msg });
break;
}
});
break;
case "off":
msg.args[0].trim() === ""
? await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: `mana argumennya ?\ncontoh ketik : #off autolike\n\nArgumen yang tersedia:\n\n#off autolike\nuntuk menonaktifkan fitur autolike\n\n#off dlmedia\nuntuk menonaktifkan fitur download media(foto,video, dan audio) dari story\n\n#off sensornomor\nuntuk menonaktifkan sensor nomor` }, { quoted: msg })
: msg.args.forEach(async arg => {
switch (arg.trim().toLowerCase()) {
case "autolike":
autoLikeStatus = false;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: "Auto Like Status nonaktif" }, { quoted: msg });
break;
case "dlmedia":
downloadMediaStatus = false;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: "Download Media Status nonaktif" }, { quoted: msg });
break;
case "sensornomor":
sensorNomor = false;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: "Sensor Nomor nonaktif" }, { quoted: msg });
break;
default:
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: `Argumen tidak valid: ${arg}. Pilihan yang tersedia: autolike, dlmedia, sensornomor` }, { quoted: msg });
break;
}
});
break;
case "menu":
const menuMessage = `Daftar Menu:
contoh penggunaan: #on autolike
Perintah On:
*#on autolike*
Mengaktifkan fitur autolike
*#on dlmedia*
Mengaktifkan fitur download media (foto, video, dan audio) dari story
*#on sensornomor*
Mengaktifkan sensor nomor
Perintah Off:
*#off autolike*
Menonaktifkan fitur autolike
*#off dlmedia*
Menonaktifkan fitur download media (foto, video, dan audio) dari story
*#off sensornomor*
Menonaktifkan sensor nomor
Perintah Info:
*#info*
Menampilkan informasi status fitur`;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: menuMessage }, { quoted: msg });
break;
case "info":
const infoMessage = `Informasi Status Fitur:
- Auto Like Status: ${autoLikeStatus ? "*Aktif*" : "*Nonaktif*"}
- Download Media Status: ${downloadMediaStatus ? "*Aktif*" : "*Nonaktif*"}
- Sensor Nomor: ${sensorNomor ? "*Aktif*" : "*Nonaktif*"}`;
await sock.sendMessage(`${loggedInNumber}@s.whatsapp.net`, { text: infoMessage }, { quoted: msg });
break;
}
}
// status
if (msg.key.remoteJid === "status@broadcast" && msg.key.participant !== `${loggedInNumber}@s.whatsapp.net`) {
let senderNumber = msg.key.participant ? msg.key.participant.split('@')[0] : 'Tidak diketahui';
let displaySendernumber = senderNumber;
const senderName = msg.pushName || 'Tidak diketahui';
if (sensorNomor && displaySendernumber !== 'Tidak diketahui') {
displaySendernumber = displaySendernumber.slice(0, 3) + '****' + displaySendernumber.slice(-2);
}
if (msg.message.protocolMessage) {
console.log(`Status dari ${senderName} (${displaySendernumber}) telah dihapus.\n`);
} else if (!msg.message.reactionMessage) {
if (blackList.includes(senderNumber)) {
console.log(`${senderName} (${displaySendernumber}) membuat status tapi karena ada di blacklist. Status tidak akan dilihat.\n`);
return;
}
if (whiteList.length > 0 && !whiteList.includes(senderNumber)) {
console.log(`${senderName} (${displaySendernumber}) membuat status tapi karena tidak ada di whitelist. Status tidak akan dilihat.\n`);
return;
}
const myself = jidNormalizedUser(sock.user.id);
const emojiToReact = '💚';
if (msg.key.remoteJid && msg.key.participant) {
await sock.readMessages([msg.key]);
if (autoLikeStatus) {
await sock.sendMessage(
msg.key.remoteJid,
{ react: { key: msg.key, text: emojiToReact } },
{ statusJidList: [msg.key.participant, myself] }
);
}
console.log(`Berhasil melihat ${autoLikeStatus ? "dan menyukai " : ""}status dari: ${senderName} (${displaySendernumber})\n`);
const targetNumber = loggedInNumber;
let messageContent = `Status dari *${senderName}* (${displaySendernumber}) telah dilihat ${autoLikeStatus ? "dan disukai" : ""}`;
let caption = msg.message.imageMessage?.caption || msg.message.videoMessage?.caption || msg.message.extendedTextMessage?.text || "Tidak ada caption";
if (downloadMediaStatus) {
if (msg.type === "imageMessage" || msg.type === "videoMessage") {
let mediaType = msg.type === "imageMessage" ? "image" : "video";
messageContent = `Status ${mediaType === "image" ? "gambar" : "video"} dari *${senderName}* (${displaySendernumber}) telah dilihat ${autoLikeStatus ? "dan disukai" : ""}`;
try {
const buffer = await downloadMediaMessage(msg, "buffer", {}, {
logger: pino({ level: 'fatal' }),
});
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
[mediaType]: Buffer.from(buffer),
caption: `${messageContent} dengan caption : "*${caption}*"`
});
} catch (error) {
console.error('Error uploading media:', error);
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { text: `${messageContent} namun Gagal mengunggah media dari status ${mediaType === "image" ? "gambar" : "video"} dari *${senderName}* (${displaySendernumber}).` });
}
} else if (msg.type === "audioMessage") {
messageContent = `Status audio dari *${senderName}* (${displaySendernumber}) telah dilihat ${autoLikeStatus ? "dan disukai" : ""}. Berikut audionya.`;
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { text: messageContent });
try {
const buffer = await downloadMediaMessage(msg, "buffer", {}, {
logger: pino({ level: 'fatal' }),
});
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, {
audio: Buffer.from(buffer),
caption: ""
});
} catch (error) {
console.error('Error uploading audio:', error);
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { text: `Gagal mengunggah audio dari status audio dari *${senderName}* (${displaySendernumber}).` });
}
} else {
messageContent = `Status teks dari *${senderName}* (${displaySendernumber}) telah dilihat ${autoLikeStatus ? "dan disukai" : ""} dengan caption: "*${caption}*"`;
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { text: messageContent });
}
} else {
await sock.sendMessage(`${targetNumber}@s.whatsapp.net`, { text: messageContent });
}
}
}
}
});
}
connectToWhatsApp();