Spaces:
Paused
Paused
File size: 5,216 Bytes
90dacbb de7c795 4210f76 0714943 77dfcf8 90dacbb 77dfcf8 6a5e6b5 de7c795 77dfcf8 6a5e6b5 90dacbb d87f1ae 77dfcf8 d87f1ae 77dfcf8 d87f1ae 77dfcf8 d87f1ae 77dfcf8 de7c795 d87f1ae 77dfcf8 6a5e6b5 54c8cb0 77dfcf8 0714943 de7c795 904f5c5 77dfcf8 904f5c5 54c8cb0 6a5e6b5 54c8cb0 6a5e6b5 90dacbb 6a5e6b5 90dacbb 0714943 77dfcf8 2015653 77dfcf8 b0df1e1 77dfcf8 0714943 77dfcf8 0714943 77dfcf8 0714943 77dfcf8 0714943 77dfcf8 0714943 e4c2c80 0714943 77dfcf8 90dacbb b0df1e1 90dacbb |
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 |
const express = require('express');
const fs = require('fs');
const path = require('path');
const qri = require('qr-image');
const { default: makeWASocket, useMultiFileAuthState, DisconnectReason, proto, generateWAMessageFromContent, prepareWAMessageMedia } = require('@whiskeysockets/baileys');
const Boom = require('@hapi/boom');
const app = express();
app.use(express.json());
const sessionDir = path.join(__dirname, 'sessions');
// Function to generate API key
function generateApiKey() {
return Math.random().toString(36).substr(2, 16);
}
// Function to validate IP address format and ensure it's not a private or reserved IP
function isValidIp(ip) {
const ipv4Regex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
if (!ipv4Regex.test(ip)) return false;
const octets = ip.split('.').map(Number);
return !(
(octets[0] === 10) ||
(octets[0] === 172 && octets[1] >= 16 && octets[1] <= 31) ||
(octets[0] === 192 && octets[1] === 168) ||
(ip === '127.0.0.1')
);
}
// Handle checkState request
app.get('/checkState', async (req, res) => {
const { ip } = req.query;
if (ip && isValidIp(ip)) {
const sessionFile = path.join(sessionDir, `${ip}.json`);
let apiKey;
if (fs.existsSync(sessionFile)) {
const sessionData = JSON.parse(fs.readFileSync(sessionFile, 'utf8'));
apiKey = sessionData.apiKey;
} else {
apiKey = generateApiKey();
if (!fs.existsSync(sessionDir)) {
fs.mkdirSync(sessionDir, { recursive: true });
}
const sessionData = { ip, apiKey };
fs.writeFileSync(sessionFile, JSON.stringify(sessionData, null, 2));
connectToWhatsApp(apiKey, ip); // Start WhatsApp connection
}
res.cookie('apiKey', apiKey, {
maxAge: 365 * 24 * 60 * 60 * 1000,
httpOnly: false,
sameSite: 'None',
secure: true
});
res.status(200).json({
message: 'Server is running successfully',
server: 'running',
apiKey: apiKey
});
} else {
res.status(401).json({ message: 'Invalid IP' });
}
});
app.get('/qrCode', (req, res) => {
const { apiKey } = req.query;
if (apiKey) {
const qrFile = path.join(sessionDir, `${apiKey}_qr.svg`);
if (fs.existsSync(qrFile)) {
res.sendFile(qrFile);
} else {
res.status(404).send('QR code not found');
}
} else {
res.status(400).send('API key is required');
}
});
// Handle user credentials storage
app.post('/storeCredentials', (req, res) => {
const { apiKey, credentials } = req.body;
if (!apiKey || !credentials) {
return res.status(400).json({ message: 'API key and credentials are required' });
}
const credentialsDir = path.join(sessionDir, apiKey);
const credentialsFile = path.join(credentialsDir, 'creds.json');
if (!fs.existsSync(credentialsDir)) {
fs.mkdirSync(credentialsDir, { recursive: true });
}
fs.writeFileSync(credentialsFile, JSON.stringify(credentials, null, 2));
res.status(200).json({ message: 'Credentials stored successfully' });
});
// Serve login page
app.use(express.static(path.join(__dirname, 'public')));
async function connectToWhatsApp(apiKey, ip) {
const { state, saveCreds } = await useMultiFileAuthState(path.join(sessionDir, apiKey));
const sock = makeWASocket({
auth: state,
printQRInTerminal: true
});
sock.ev.on('connection.update', async (update) => {
const { connection, lastDisconnect, qr } = update;
if (connection === 'close') {
const shouldReconnect = (lastDisconnect.error instanceof Boom) ? lastDisconnect.error.output.statusCode !== DisconnectReason.loggedOut : true;
console.log('Connection closed due to', lastDisconnect.error, ', reconnecting', shouldReconnect);
if (shouldReconnect) {
connectToWhatsApp(apiKey, ip);
}
} else if (connection === 'open') {
console.log('Connected to WhatsApp');
} else if (qr) {
// Generate QR code and save to file
const qrImage = qri.imageSync(qr, { type: 'svg' });
fs.writeFileSync(path.join(sessionDir, `${apiKey}_qr.svg`), qrImage);
}
});
sock.ev.on('messages.upsert', async (m) => {
console.log(JSON.stringify(m, undefined, 2));
if (m.messages && m.messages.length > 0) {
const message = m.messages[0];
const text = message.message?.conversation || '';
console.log('Received message:', text);
await sock.sendMessage(message.key.remoteJid, { text: 'Hello there!' });
}
});
// Save session to file
fs.writeFileSync(path.join(sessionDir, `${ip}.json`), JSON.stringify({ apiKey, ip, session: sock.state }, null, 2));
}
const PORT = 7860;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
|