whatsapp/index.js
2025-05-06 19:58:53 +02:00

167 lines
4.4 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const venom = require('venom-bot');
const express = require('express');
const qrcode = require('qrcode');
const path = require('path');
const fs = require('fs');
const app = express();
app.use(express.json());
app.use(express.static('public'));
let client;
let qrData = null;
let isConnected = false;
// Initialisation Venom-bot
const initVenom = async () => {
client = await venom.create({
session: 'whatsapp-session',
disableSpins: true,
logQR: false,
catchQR: (base64Qrimg) => {
qrcode.toDataURL(base64Qrimg, (err, url) => {
if (err) {
console.error('Erreur QR code:', err);
return;
}
qrData = url;
isConnected = false;
});
}
});
client.onStateChange((state) => {
console.log('État de connexion:', state);
isConnected = state === 'CONNECTED';
if (state === 'DISCONNECTED') {
console.log('🔁 Tentative de reconnexion...');
setTimeout(initVenom, 5000);
}
});
};
initVenom();
// Routes Express
app.use('/static', express.static(path.join(__dirname, 'public')));
app.get('/login', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'login.html'));
});
app.get('/api/qrcode', (req, res) => {
res.json({ qr: qrData, connected: isConnected });
});
app.post('/sendText', async (req, res) => {
const { phone, message } = req.body;
if (!client || !isConnected) return res.status(400).json({ error: 'Non connecté' });
try {
await client.sendText(`${phone}@c.us`, message);
res.json({ success: true });
} catch (e) {
res.status(500).json({ error: e.message });
}
});
app.post('/sendButtons', async (req, res) => {
const { phone } = req.body;
if (!client || !isConnected) return res.status(400).json({ error: 'Non connecté' });
try {
const buttons = [
{ body: "📩 Contacter support" },
{ body: "🌐 Voir notre site" },
{ body: "📞 Appeler le support" }
];
await client.sendButtons(
`${phone}@c.us`,
"Bienvenue sur notre service !",
buttons,
"Choisis une action ci-dessous"
);
res.json({ success: true });
} catch (e) {
console.error('❌ Erreur boutons:', e);
res.status(500).json({ error: e.message });
}
});
app.post('/sendInteractiveImage', async (req, res) => {
const { phone, caption, footer } = req.body;
if (!client || !isConnected) return res.status(400).json({ error: 'Non connecté' });
try {
const imagePath = path.join(__dirname, 'public', 'logo-merlo-cs-FR.jpg');
const imageBuffer = fs.readFileSync(imagePath);
await client.sendImage(
`${phone}@c.us`,
imageBuffer,
'logo.jpg',
caption || 'Description par défaut',
{
footer: footer || 'Pied de page',
buttons: [
{ buttonId: 'id1', buttonText: { displayText: '📄 Voir proposition' }, type: 1 },
{ buttonId: 'id2', buttonText: { displayText: '🔧 Spécifications' }, type: 1 }
]
}
);
res.json({ success: true });
} catch (e) {
console.error('❌ Erreur image interactive:', e);
res.status(500).json({ error: e.message });
}
});
app.post('/sendProductMessage', async (req, res) => {
if (!client || !isConnected) return res.status(400).json({ error: 'Non connecté' });
const {
phone,
productImageUrl,
productTitle,
productDescription,
price,
productUrl
} = req.body;
try {
// Venom-bot n'a pas de méthode native pour les produits
// On simule avec une image et des boutons
const buttons = [
{ buttonId: 'buy', buttonText: { displayText: '🛒 Acheter' }, type: 1 },
{ buttonId: 'details', buttonText: { displayText: ' Détails' }, type: 1 }
];
const caption = `*${productTitle}*\n\n${productDescription}\n\nPrix: ${price}`;
await client.sendImage(
`${phone}@c.us`,
productImageUrl,
'product.jpg',
caption,
{ buttons }
);
res.json({ success: true });
} catch (e) {
console.error('❌ Erreur produit:', e);
res.status(500).json({ error: e.message });
}
});
// Gestion des erreurs
app.use((req, res) => res.status(404).json({ error: 'Ressource introuvable' }));
app.use((err, req, res, next) => {
console.error('Erreur:', err);
res.status(500).json({ error: err.message });
});
app.listen(3001, () => console.log('🚀 Serveur Venom démarré sur http://localhost:3001'));