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}`);
});