105 lines
2.7 KiB
JavaScript
105 lines
2.7 KiB
JavaScript
const { Client, LocalAuth } = require('whatsapp-web.js');
|
|
const express = require('express');
|
|
const qrcode = require('qrcode');
|
|
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
|
|
// Statische Dateien aus dem "ui" Ordner servieren
|
|
app.use(express.static(path.join(__dirname, 'ui')));
|
|
|
|
let lastQr = "";
|
|
let isReady = false;
|
|
const SESSION_DATA = '/data/auth';
|
|
|
|
const client = new Client({
|
|
authStrategy: new LocalAuth({ dataPath: SESSION_DATA }),
|
|
puppeteer: {
|
|
executablePath: '/usr/bin/chromium-browser',
|
|
args: [
|
|
'--no-sandbox',
|
|
'--disable-setuid-sandbox',
|
|
'--disable-dev-shm-usage',
|
|
'--disable-gpu'
|
|
]
|
|
}
|
|
});
|
|
|
|
// QR Code Handling
|
|
client.on('qr', (qr) => {
|
|
lastQr = qr;
|
|
isReady = false;
|
|
console.log('Neuer QR Code generiert.');
|
|
});
|
|
|
|
client.on('ready', () => {
|
|
isReady = true;
|
|
lastQr = "";
|
|
console.log('WhatsApp ist bereit!');
|
|
});
|
|
|
|
// --- ROUTES ---
|
|
|
|
// Hauptseite für Ingress
|
|
app.get('/', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'ui', 'index.html'));
|
|
});
|
|
|
|
// Status API
|
|
app.get('/api/status', async (req, res) => {
|
|
try {
|
|
let qrData = null;
|
|
if (lastQr) {
|
|
qrData = await qrcode.toDataURL(lastQr);
|
|
}
|
|
res.json({
|
|
isReady: isReady,
|
|
hasQr: lastQr !== "",
|
|
qrCode: qrData
|
|
});
|
|
} catch (e) {
|
|
res.status(500).json({ error: e.message });
|
|
}
|
|
});
|
|
|
|
// Logout
|
|
app.post('/auth/logout', async (req, res) => {
|
|
try {
|
|
await client.logout();
|
|
await fs.remove(SESSION_DATA);
|
|
res.json({ success: true, message: "Erfolgreich abgemeldet. Addon startet neu..." });
|
|
setTimeout(() => process.exit(0), 2000);
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
// Reset
|
|
app.delete('/system/reset', async (req, res) => {
|
|
try {
|
|
await client.destroy();
|
|
await fs.emptyDir('/data');
|
|
res.json({ success: true, message: "Werkseinstellungen wiederhergestellt. Addon startet neu..." });
|
|
setTimeout(() => process.exit(0), 2000);
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
// Sende-Schnittstelle
|
|
app.post('/send', async (req, res) => {
|
|
const { number, message } = req.body;
|
|
if (!isReady) return res.status(503).json({ error: 'Client nicht bereit' });
|
|
try {
|
|
const chatId = number.includes('@c.us') ? number : `${number}@c.us`;
|
|
await client.sendMessage(chatId, message);
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
client.initialize();
|
|
app.listen(3000, () => console.log('WhatsApp Bridge Server läuft auf Port 3000')); |