From dcb36bf05904f75686adda7af8dcc0dfeeae4097 Mon Sep 17 00:00:00 2001 From: cangui Date: Tue, 6 May 2025 22:21:45 +0200 Subject: [PATCH] sddssdsd --- index.js | 209 ++++++++++++++++++++++--------------------------------- 1 file changed, 85 insertions(+), 124 deletions(-) diff --git a/index.js b/index.js index fc39eda..44096bb 100644 --- a/index.js +++ b/index.js @@ -1,54 +1,42 @@ - const express = require('express'); const qrcode = require('qrcode'); -const path = require('path'); -const fs = require('fs'); -const NodeCache = require('node-cache'); const { - makeWASocket, + default: makeWASocket, useMultiFileAuthState, DisconnectReason, fetchLatestBaileysVersion, generateWAMessageFromContent, proto } = require('@whiskeysockets/baileys'); +const { Boom } = require('@hapi/boom'); const app = express(); app.use(express.json()); -app.use(express.static('public')); let sock; -let qrData = null; +let qrCodeData = null; let isConnected = false; -const groupCache = new NodeCache({ stdTTL: 300, useClones: false }); - -async function getMessageFromStore(key) { - return { conversation: "Message temporaire pour retry" }; -} - -const initBaileys = async () => { +async function startSock() { + const { state, saveCreds } = await useMultiFileAuthState('auth_info'); const { version } = await fetchLatestBaileysVersion(); - const { state, saveCreds } = await useMultiFileAuthState('auth'); sock = makeWASocket({ version, auth: state, - markOnlineOnConnect: false, - getMessage: async (key) => await getMessageFromStore(key), - cachedGroupMetadata: async (jid) => groupCache.get(jid) + printQRInTerminal: true }); sock.ev.on('connection.update', async ({ connection, lastDisconnect, qr }) => { if (qr) { - qrData = await qrcode.toDataURL(qr); - isConnected = false; + qrCodeData = await qrcode.toDataURL(qr); } if (connection === 'close') { - const shouldReconnect = lastDisconnect?.error?.output?.statusCode !== DisconnectReason.loggedOut; - console.log(shouldReconnect ? '🔁 Reconnexion...' : '❌ DĂ©connectĂ©.'); - if (shouldReconnect) initBaileys(); + const shouldReconnect = (lastDisconnect?.error instanceof Boom) + && lastDisconnect.error.output.statusCode !== DisconnectReason.loggedOut; + console.log('❌ DĂ©connectĂ©. Reconnexion :', shouldReconnect); + if (shouldReconnect) startSock(); } else if (connection === 'open') { console.log('✅ ConnectĂ© Ă  WhatsApp'); isConnected = true; @@ -56,28 +44,17 @@ const initBaileys = async () => { }); sock.ev.on('creds.update', saveCreds); +} - sock.ev.on('messages.upsert', async ({ messages }) => { - const msg = messages[0]; - if (!msg.key.fromMe && msg.message?.conversation) { - console.log('💬 Message reçu de', msg.key.remoteJid, ':', msg.message.conversation); - } - }); -}; - -initBaileys(); - -app.get('/login', (req, res) => { - res.sendFile(path.join(__dirname, 'public', 'login.html')); -}); - +startSock(); app.get('/api/qrcode', (req, res) => { - res.json({ qr: qrData, connected: isConnected }); + res.json({ qr: qrCodeData, connected: isConnected }); }); app.post('/sendText', async (req, res) => { const { phone, message } = req.body; if (!sock || !isConnected) return res.status(400).json({ error: 'Non connectĂ©' }); + try { await sock.sendMessage(`${phone}@s.whatsapp.net`, { text: message }); res.json({ success: true }); @@ -86,101 +63,85 @@ app.post('/sendText', async (req, res) => { } }); -app.post('/sendButtons', async (req, res) => { +app.post('/sendImage', async (req, res) => { + const { phone, imageUrl, caption } = req.body; + if (!sock || !isConnected) return res.status(400).json({ error: 'Non connectĂ©' }); + + try { + await sock.sendMessage(`${phone}@s.whatsapp.net`, { + image: { url: imageUrl }, + caption: caption || '' + }); + res.json({ success: true }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); + +app.post('/sendDocument', async (req, res) => { + const { phone, documentUrl, fileName, mimetype } = req.body; + if (!sock || !isConnected) return res.status(400).json({ error: 'Non connectĂ©' }); + + try { + await sock.sendMessage(`${phone}@s.whatsapp.net`, { + document: { url: documentUrl }, + fileName: fileName || 'fichier.pdf', + mimetype: mimetype || 'application/pdf' + }); + res.json({ success: true }); + } catch (e) { + res.status(500).json({ error: e.message }); + } +}); +app.post('/sendInteractive', async (req, res) => { const { phone } = req.body; if (!sock || !isConnected) return res.status(400).json({ error: 'Non connectĂ©' }); - const jid = `${phone}@s.whatsapp.net`; - const imageUrl = 'https://wa.canguidev.fr/static/logo-merlo-cs-FR.jpg'; - - const content = { - viewOnceMessage: { - message: { - messageContextInfo: { - deviceListMetadata: {}, - deviceListMetadataVersion: 2 - }, - interactiveMessage: proto.Message.InteractiveMessage.create({ - header: { - hasMediaAttachment: true, - imageMessage: { url: imageUrl } - }, - body: { text: 'Bienvenue !' }, - footer: { text: 'Choisissez une action :' }, - nativeFlowMessage: { - buttons: [ - { - name: 'cta_reply', - buttonParamsJson: JSON.stringify({ display_text: 'RĂ©pondre', id: 'reply_id' }) - }, - { - name: 'cta_url', - buttonParamsJson: JSON.stringify({ display_text: 'Site Web', url: 'https://canguidev.fr' }) - } - ] - } - }) - } - } - }; try { + const jid = `${phone}@s.whatsapp.net`; + const content = { + viewOnceMessage: { + message: { + messageContextInfo: { + deviceListMetadata: {}, + deviceListMetadataVersion: 2 + }, + interactiveMessage: proto.Message.InteractiveMessage.create({ + body: { text: 'Bienvenue ! Choisissez une action :' }, + footer: { text: 'Service WhatsApp' }, + nativeFlowMessage: { + buttons: [ + { + name: 'cta_reply', + buttonParamsJson: JSON.stringify({ + display_text: '✅ Confirmer', + id: 'confirm_action' + }) + }, + { + name: 'cta_url', + buttonParamsJson: JSON.stringify({ + display_text: '🌐 Site Web', + url: 'https://canguidev.fr' + }) + } + ] + } + }) + } + } + }; + const msg = generateWAMessageFromContent(jid, content, {}); await sock.relayMessage(jid, msg.message, { messageId: msg.key.id }); + res.json({ success: true }); } catch (e) { - console.error('❌ Erreur sendButtons :', e); + console.error('❌ Erreur interactive :', e); res.status(500).json({ error: e.message }); } }); - -app.post('/sendInteractiveImage', async (req, res) => { - const { phone } = req.body; - if (!sock || !isConnected) return res.status(400).json({ error: 'Non connectĂ© Ă  WhatsApp' }); - - const jid = `${phone}@s.whatsapp.net`; - const imageUrl = 'https://wa.canguidev.fr/static/logo-merlo-cs-FR.jpg'; - - const content = { - viewOnceMessage: { - message: { - messageContextInfo: { - deviceListMetadata: {}, - deviceListMetadataVersion: 2 - }, - interactiveMessage: proto.Message.InteractiveMessage.create({ - header: { - hasMediaAttachment: true, - imageMessage: { url: imageUrl } - }, - body: { text: '📄 Document interactif' }, - footer: { text: 'SĂ©lectionne une option :' }, - nativeFlowMessage: { - buttons: [ - { - name: 'cta_url', - buttonParamsJson: JSON.stringify({ display_text: 'Voir PDF', url: 'https://example.com/doc.pdf' }) - } - ] - } - }) - } - } - }; - - try { - const msg = generateWAMessageFromContent(jid, content, {}); - await sock.relayMessage(jid, msg.message, { messageId: msg.key.id }); - res.json({ success: true }); - } catch (e) { - console.error('❌ Erreur interactive image :', e); - res.status(500).json({ error: e.message }); - } +const PORT = process.env.PORT || 3001; +app.listen(PORT, () => { + console.log(`🚀 Serveur prĂȘt sur http://localhost:${PORT}`); }); - -app.use((req, res) => res.status(404).json({ error: 'Ressource introuvable' })); -app.use((err, req, res, next) => { - console.error('❌ Middleware erreur :', err); - res.status(500).json({ error: err.message }); -}); - -app.listen(3001, () => console.log('🚀 Serveur Baileys opĂ©rationnel sur http://localhost:3001'));