whatsapp/index.js
2025-05-06 11:38:23 +02:00

115 lines
3.1 KiB
JavaScript

const { create } = require('venom-bot');
const express = require('express');
const path = require('path');
let client;
let qrCodeBase64 = null;
let isConnected = false;
const app = express();
app.use(express.static('public'));
app.use(express.json());
// 📄 Page avec QR Code
app.get('/login', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'login.html'));
});
// 📄 Page "connecté"
app.get('/connected', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'connected.html'));
});
// 🔄 QR code en base64 + état de connexion
app.get('/api/qrcode', (req, res) => {
res.json({ qr: qrCodeBase64, connected: isConnected });
});
// ✅ API POST : envoie message avec boutons
app.post('/sendButtons', async (req, res) => {
const { phone, title, message, buttons } = req.body;
console.log('📥 Requête reçue :');
console.log('Phone:', phone);
console.log('Title:', title);
console.log('Message:', message);
console.log('Buttons brut:', buttons);
if (!client) return res.status(500).json({ error: 'Client WhatsApp non initialisé' });
if (!phone || !message || !title || !Array.isArray(buttons)) {
return res.status(400).json({ error: 'Paramètres manquants ou invalides' });
}
try {
const formattedButtons = buttons.map(btn => ({
buttonText: { displayText: btn.text }
}));
console.log('✅ Boutons formatés pour Venom :', formattedButtons);
await client.sendButtons(
`${phone}@c.us`,
title, // ✅ OBLIGATOIRE en 1er
message, // ✅ Description
formattedButtons // ✅ Format conforme
);
res.json({ success: true });
} catch (error) {
console.error('❌ Erreur sendButtons:', error);
res.status(500).json({ error: error.message || 'Erreur interne' });
}
});
app.post('/sendText', async (req, res) => {
const { phone, message } = req.body;
console.log('📥 Requête TEXT :');
console.log('Phone:', phone);
console.log('Message:', message);
if (!client) return res.status(500).json({ error: 'Client WhatsApp non initialisé' });
if (!phone || !message) {
return res.status(400).json({ error: 'Paramètres manquants' });
}
try {
await client.sendText(`${phone}@c.us`, message);
res.json({ success: true });
} catch (error) {
console.error('❌ Erreur sendText:', error);
res.status(500).json({ error: error.message || 'Erreur interne' });
}
});
// ▶️ Démarrage + QR code init
create({
session: 'session-web-api',
multidevice: false,
catchQR: (base64Qrimg, asciiQR) => {
qrCodeBase64 = base64Qrimg;
isConnected = false;
},
puppeteerOptions: {
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox']
}
}).then((cl) => {
client = cl;
client.onStateChange((state) => {
if (state === 'CONNECTED') isConnected = true;
});
client.onStreamChange((state) => {
if (state === 'CONNECTED') isConnected = true;
});
}).catch((err) => {
console.error('Erreur init Venom:', err);
});
app.listen(3001, () => console.log('🚀 Serveur lancé sur http://localhost:3001/login'));