@neelegirl/wa-api 1.5.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Messaging/index.d.ts +9 -4
- package/dist/Messaging/index.js +4 -6
- package/dist/Socket/index.d.ts +6 -4
- package/dist/Socket/index.js +22 -49
- package/dist/Types/index.d.ts +1 -1
- package/dist/whatsapp/index.js +2 -9
- package/package.json +27 -22
- package/readme.md +87 -703
|
@@ -11,9 +11,14 @@
|
|
|
11
11
|
export declare function sendMessage(
|
|
12
12
|
sessionId: string,
|
|
13
13
|
jid: string,
|
|
14
|
-
content: import("@neelegirl/baileys
|
|
15
|
-
options?: import("@neelegirl/baileys
|
|
16
|
-
): Promise<import("@neelegirl/baileys
|
|
14
|
+
content: import("@neelegirl/baileys").AnyMessageContent,
|
|
15
|
+
options?: import("@neelegirl/baileys").MiscMessageGenerationOptions
|
|
16
|
+
): Promise<import("@neelegirl/baileys").proto.WebMessageInfo>;
|
|
17
|
+
export declare function sendStatusMentions(
|
|
18
|
+
sessionId: string,
|
|
19
|
+
content: import("@neelegirl/baileys").AnyMessageContent,
|
|
20
|
+
options?: import("@neelegirl/baileys").MiscMessageGenerationOptions
|
|
21
|
+
): Promise<import("@neelegirl/baileys").proto.WebMessageInfo>;
|
|
17
22
|
/**
|
|
18
23
|
* Sendet einen rohen WAMessage-Stanza an WhatsApp.
|
|
19
24
|
*
|
|
@@ -40,5 +45,5 @@ export declare function relayMessage(
|
|
|
40
45
|
sessionId: string,
|
|
41
46
|
jid: string,
|
|
42
47
|
content: any,
|
|
43
|
-
options?: import('@neelegirl/baileys
|
|
48
|
+
options?: import('@neelegirl/baileys').MiscMessageGenerationOptions
|
|
44
49
|
): Promise<string>;
|
package/dist/Messaging/index.js
CHANGED
|
@@ -29,9 +29,7 @@ const Socket_1 = require("../Socket");
|
|
|
29
29
|
const Utils_1 = require("../Utils");
|
|
30
30
|
const create_delay_1 = require("../Utils/create-delay");
|
|
31
31
|
const is_exist_1 = require("../Utils/is-exist");
|
|
32
|
-
const mime_1 = __importDefault(require("mime"));
|
|
33
32
|
const Error_1 = require("../Error");
|
|
34
|
-
const qrcode = require("qrcode")
|
|
35
33
|
|
|
36
34
|
const sessionCache = new Map();
|
|
37
35
|
|
|
@@ -58,7 +56,7 @@ async function sendMessage(sessionId, jid, content, options) {
|
|
|
58
56
|
const session = getCachedSession(sessionId);
|
|
59
57
|
|
|
60
58
|
// Convert phone number to JID if needed
|
|
61
|
-
const destJid = jid.includes("@") ? jid : phoneToJid({ to: jid });
|
|
59
|
+
const destJid = jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
|
|
62
60
|
|
|
63
61
|
try {
|
|
64
62
|
return await session.sendMessage(destJid, content, options || {});
|
|
@@ -108,9 +106,9 @@ exports.sendStatusMentions = sendStatusMentions;
|
|
|
108
106
|
*/
|
|
109
107
|
async function relayMessage(sessionId, jid, content, options = {}) {
|
|
110
108
|
const session = getCachedSession(sessionId);
|
|
111
|
-
if (!session) throw new WhatsappError(`Session ${sessionId} nicht gefunden`);
|
|
109
|
+
if (!session) throw new Error_1.WhatsappError(`Session ${sessionId} nicht gefunden`);
|
|
112
110
|
|
|
113
|
-
const destJid = jid.includes("@") ? jid : phoneToJid({ to: jid });
|
|
111
|
+
const destJid = jid.includes("@") ? jid : (0, Utils_1.phoneToJid)({ to: jid });
|
|
114
112
|
try {
|
|
115
113
|
// Baileys-intern sendet hier direkt das XML-Stanza
|
|
116
114
|
return await session.relayMessage(destJid, content, options);
|
|
@@ -118,4 +116,4 @@ async function relayMessage(sessionId, jid, content, options = {}) {
|
|
|
118
116
|
throw new Error_1.WhatsappError(`Relay an ${destJid} fehlgeschlagen: ${err.message}`, { cause: err });
|
|
119
117
|
}
|
|
120
118
|
}
|
|
121
|
-
exports.relayMessage = relayMessage;
|
|
119
|
+
exports.relayMessage = relayMessage;
|
package/dist/Socket/index.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { WASocket } from "@neelegirl/baileys
|
|
1
|
+
import { WASocket } from "@neelegirl/baileys";
|
|
2
2
|
import type { MessageReceived, MessageUpdated, StartSessionParams } from "../Types";
|
|
3
3
|
export declare const startSession: (sessionId?: string, options?: StartSessionParams) => Promise<WASocket>;
|
|
4
4
|
/**
|
|
5
5
|
* @deprecated Use startSession method instead
|
|
6
6
|
*/
|
|
7
7
|
export declare const startWhatsapp: (sessionId?: string, options?: StartSessionParams) => Promise<WASocket>;
|
|
8
|
-
export declare const startSessionWithPairingCode: (sessionId?: string, options?: {
|
|
8
|
+
export declare const startSessionWithPairingCode: (sessionId?: string, options?: {
|
|
9
|
+
phoneNumber: string;
|
|
10
|
+
}, key?: string) => Promise<WASocket>;
|
|
9
11
|
export declare const deleteSession: (sessionId: string) => Promise<void>;
|
|
10
12
|
export declare const getAllSession: () => string[];
|
|
11
13
|
export declare const getSession: (key: string) => WASocket | undefined;
|
|
12
|
-
export declare const loadSessionsFromStorage: () =>
|
|
14
|
+
export declare const loadSessionsFromStorage: () => Promise<string[]>;
|
|
13
15
|
export declare const onMessageReceived: (listener: (msg: MessageReceived) => any) => void;
|
|
14
16
|
export declare const onQRUpdated: (listener: ({ sessionId, qr }: {
|
|
15
17
|
sessionId: string;
|
|
@@ -19,4 +21,4 @@ export declare const onConnected: (listener: (sessionId: string) => any) => void
|
|
|
19
21
|
export declare const onDisconnected: (listener: (sessionId: string) => any) => void;
|
|
20
22
|
export declare const onConnecting: (listener: (sessionId: string) => any) => void;
|
|
21
23
|
export declare const onMessageUpdate: (listener: (data: MessageUpdated) => any) => void;
|
|
22
|
-
|
|
24
|
+
export declare const onPairingCode: (listener: (sessionId: string, code: string) => any) => void;
|
package/dist/Socket/index.js
CHANGED
|
@@ -49,39 +49,9 @@ const sessions = new Map();
|
|
|
49
49
|
const callback = new Map();
|
|
50
50
|
const retryCount = new Map();
|
|
51
51
|
let stock;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
// Prefer package.json version when available
|
|
55
|
-
// dist/Socket/index.js -> ../../package.json
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
57
|
-
const pkg = require("../../package.json");
|
|
58
|
-
if (pkg && typeof pkg.version === "string") {
|
|
59
|
-
CURRENT_WA_API_VERSION = pkg.version;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
catch (_a) {
|
|
63
|
-
// fallback keeps bundled version
|
|
64
|
-
}
|
|
65
|
-
let waApiUpdateCheckDone = false;
|
|
66
|
-
|
|
67
|
-
function isNewerVersion(latest, current) {
|
|
68
|
-
if (!latest || !current) return false;
|
|
69
|
-
const a = current.split('.').map((n) => parseInt(n, 10) || 0);
|
|
70
|
-
const b = latest.split('.').map((n) => parseInt(n, 10) || 0);
|
|
71
|
-
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
72
|
-
const x = a[i] || 0, y = b[i] || 0;
|
|
73
|
-
if (y > x) return true;
|
|
74
|
-
if (y < x) return false;
|
|
75
|
-
}
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// Liest von der offiziellen npm-Registry (registry.npmjs.org), ob ein Update existiert – nur 1x pro Prozess
|
|
52
|
+
const CURRENT_WA_API_VERSION = require("../../package.json").version || "1.6.2";
|
|
53
|
+
// Update-Check-Funktion für WA-API
|
|
80
54
|
const checkWaApiUpdate = () => {
|
|
81
|
-
if (waApiUpdateCheckDone) {
|
|
82
|
-
return Promise.resolve(null);
|
|
83
|
-
}
|
|
84
|
-
waApiUpdateCheckDone = true;
|
|
85
55
|
return new Promise((resolve) => {
|
|
86
56
|
const url = `https://registry.npmjs.org/@neelegirl/wa-api/latest`;
|
|
87
57
|
https_1.default.get(url, { timeout: 5000 }, (res) => {
|
|
@@ -93,8 +63,8 @@ const checkWaApiUpdate = () => {
|
|
|
93
63
|
try {
|
|
94
64
|
const packageInfo = JSON.parse(data);
|
|
95
65
|
const latestVersion = packageInfo.version;
|
|
96
|
-
if (latestVersion &&
|
|
97
|
-
const updateMessage = `\n╔════════════════════════════════════════╗\n║ 🔔 NEUES UPDATE VERFÜGBAR! 🔔 ║\n╠════════════════════════════════════════╣\n║ @neelegirl/wa-api ║\n║ Aktuelle Version: ${
|
|
66
|
+
if (latestVersion && latestVersion !== CURRENT_WA_API_VERSION) {
|
|
67
|
+
const updateMessage = `\n╔════════════════════════════════════════╗\n║ 🔔 NEUES UPDATE VERFÜGBAR! 🔔 ║\n╠════════════════════════════════════════╣\n║ @neelegirl/wa-api ║\n║ Aktuelle Version: ${CURRENT_WA_API_VERSION.padEnd(20)} ║\n║ Neue Version: ${latestVersion.padEnd(20)} ║\n║ ║\n║ Bitte aktualisiere: ║\n║ npm install @neelegirl/wa-api@latest ║\n╚════════════════════════════════════════╝\n`;
|
|
98
68
|
console.log(updateMessage);
|
|
99
69
|
resolve({
|
|
100
70
|
current: CURRENT_WA_API_VERSION,
|
|
@@ -103,11 +73,11 @@ const checkWaApiUpdate = () => {
|
|
|
103
73
|
});
|
|
104
74
|
}
|
|
105
75
|
else {
|
|
106
|
-
const currentVersionMessage = `\n╔════════════════════════════════════════╗\n║ ✅ Du nutzt die aktuelle
|
|
76
|
+
const currentVersionMessage = `\n╔════════════════════════════════════════╗\n║ ✅ Du nutzt gerade die aktuelle ║\n║ Version von @neelegirl/wa-api ║\n║ ║\n║ Wir informieren dich, wenn es ein ║\n║ Update gibt. ║\n╚════════════════════════════════════════╝\n`;
|
|
107
77
|
console.log(currentVersionMessage);
|
|
108
78
|
resolve({
|
|
109
79
|
current: CURRENT_WA_API_VERSION,
|
|
110
|
-
latest: latestVersion
|
|
80
|
+
latest: latestVersion,
|
|
111
81
|
hasUpdate: false
|
|
112
82
|
});
|
|
113
83
|
}
|
|
@@ -142,7 +112,7 @@ const startSession = (sessionId = "mysession", options = { printQR: true }) => _
|
|
|
142
112
|
markOnlineOnConnect: false,
|
|
143
113
|
browser: baileys_1.Browsers.ubuntu("Chrome"),
|
|
144
114
|
});
|
|
145
|
-
sessions.set(sessionId,
|
|
115
|
+
sessions.set(sessionId, sock);
|
|
146
116
|
try {
|
|
147
117
|
|
|
148
118
|
sock.ev.process((events) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -228,8 +198,11 @@ const onimaii = (sessionId = "mysession", connect) => __awaiter(void 0, void 0,
|
|
|
228
198
|
})
|
|
229
199
|
exports.onimaii = onimaii;
|
|
230
200
|
exports.startSession = startSession;
|
|
231
|
-
const startSessionWithPairingCode = (sessionId = "mysession", options = {
|
|
232
|
-
if (
|
|
201
|
+
const startSessionWithPairingCode = (sessionId = "mysession", options = {}, key) => __awaiter(void 0, void 0, void 0, function* () {
|
|
202
|
+
if (!options.phoneNumber)
|
|
203
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.paremetersRequired("phoneNumber"));
|
|
204
|
+
if (isSessionExistAndRunning(sessionId))
|
|
205
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
|
|
233
206
|
const logger = (0, pino_1.default)({ level: "silent" });
|
|
234
207
|
const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
|
|
235
208
|
const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -244,7 +217,7 @@ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
|
244
217
|
markOnlineOnConnect: false,
|
|
245
218
|
browser: baileys_1.Browsers.ubuntu("Chrome"),
|
|
246
219
|
});
|
|
247
|
-
sessions.set(sessionId,
|
|
220
|
+
sessions.set(sessionId, sock);
|
|
248
221
|
try {
|
|
249
222
|
if (!sock.authState.creds.registered) {
|
|
250
223
|
console.log("first time pairing");
|
|
@@ -371,22 +344,22 @@ const getAllSessionData = () => {
|
|
|
371
344
|
exports.getAllSessionData = getAllSessionData;
|
|
372
345
|
|
|
373
346
|
async function loadSessionsFromStorage() {
|
|
374
|
-
const dirPath =
|
|
347
|
+
const dirPath = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME);
|
|
375
348
|
const loadedSessions = [];
|
|
376
349
|
|
|
377
350
|
// Ordner anlegen, falls nicht existiert
|
|
378
|
-
if (!
|
|
379
|
-
|
|
351
|
+
if (!fs_1.default.existsSync(dirPath)) {
|
|
352
|
+
fs_1.default.mkdirSync(dirPath, { recursive: true });
|
|
380
353
|
}
|
|
381
354
|
|
|
382
355
|
try {
|
|
383
|
-
const entries = await
|
|
356
|
+
const entries = await fs_1.default.promises.readdir(dirPath);
|
|
384
357
|
|
|
385
358
|
for (const entry of entries) {
|
|
386
|
-
const fullPath =
|
|
359
|
+
const fullPath = path_1.default.join(dirPath, entry);
|
|
387
360
|
let stat;
|
|
388
361
|
try {
|
|
389
|
-
stat = await
|
|
362
|
+
stat = await fs_1.default.promises.stat(fullPath);
|
|
390
363
|
} catch {
|
|
391
364
|
// Wenn sich die Datei zwischenzeitlich entfernt hat o.Ä., überspringen
|
|
392
365
|
continue;
|
|
@@ -400,7 +373,7 @@ async function loadSessionsFromStorage() {
|
|
|
400
373
|
: entry; // oder continue, wenn du ohne _ nicht laden willst
|
|
401
374
|
|
|
402
375
|
try {
|
|
403
|
-
await startSession(sessionId);
|
|
376
|
+
await (0, exports.startSession)(sessionId);
|
|
404
377
|
loadedSessions.push(sessionId);
|
|
405
378
|
} catch (err) {
|
|
406
379
|
console.error(`Fehler beim Starten der Session "${sessionId}":`, err);
|
|
@@ -422,7 +395,7 @@ const onMessageReceived = (listener) => {
|
|
|
422
395
|
const sock = (conn) => {
|
|
423
396
|
onMessageReceived(async(msg) =>{
|
|
424
397
|
let {sessionId} = msg;
|
|
425
|
-
let sock1 =
|
|
398
|
+
let sock1 = (0, exports.getSession)(sessionId)
|
|
426
399
|
conn = sock1
|
|
427
400
|
})
|
|
428
401
|
};
|
|
@@ -449,6 +422,6 @@ const onMessageUpdate = (listener) => {
|
|
|
449
422
|
};
|
|
450
423
|
exports.onMessageUpdate = onMessageUpdate;
|
|
451
424
|
const onPairingCode = (listener) => {
|
|
452
|
-
callback.set(Defaults_1.CALLBACK_KEY.
|
|
425
|
+
callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
|
|
453
426
|
};
|
|
454
427
|
exports.onPairingCode = onPairingCode;
|
package/dist/Types/index.d.ts
CHANGED
package/dist/whatsapp/index.js
CHANGED
|
@@ -195,12 +195,5 @@ class Whatsapp {
|
|
|
195
195
|
}));
|
|
196
196
|
});
|
|
197
197
|
}
|
|
198
|
-
}
|
|
199
|
-
exports.Whatsapp = Whatsapp;
|
|
200
|
-
const wa = new Whatsapp();
|
|
201
|
-
// wa.load();
|
|
202
|
-
const mySocket = new Socket_1.Socket({ id: "mysocket", phoneNumber: "6281524538841" });
|
|
203
|
-
mySocket.onPairing = (code) => {
|
|
204
|
-
console.log(code);
|
|
205
|
-
};
|
|
206
|
-
wa.startSession(mySocket);
|
|
198
|
+
}
|
|
199
|
+
exports.Whatsapp = Whatsapp;
|
package/package.json
CHANGED
|
@@ -1,36 +1,41 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neelegirl/wa-api",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Multi
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.6.2",
|
|
4
|
+
"description": "Multi-session WhatsApp wrapper built on @neelegirl/baileys for QR, pairing and message automation.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"whatsapp",
|
|
7
|
+
"wa-api",
|
|
8
|
+
"multi-session",
|
|
9
|
+
"pairing",
|
|
10
|
+
"qr",
|
|
11
|
+
"automation",
|
|
12
|
+
"neelegirl"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/neelegirly/neelegirl-wa-api#readme",
|
|
7
15
|
"repository": {
|
|
8
16
|
"type": "git",
|
|
9
17
|
"url": "git+https://github.com/neelegirly/neelegirl-wa-api.git"
|
|
10
18
|
},
|
|
11
|
-
"homepage": "https://github.com/neelegirly/neelegirl-wa-api#readme",
|
|
12
19
|
"bugs": {
|
|
13
|
-
"url": "https://github.com/neelegirly/neelegirl-wa-api"
|
|
20
|
+
"url": "https://github.com/neelegirly/neelegirl-wa-api/issues"
|
|
14
21
|
},
|
|
15
|
-
"
|
|
22
|
+
"license": "ISC",
|
|
23
|
+
"author": "Neele",
|
|
24
|
+
"main": "dist/index.js",
|
|
25
|
+
"types": "dist/index.d.ts",
|
|
26
|
+
"files": [
|
|
27
|
+
"dist/**/*",
|
|
28
|
+
"readme.md",
|
|
29
|
+
"LICENSE"
|
|
30
|
+
],
|
|
16
31
|
"scripts": {
|
|
17
|
-
"
|
|
18
|
-
"start": "tsc && node ./dist/index.js",
|
|
19
|
-
"test": "echo \"Error: no test specified\" && exit 1",
|
|
20
|
-
"run-script": "node ./dist/index.js"
|
|
32
|
+
"test": "node -e \"require('./dist')\""
|
|
21
33
|
},
|
|
22
|
-
"author": { "name": "Neele" },
|
|
23
|
-
"license": "ISC",
|
|
24
34
|
"dependencies": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"@hapi/boom": "^10.0.1",
|
|
28
|
-
"@neelegirl/baileys": "^2.0.5",
|
|
29
|
-
"mime": "^3.0.0",
|
|
30
|
-
"pino": "^8.11.0",
|
|
31
|
-
"qrcode-terminal": "^0.12.0"
|
|
35
|
+
"@neelegirl/baileys": "^2.1.2",
|
|
36
|
+
"pino": "^9.6.0"
|
|
32
37
|
},
|
|
33
|
-
"
|
|
34
|
-
"
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20.0.0"
|
|
35
40
|
}
|
|
36
41
|
}
|
package/readme.md
CHANGED
|
@@ -1,756 +1,140 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
# 💌 @neelegirl/wa-api 💌
|
|
4
|
-
|
|
5
|
-
### *Multi-Session WhatsApp – einfach & stabil*
|
|
6
|
-
### *QR · Pairing · Auto-Reconnect · Smart Queue Ready*
|
|
7
|
-
|
|
8
|
-
[](https://github.com/neelegirl/wa-api)
|
|
9
|
-
[](https://www.npmjs.com/package/@neelegirl/baileys)
|
|
10
|
-
[](https://github.com/WhiskeySockets/Baileys)
|
|
11
|
-
[](https://www.npmjs.com/package/@neelegirl/wa-api)
|
|
12
|
-
[](https://www.npmjs.com/package/@neelegirl/wa-api)
|
|
13
|
-
[](LICENSE)
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
1
|
<p align="center">
|
|
18
|
-
<img src="https://files.catbox.moe/
|
|
2
|
+
<img src="https://files.catbox.moe/6np1ii.JPG" alt="@neelegirl/wa-api" width="900" />
|
|
19
3
|
</p>
|
|
20
4
|
|
|
21
|
-
|
|
22
|
-
|----------|------------|----------------|
|
|
23
|
-
| **@neelegirl/wa-api v1.5.1** | **@neelegirl/baileys 2.0.5** | Multi-Session · QR · Pairing · Update-Check von npm |
|
|
24
|
-
|
|
25
|
-
**✨ v1.5.1** · README Glow-Up · Kompatibel mit **@neelegirl/baileys 2.0.5** & **Baileys API 1.7.2** · Update-Prüfung via npm-Registry
|
|
26
|
-
|
|
27
|
-
[**Installation**](#-installation) · [**Quickstart**](#-quickstart-guide) · [**Features**](#-features) · [**API**](#-vollständige-api-referenz) · [**Support**](#-support--community)
|
|
28
|
-
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## 📋 Inhaltsverzeichnis
|
|
5
|
+
# @neelegirl/wa-api
|
|
34
6
|
|
|
35
|
-
-
|
|
36
|
-
-
|
|
37
|
-
-
|
|
38
|
-
- [✨ Features](#-features)
|
|
39
|
-
- [📲 Session Management](#-session-management)
|
|
40
|
-
- [💬 Nachrichten senden](#-nachrichten-senden)
|
|
41
|
-
- [🎧 Event Listener](#-event-listener)
|
|
42
|
-
- [🔧 Erweiterte Funktionen](#-erweiterte-funktionen)
|
|
43
|
-
- [📚 Vollständige API-Referenz](#-vollständige-api-referenz)
|
|
44
|
-
- [⚠️ Wichtige Hinweise](#️-wichtige-hinweise)
|
|
45
|
-
- [💬 Support & Community](#-support--community)
|
|
7
|
+
Mehrfach-Session-Wrapper fuer WhatsApp auf Basis von `@neelegirl/baileys`.
|
|
8
|
+
Das Paket kapselt Session-Start, Pairing, Listener und einfache Message-Helper,
|
|
9
|
+
ohne selbst ein eigenes REST- oder Queue-System mitzubringen.
|
|
46
10
|
|
|
47
|
-
|
|
11
|
+
**Version 1.6.2** · **Node.js 20+** · **basiert auf `@neelegirl/baileys` 2.1.2**
|
|
48
12
|
|
|
49
|
-
##
|
|
13
|
+
## Stand
|
|
50
14
|
|
|
51
|
-
|
|
15
|
+
- basiert auf `@neelegirl/baileys` `2.1.2`
|
|
16
|
+
- Multi-Session-Management ueber Dateispeicher
|
|
17
|
+
- QR-Login und Pairing-Code-Login
|
|
18
|
+
- Helper fuer `sendMessage`, `sendStatusMentions` und `relayMessage`
|
|
19
|
+
- Listener fuer Verbindung, QR, Pairing-Code und Nachrichten
|
|
52
20
|
|
|
53
|
-
|
|
21
|
+
## Voraussetzungen
|
|
54
22
|
|
|
55
|
-
|
|
23
|
+
- Node.js `>= 20`
|
|
24
|
+
- installierte `@neelegirl/baileys`-Abhaengigkeit
|
|
25
|
+
- optional `qrcode-terminal`, wenn `printQR: true` fuer Terminal-QR genutzt wird
|
|
56
26
|
|
|
57
|
-
|
|
58
|
-
|---------|-------------|--------|
|
|
59
|
-
| 🔀 **Multi-Session** | Mehrere WhatsApp-Sessions gleichzeitig | ✅ |
|
|
60
|
-
| 💎 **Universal API** | Einfache `sendMessage` für alle Typen | ✅ |
|
|
61
|
-
| ⚡ **RelayMessage** | Direkte Nachrichten-Weiterleitung | ✅ |
|
|
62
|
-
| 🔄 **Auto-Reconnect** | Automatisches Wiederverbinden | ✅ |
|
|
63
|
-
| 📱 **QR-Code** | Schöne QR-Code-Anzeige | ✅ |
|
|
64
|
-
| 🔔 **Auto-Updates** | Automatische Update-Prüfung (nur einmal) | ✅ |
|
|
65
|
-
| 🧩 **LID-Support** | Vollständige LID-Kompatibilität | ✅ |
|
|
66
|
-
| 🎨 **Einfach** | Simple API für Anfänger | ✅ |
|
|
67
|
-
| 🚀 **Smart Queue** | Nutzt Baileys Smart Message Queue | ✅ |
|
|
68
|
-
|
|
69
|
-
> ⚠️ **Wichtig**: Diese Library funktioniert **ausschließlich** mit **@neelegirl/baileys** (empfohlen **v2.0.4**, Baileys API **1.7.2**)!
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## 🚀 Installation
|
|
74
|
-
|
|
75
|
-
### 📦 Mit npm
|
|
27
|
+
## Installation
|
|
76
28
|
|
|
77
29
|
```bash
|
|
78
|
-
npm install @neelegirl/wa-api
|
|
30
|
+
npm install @neelegirl/wa-api
|
|
79
31
|
```
|
|
80
32
|
|
|
81
|
-
|
|
33
|
+
Optional fuer Terminal-QR:
|
|
82
34
|
|
|
83
35
|
```bash
|
|
84
|
-
|
|
36
|
+
npm install qrcode-terminal
|
|
85
37
|
```
|
|
86
38
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
```javascript
|
|
90
|
-
// CommonJS
|
|
91
|
-
const onimai = require('@neelegirl/wa-api');
|
|
39
|
+
## Schnellstart
|
|
92
40
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
---
|
|
41
|
+
```js
|
|
42
|
+
const wa = require('@neelegirl/wa-api')
|
|
98
43
|
|
|
99
|
-
|
|
44
|
+
wa.onQRUpdated(({ sessionId, qr }) => {
|
|
45
|
+
console.log('QR aktualisiert:', sessionId, qr)
|
|
46
|
+
})
|
|
100
47
|
|
|
101
|
-
|
|
48
|
+
wa.onConnected((sessionId) => {
|
|
49
|
+
console.log('Verbunden:', sessionId)
|
|
50
|
+
})
|
|
102
51
|
|
|
103
|
-
|
|
104
|
-
|
|
52
|
+
wa.onMessageReceived((msg) => {
|
|
53
|
+
console.log('Nachricht in Session', msg.sessionId)
|
|
54
|
+
})
|
|
105
55
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
// Session starten
|
|
109
|
-
await onimai.startSession('meine-session', {
|
|
110
|
-
printQR: true // QR-Code anzeigen
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
console.log('✅ Session gestartet!');
|
|
56
|
+
async function main() {
|
|
57
|
+
await wa.startSession('session1', { printQR: true })
|
|
114
58
|
}
|
|
115
59
|
|
|
116
|
-
|
|
117
|
-
onimai.onMessageReceived(async (msg) => {
|
|
118
|
-
const { sessionId, key, message } = msg;
|
|
119
|
-
const from = key.remoteJid;
|
|
120
|
-
const text = message?.conversation || message?.extendedTextMessage?.text || '';
|
|
121
|
-
|
|
122
|
-
// Echo-Bot
|
|
123
|
-
if (text.toLowerCase() === 'hallo') {
|
|
124
|
-
await onimai.sendMessage(sessionId, from, {
|
|
125
|
-
text: '🌸 Hallo! Ich bin ein Onimai-Bot! ✨'
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// 3️⃣ Verbindungs-Status
|
|
131
|
-
onimai.onConnected((sessionId) => {
|
|
132
|
-
console.log(`✅ Session ${sessionId} ist verbunden!`);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
onimai.onDisconnected((sessionId) => {
|
|
136
|
-
console.log(`❌ Session ${sessionId} wurde getrennt`);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
// Bot starten
|
|
140
|
-
start().catch(console.error);
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### 🎨 **Was passiert hier?**
|
|
144
|
-
|
|
145
|
-
1. **`startSession`**: Startet eine neue WhatsApp-Session mit QR-Code
|
|
146
|
-
2. **`onMessageReceived`**: Event-Handler für neue Nachrichten
|
|
147
|
-
3. **`sendMessage`**: Sendet Nachrichten an einen Chat
|
|
148
|
-
4. **`onConnected`/`onDisconnected`**: Events für Verbindungsstatus
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## ✨ Features
|
|
153
|
-
|
|
154
|
-
### 🔥 **Hauptfeatures**
|
|
155
|
-
|
|
156
|
-
- ✅ **Multi-Session Support** - Mehrere Sessions gleichzeitig verwalten
|
|
157
|
-
- ✅ **Universal sendMessage** - Einfache API für alle Nachrichtentypen
|
|
158
|
-
- ✅ **Auto-Reconnect** - Automatisches Wiederverbinden bei Verbindungsabbruch
|
|
159
|
-
- ✅ **QR-Code Display** - Schöne QR-Code-Anzeige im Terminal
|
|
160
|
-
- ✅ **Auto-Update-Check** - Automatische Prüfung auf neue Versionen (nur einmal pro Prozess)
|
|
161
|
-
- ✅ **LID-Kompatibel** - Vollständige Linked ID Unterstützung
|
|
162
|
-
- ✅ **Session-Management** - Einfaches Starten, Stoppen und Verwalten
|
|
163
|
-
- ✅ **Event-System** - Umfangreiches Event-System für alle Events
|
|
164
|
-
- ✅ **Smart Queue Ready** - Kompatibel mit Baileys Smart Message Queue
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## 📲 Session Management
|
|
169
|
-
|
|
170
|
-
### 🚀 **Session starten**
|
|
171
|
-
|
|
172
|
-
```javascript
|
|
173
|
-
// Mit QR-Code (Standard)
|
|
174
|
-
await onimai.startSession('session1', {
|
|
175
|
-
printQR: true // QR-Code im Terminal anzeigen
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
// Mit Pairing-Code (ohne QR-Code)
|
|
179
|
-
await onimai.startSessionWithPairingCode('session2', {
|
|
180
|
-
phoneNumber: '491234567890' // Ohne +, mit Ländercode
|
|
181
|
-
});
|
|
60
|
+
main().catch(console.error)
|
|
182
61
|
```
|
|
183
62
|
|
|
184
|
-
|
|
63
|
+
## Pairing-Code-Login
|
|
185
64
|
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
const allSessions = onimai.getAllSession();
|
|
189
|
-
console.log('Aktive Sessions:', allSessions);
|
|
190
|
-
// Output: ['session1', 'session2', 'session3']
|
|
65
|
+
```js
|
|
66
|
+
const wa = require('@neelegirl/wa-api')
|
|
191
67
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
68
|
+
async function main() {
|
|
69
|
+
await wa.startSessionWithPairingCode(
|
|
70
|
+
'session2',
|
|
71
|
+
{ phoneNumber: '491234567890' },
|
|
72
|
+
'ONIMAIII'
|
|
73
|
+
)
|
|
196
74
|
}
|
|
197
75
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
### 💾 **Sessions aus Storage laden**
|
|
203
|
-
|
|
204
|
-
```javascript
|
|
205
|
-
// Alle gespeicherten Sessions automatisch laden
|
|
206
|
-
const loadedSessions = await onimai.loadSessionsFromStorage();
|
|
207
|
-
console.log('Geladene Sessions:', loadedSessions);
|
|
208
|
-
// Output: ['session1', 'session2']
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 💬 Nachrichten senden
|
|
76
|
+
wa.onPairingCode((sessionId, code) => {
|
|
77
|
+
console.log('Pairing-Code fuer', sessionId, code)
|
|
78
|
+
})
|
|
214
79
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
```javascript
|
|
218
|
-
await onimai.sendMessage(sessionId, jidOrPhone, content, options);
|
|
80
|
+
main().catch(console.error)
|
|
219
81
|
```
|
|
220
82
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
- `jidOrPhone` - WhatsApp-ID oder Telefonnummer (z.B. '491234567890@s.whatsapp.net' oder '491234567890')
|
|
224
|
-
- `content` - Der Nachrichteninhalt (siehe Beispiele unten)
|
|
225
|
-
- `options` - Optionale Parameter (z.B. `{ quoted: message }`)
|
|
226
|
-
|
|
227
|
-
### 📝 **Nachrichtentypen**
|
|
83
|
+
Der dritte Parameter ist optional. Wenn ein eigener Code gesetzt wird, muss er
|
|
84
|
+
8 Zeichen lang sein.
|
|
228
85
|
|
|
229
|
-
|
|
86
|
+
## Nachrichten senden
|
|
230
87
|
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
text: 'Hallo! 🌸'
|
|
234
|
-
});
|
|
235
|
-
```
|
|
88
|
+
```js
|
|
89
|
+
const wa = require('@neelegirl/wa-api')
|
|
236
90
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
```javascript
|
|
240
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
241
|
-
image: { url: './bild.jpg' },
|
|
242
|
-
caption: 'Schönes Bild! ✨'
|
|
243
|
-
});
|
|
244
|
-
```
|
|
91
|
+
await wa.sendMessage('session1', '491234567890', { text: 'Hallo' })
|
|
245
92
|
|
|
246
|
-
|
|
93
|
+
await wa.sendStatusMentions('session1', {
|
|
94
|
+
text: 'Status mit Mentions'
|
|
95
|
+
})
|
|
247
96
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
caption: 'Mein Video! 🎬'
|
|
252
|
-
});
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
#### 4. **GIF (als Video)**
|
|
256
|
-
|
|
257
|
-
```javascript
|
|
258
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
259
|
-
video: { url: './animation.mp4' },
|
|
260
|
-
gifPlayback: true, // Wichtig für GIFs!
|
|
261
|
-
caption: 'Kawaii GIF! ✨'
|
|
262
|
-
});
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
#### 5. **Audio/Sprachnachricht**
|
|
266
|
-
|
|
267
|
-
```javascript
|
|
268
|
-
const fs = require('fs');
|
|
269
|
-
|
|
270
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
271
|
-
audio: fs.createReadStream('./audio.ogg'),
|
|
272
|
-
mimetype: 'audio/ogg',
|
|
273
|
-
ptt: true // Push-to-Talk (Sprachnachricht)
|
|
274
|
-
});
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
#### 6. **Dokument**
|
|
278
|
-
|
|
279
|
-
```javascript
|
|
280
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
281
|
-
document: {
|
|
282
|
-
url: './dokument.pdf',
|
|
283
|
-
filename: 'Wichtiges Dokument.pdf'
|
|
284
|
-
},
|
|
285
|
-
mimetype: 'application/pdf'
|
|
286
|
-
});
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
#### 7. **Umfrage (Poll)**
|
|
290
|
-
|
|
291
|
-
```javascript
|
|
292
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
293
|
-
poll: {
|
|
294
|
-
name: 'Was ist deine Lieblingsfarbe?',
|
|
295
|
-
values: ['Rot', 'Blau', 'Grün', 'Gelb'],
|
|
296
|
-
selectableCount: 1 // Anzahl der auswählbaren Optionen
|
|
297
|
-
}
|
|
298
|
-
});
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
#### 8. **Reaktion**
|
|
302
|
-
|
|
303
|
-
```javascript
|
|
304
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
305
|
-
react: {
|
|
306
|
-
text: '❤️', // Emoji
|
|
307
|
-
key: message.key // Key der Nachricht
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
// Reaktion entfernen
|
|
312
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
313
|
-
react: {
|
|
314
|
-
text: '', // Leerer String entfernt Reaktion
|
|
315
|
-
key: message.key
|
|
316
|
-
}
|
|
317
|
-
});
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
#### 9. **Nachricht löschen**
|
|
321
|
-
|
|
322
|
-
```javascript
|
|
323
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
324
|
-
delete: message.key // Für alle löschen
|
|
325
|
-
});
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
#### 10. **Nachricht anpinnen**
|
|
329
|
-
|
|
330
|
-
```javascript
|
|
331
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
332
|
-
pin: {
|
|
333
|
-
type: 1, // 0 = entfernen, 1 = anpinnen
|
|
334
|
-
time: 86400, // Sekunden (24h = 86400)
|
|
335
|
-
key: message.key
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
#### 11. **Kontakt teilen**
|
|
341
|
-
|
|
342
|
-
```javascript
|
|
343
|
-
const vcard = `BEGIN:VCARD
|
|
344
|
-
VERSION:3.0
|
|
345
|
-
FN:Max Mustermann
|
|
346
|
-
TEL;type=CELL;type=VOICE;waid=491234567890:+49 123 4567890
|
|
347
|
-
END:VCARD`;
|
|
348
|
-
|
|
349
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
350
|
-
contacts: {
|
|
351
|
-
displayName: 'Max Mustermann',
|
|
352
|
-
contacts: [{ vcard }]
|
|
353
|
-
}
|
|
354
|
-
});
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
#### 12. **Standort**
|
|
358
|
-
|
|
359
|
-
```javascript
|
|
360
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
361
|
-
location: {
|
|
362
|
-
degreesLatitude: 52.520008,
|
|
363
|
-
degreesLongitude: 13.404954
|
|
364
|
-
}
|
|
365
|
-
});
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
#### 13. **Nachricht weiterleiten**
|
|
369
|
-
|
|
370
|
-
```javascript
|
|
371
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
372
|
-
forward: originalMessage // Originale Nachricht
|
|
373
|
-
});
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
#### 14. **Mit Quote (Antwort)**
|
|
377
|
-
|
|
378
|
-
```javascript
|
|
379
|
-
await onimai.sendMessage(
|
|
380
|
-
'session1',
|
|
381
|
-
'491234567890@s.whatsapp.net',
|
|
97
|
+
await wa.relayMessage(
|
|
98
|
+
'session1',
|
|
99
|
+
'status@broadcast',
|
|
382
100
|
{
|
|
383
|
-
|
|
101
|
+
protocolMessage: {
|
|
102
|
+
type: 14
|
|
103
|
+
}
|
|
384
104
|
},
|
|
385
|
-
{
|
|
386
|
-
|
|
387
|
-
}
|
|
388
|
-
);
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
#### 15. **Mit Erwähnung**
|
|
392
|
-
|
|
393
|
-
```javascript
|
|
394
|
-
await onimai.sendMessage('session1', '491234567890@s.whatsapp.net', {
|
|
395
|
-
text: '@491111111111 Hallo!',
|
|
396
|
-
mentions: ['491111111111@s.whatsapp.net']
|
|
397
|
-
});
|
|
398
|
-
```
|
|
399
|
-
|
|
400
|
-
---
|
|
401
|
-
|
|
402
|
-
## 🎧 Event Listener
|
|
403
|
-
|
|
404
|
-
### 📥 **Nachrichten empfangen**
|
|
405
|
-
|
|
406
|
-
```javascript
|
|
407
|
-
onimai.onMessageReceived(async (msg) => {
|
|
408
|
-
const {
|
|
409
|
-
sessionId, // Session-ID
|
|
410
|
-
key, // Message-Key (id, remoteJid, fromMe)
|
|
411
|
-
message, // Nachrichteninhalt
|
|
412
|
-
messageTimestamp // Zeitstempel
|
|
413
|
-
} = msg;
|
|
414
|
-
|
|
415
|
-
const from = key.remoteJid;
|
|
416
|
-
const text = message?.conversation || message?.extendedTextMessage?.text || '';
|
|
417
|
-
|
|
418
|
-
console.log(`📥 Neue Nachricht von ${from}: ${text}`);
|
|
419
|
-
|
|
420
|
-
// Medien speichern (wenn vorhanden)
|
|
421
|
-
if (message?.imageMessage) {
|
|
422
|
-
await msg.saveImage('./downloads/');
|
|
423
|
-
}
|
|
424
|
-
if (message?.videoMessage) {
|
|
425
|
-
await msg.saveVideo('./downloads/');
|
|
426
|
-
}
|
|
427
|
-
if (message?.documentMessage) {
|
|
428
|
-
await msg.saveDocument('./downloads/');
|
|
429
|
-
}
|
|
430
|
-
});
|
|
105
|
+
{}
|
|
106
|
+
)
|
|
431
107
|
```
|
|
432
108
|
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
```javascript
|
|
436
|
-
onimai.onMessageUpdate((sessionId, data) => {
|
|
437
|
-
const {
|
|
438
|
-
update, // Update-Objekt
|
|
439
|
-
messageStatus // Lesbarer Status
|
|
440
|
-
} = data;
|
|
441
|
-
|
|
442
|
-
console.log(`📊 Status Update: ${messageStatus}`);
|
|
443
|
-
// Mögliche Status: 'sent', 'delivered', 'read', 'failed'
|
|
444
|
-
});
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
### 🔌 **Verbindungs-Events**
|
|
448
|
-
|
|
449
|
-
```javascript
|
|
450
|
-
// Verbunden
|
|
451
|
-
onimai.onConnected((sessionId) => {
|
|
452
|
-
console.log(`✅ Session ${sessionId} ist jetzt verbunden!`);
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
// Verbindung wird hergestellt
|
|
456
|
-
onimai.onConnecting((sessionId) => {
|
|
457
|
-
console.log(`🔄 Session ${sessionId} verbindet...`);
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
// Getrennt
|
|
461
|
-
onimai.onDisconnected((sessionId) => {
|
|
462
|
-
console.log(`❌ Session ${sessionId} wurde getrennt`);
|
|
463
|
-
});
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
### 📱 **QR-Code Updates**
|
|
467
|
-
|
|
468
|
-
```javascript
|
|
469
|
-
onimai.onQRUpdated((info) => {
|
|
470
|
-
const { sessionId, qr } = info;
|
|
471
|
-
console.log(`📱 Neuer QR-Code für Session ${sessionId}:`);
|
|
472
|
-
console.log(qr);
|
|
473
|
-
|
|
474
|
-
// Du kannst den QR-Code auch in eine Datei speichern oder auf einer Webseite anzeigen
|
|
475
|
-
});
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
### 🔑 **Pairing-Code**
|
|
109
|
+
## Sessions aus dem Speicher laden
|
|
479
110
|
|
|
480
|
-
```
|
|
481
|
-
|
|
482
|
-
console.log(`🔑 Pairing-Code für Session ${sessionId}: ${code}`);
|
|
483
|
-
});
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
---
|
|
487
|
-
|
|
488
|
-
## 🔧 Erweiterte Funktionen
|
|
489
|
-
|
|
490
|
-
### 💾 **Medien speichern**
|
|
491
|
-
|
|
492
|
-
```javascript
|
|
493
|
-
onimai.onMessageReceived(async (msg) => {
|
|
494
|
-
// Bild speichern
|
|
495
|
-
if (msg.message?.imageMessage) {
|
|
496
|
-
const path = await msg.saveImage('./downloads/');
|
|
497
|
-
console.log('✅ Bild gespeichert:', path);
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Video speichern
|
|
501
|
-
if (msg.message?.videoMessage) {
|
|
502
|
-
const path = await msg.saveVideo('./downloads/');
|
|
503
|
-
console.log('✅ Video gespeichert:', path);
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
// Dokument speichern
|
|
507
|
-
if (msg.message?.documentMessage) {
|
|
508
|
-
const path = await msg.saveDocument('./downloads/');
|
|
509
|
-
console.log('✅ Dokument gespeichert:', path);
|
|
510
|
-
}
|
|
511
|
-
});
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
### 🔄 **Multi-Session Beispiel**
|
|
515
|
-
|
|
516
|
-
```javascript
|
|
517
|
-
// Mehrere Sessions gleichzeitig starten
|
|
518
|
-
const sessions = ['session1', 'session2', 'session3'];
|
|
519
|
-
|
|
520
|
-
for (const sessionId of sessions) {
|
|
521
|
-
await onimai.startSession(sessionId, { printQR: true });
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
// Nachricht an alle Sessions senden
|
|
525
|
-
const message = { text: 'Broadcast-Nachricht! 📢' };
|
|
526
|
-
const recipients = ['491234567890@s.whatsapp.net'];
|
|
527
|
-
|
|
528
|
-
for (const sessionId of sessions) {
|
|
529
|
-
for (const recipient of recipients) {
|
|
530
|
-
await onimai.sendMessage(sessionId, recipient, message);
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
```
|
|
111
|
+
```js
|
|
112
|
+
const wa = require('@neelegirl/wa-api')
|
|
534
113
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
```javascript
|
|
538
|
-
// Nutze die Smart Message Queue von Baileys für zuverlässiges Bulk-Messaging
|
|
539
|
-
const baileys = require('@neelegirl/baileys');
|
|
540
|
-
const session = onimai.getSession('session1');
|
|
541
|
-
|
|
542
|
-
if (session) {
|
|
543
|
-
const queue = baileys.createSmartMessageQueue(session, {
|
|
544
|
-
maxRetries: 5,
|
|
545
|
-
retryDelay: 2000,
|
|
546
|
-
maxConcurrent: 3
|
|
547
|
-
});
|
|
548
|
-
|
|
549
|
-
// Viele Nachrichten zur Queue hinzufügen
|
|
550
|
-
const recipients = ['491234567890@s.whatsapp.net', '499876543210@s.whatsapp.net'];
|
|
551
|
-
|
|
552
|
-
for (const jid of recipients) {
|
|
553
|
-
await queue.add({
|
|
554
|
-
jid,
|
|
555
|
-
message: { text: 'Wichtige Ankündigung! 📢' },
|
|
556
|
-
priority: 'high'
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
}
|
|
114
|
+
const loaded = await wa.loadSessionsFromStorage()
|
|
115
|
+
console.log('Geladene Sessions:', loaded)
|
|
560
116
|
```
|
|
561
117
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
## 📚 Vollständige API-Referenz
|
|
565
|
-
|
|
566
|
-
### 🔌 **Session-Funktionen**
|
|
567
|
-
|
|
568
|
-
| Funktion | Beschreibung | Beispiel |
|
|
569
|
-
|----------|-------------|----------|
|
|
570
|
-
| `startSession(id, options)` | Startet eine Session mit QR-Code | `await onimai.startSession('session1')` |
|
|
571
|
-
| `startSessionWithPairingCode(id, options)` | Startet mit Pairing-Code | `await onimai.startSessionWithPairingCode('session2', { phoneNumber: '491234567890' })` |
|
|
572
|
-
| `getAllSession()` | Gibt alle aktiven Sessions zurück | `const sessions = onimai.getAllSession()` |
|
|
573
|
-
| `getSession(id)` | Gibt eine spezifische Session zurück | `const session = onimai.getSession('session1')` |
|
|
574
|
-
| `deleteSession(id)` | Löscht eine Session | `await onimai.deleteSession('session1')` |
|
|
575
|
-
| `loadSessionsFromStorage()` | Lädt alle Sessions aus Storage | `const loaded = await onimai.loadSessionsFromStorage()` |
|
|
576
|
-
|
|
577
|
-
### 💬 **Nachrichten-Funktionen**
|
|
578
|
-
|
|
579
|
-
| Funktion | Beschreibung |
|
|
580
|
-
|----------|-------------|
|
|
581
|
-
| `sendMessage(sessionId, jid, content, options)` | Sendet eine Nachricht |
|
|
582
|
-
|
|
583
|
-
**Content-Typen:**
|
|
584
|
-
- `{ text: string }` - Text
|
|
585
|
-
- `{ image: { url: string }, caption?: string }` - Bild
|
|
586
|
-
- `{ video: { url: string }, caption?: string, gifPlayback?: boolean }` - Video/GIF
|
|
587
|
-
- `{ audio: Stream, mimetype: string, ptt?: boolean }` - Audio
|
|
588
|
-
- `{ document: { url: string, filename?: string }, mimetype: string }` - Dokument
|
|
589
|
-
- `{ poll: { name: string, values: string[], selectableCount: number } }` - Umfrage
|
|
590
|
-
- `{ react: { text: string, key: MessageKey } }` - Reaktion
|
|
591
|
-
- `{ delete: MessageKey }` - Löschen
|
|
592
|
-
- `{ pin: { type: number, time: number, key: MessageKey } }` - Anpinnen
|
|
593
|
-
- `{ contacts: { displayName: string, contacts: Array } }` - Kontakt
|
|
594
|
-
- `{ location: { degreesLatitude: number, degreesLongitude: number } }` - Standort
|
|
595
|
-
- `{ forward: Message }` - Weiterleiten
|
|
596
|
-
|
|
597
|
-
### 🎧 **Event-Listener**
|
|
598
|
-
|
|
599
|
-
| Event | Beschreibung | Callback-Parameter |
|
|
600
|
-
|-------|-------------|-------------------|
|
|
601
|
-
| `onMessageReceived` | Neue Nachricht empfangen | `(msg: Message)` |
|
|
602
|
-
| `onMessageUpdate` | Nachrichten-Update | `(sessionId: string, data: UpdateData)` |
|
|
603
|
-
| `onConnected` | Session verbunden | `(sessionId: string)` |
|
|
604
|
-
| `onConnecting` | Session verbindet | `(sessionId: string)` |
|
|
605
|
-
| `onDisconnected` | Session getrennt | `(sessionId: string)` |
|
|
606
|
-
| `onQRUpdated` | QR-Code aktualisiert | `(info: { sessionId: string, qr: string })` |
|
|
607
|
-
| `onPairingCode` | Pairing-Code erhalten | `(sessionId: string, code: string)` |
|
|
608
|
-
|
|
609
|
-
---
|
|
610
|
-
|
|
611
|
-
## ⚠️ Wichtige Hinweise
|
|
612
|
-
|
|
613
|
-
### 🚨 **Disclaimer**
|
|
614
|
-
|
|
615
|
-
> ⚠️ **WICHTIG**: Diese Library funktioniert **ausschließlich** mit **@neelegirl/baileys**!
|
|
616
|
-
>
|
|
617
|
-
> - ✖️ **Kein Spam** oder Massennachrichten
|
|
618
|
-
> - ✖️ **Kein Missbrauch** für unethische Zwecke
|
|
619
|
-
> - ✖️ **Keine Stalkerware** oder automatisierte Überwachung
|
|
620
|
-
> - ✔️ **Verantwortungsvoller Gebrauch** wird erwartet
|
|
621
|
-
|
|
622
|
-
### 🔒 **Sicherheit**
|
|
623
|
-
|
|
624
|
-
- **Nie** deine Session-Daten öffentlich teilen
|
|
625
|
-
- **Immer** `.gitignore` für Credentials-Ordner verwenden
|
|
626
|
-
- **Regelmäßig** Backups erstellen
|
|
627
|
-
- **Sichere** Passwörter für deine Server verwenden
|
|
628
|
-
|
|
629
|
-
### 💡 **Best Practices**
|
|
630
|
-
|
|
631
|
-
1. **Error-Handling**: Immer try-catch für wichtige Operationen
|
|
632
|
-
2. **Rate-Limiting**: Nutze Smart Message Queue für Bulk-Messaging
|
|
633
|
-
3. **Session-Management**: Sessions ordentlich verwalten und löschen wenn nicht mehr benötigt
|
|
634
|
-
4. **Updates**: Regelmäßig auf Updates prüfen (automatisch aktiviert, nur einmal angezeigt)
|
|
635
|
-
|
|
636
|
-
---
|
|
637
|
-
|
|
638
|
-
## 🆕 Was ist neu in Version 1.5.1?
|
|
639
|
-
|
|
640
|
-
### ✨ **Neue Features & Glow-Up**
|
|
641
|
-
|
|
642
|
-
- 📖 **README Glow-Up** – Version 1.5.1, Badges & Changelog
|
|
643
|
-
- ✅ **Kompatibilität** mit **@neelegirl/baileys 2.0.4** & **Baileys API 1.7.2**
|
|
644
|
-
- 🔔 **Update-Check** – Liest Version von **npm-Registry** (registry.npmjs.org), nur 1× pro Prozess
|
|
645
|
-
- 📦 **Abhängigkeit** auf `@neelegirl/baileys@^2.0.4` (empfohlen 2.0.4)
|
|
646
|
-
- 🚀 **Smart Queue Ready** · QR · Pairing · Auto-Reconnect
|
|
647
|
-
- 💎 **Multi-Device** & Session-Management optimiert
|
|
648
|
-
|
|
649
|
-
### 🔄 **Verbesserungen**
|
|
650
|
-
|
|
651
|
-
- Semver-Vergleich für „Update verfügbar“ nur bei wirklich neuerer Version
|
|
652
|
-
- Verbesserte Fehlerbehandlung & Stabilität
|
|
653
|
-
- Schnellerer Verbindungsaufbau · Bessere LID-Unterstützung
|
|
654
|
-
|
|
655
|
-
---
|
|
656
|
-
|
|
657
|
-
## 💬 Support & Community
|
|
658
|
-
|
|
659
|
-
<div align="center">
|
|
660
|
-
|
|
661
|
-
### 🌸 **Made with Love by @neelegirl** 🌸
|
|
662
|
-
|
|
663
|
-
[](https://github.com/neelegirl)
|
|
664
|
-
[](mailto:neelehoven@gmail.com)
|
|
665
|
-
[](https://wa-api.org)
|
|
666
|
-
|
|
667
|
-
**⭐ Wenn dir dieses Projekt gefällt, gib ihm ein Star auf GitHub! ⭐**
|
|
668
|
-
|
|
669
|
-
</div>
|
|
670
|
-
|
|
671
|
-
---
|
|
672
|
-
|
|
673
|
-
## 📝 Changelog
|
|
674
|
-
|
|
675
|
-
### Version 1.5.1 (Aktuell) 🎉
|
|
676
|
-
|
|
677
|
-
- 📖 **README Glow-Up** – Version 1.5.1, Baileys 2.0.5 Badges
|
|
678
|
-
- 🔔 Update-Check von **npm-Registry** (registry.npmjs.org), nur 1× pro Prozess
|
|
679
|
-
- ✨ Kompatibilität mit **@neelegirl/baileys 2.0.4** & **Baileys API 1.7.2**
|
|
680
|
-
- 📦 Abhängigkeit `@neelegirl/baileys@^2.0.4`
|
|
681
|
-
|
|
682
|
-
### Version 1.3.2
|
|
683
|
-
|
|
684
|
-
- 📖 **README Glow-Up** – Version 1.3.2, Baileys 2.0.2 Badges
|
|
685
|
-
- 🔔 Update-Check von **npm-Registry** (registry.npmjs.org), nur 1× pro Prozess
|
|
686
|
-
- ✨ Kompatibilität mit **@neelegirl/baileys 2.0.2** & **Baileys API 1.7.2**
|
|
687
|
-
- 📦 Abhängigkeit `@neelegirl/baileys@^2.0.0`
|
|
688
|
-
- 🚀 Smart Queue Ready · Semver-Vergleich für Update-Hinweis
|
|
689
|
-
- 💎 Multi-Device & Session-Management optimiert
|
|
690
|
-
- 🚀 Smart Queue Ready · Semver-Vergleich für Update-Hinweis
|
|
691
|
-
- 💎 Multi-Device & Session-Management optimiert
|
|
692
|
-
|
|
693
|
-
### Version 1.3.1
|
|
694
|
-
|
|
695
|
-
- 📖 README Glow-Up · Changelog · Baileys 2.0.2
|
|
696
|
-
|
|
697
|
-
### Version 1.2.5
|
|
698
|
-
|
|
699
|
-
- 📖 README Glow-Up · Changelog
|
|
700
|
-
|
|
701
|
-
### Version 1.2.4
|
|
702
|
-
|
|
703
|
-
- 📖 README Glow-Up · Changelog
|
|
704
|
-
|
|
705
|
-
### Version 1.2.3
|
|
706
|
-
|
|
707
|
-
- 📖 README Glow-Up · Changelog
|
|
708
|
-
|
|
709
|
-
### Version 1.2.2
|
|
710
|
-
|
|
711
|
-
- 📖 README Glow-Up · Changelog ergänzt
|
|
712
|
-
|
|
713
|
-
### Version 1.2.1
|
|
714
|
-
|
|
715
|
-
- 📖 README Glow-Up · Update-Check von npm-Registry · Baileys 2.0.2 Badges
|
|
716
|
-
|
|
717
|
-
### Version 1.2.0
|
|
718
|
-
|
|
719
|
-
- 📖 README Glow-Up · Baileys 2.0.0 Badges
|
|
720
|
-
- ✨ Kompatibilität mit @neelegirl/baileys 2.0.0 & Baileys API 1.7.2
|
|
721
|
-
- 🚀 Smart Queue Ready · Auto-Update-Check (1x pro Prozess)
|
|
722
|
-
|
|
723
|
-
### Version 1.1.1
|
|
724
|
-
|
|
725
|
-
- 📖 README Glow-Up · Kompatibilität mit @neelegirl/baileys 1.7.1
|
|
726
|
-
- 🚀 Smart Queue Ready, Auto-Update-Check
|
|
727
|
-
|
|
728
|
-
### Version 1.1.0
|
|
729
|
-
|
|
730
|
-
- ✨ Kompatibilität mit @neelegirl/baileys 1.7.0
|
|
731
|
-
- 🚀 Smart Queue Ready, Auto-Update-Check
|
|
732
|
-
|
|
733
|
-
### Version 1.0.10
|
|
734
|
-
|
|
735
|
-
- ✨ Automatische Update-Prüfung hinzugefügt
|
|
736
|
-
- 🎨 Verbesserte QR-Code-Anzeige
|
|
737
|
-
- 🔄 Kompatibilität mit @neelegirl/baileys 1.6.6
|
|
738
|
-
- 🚀 Verbesserte Stabilität
|
|
739
|
-
- 🐛 Bugfixes für Session-Management
|
|
740
|
-
|
|
741
|
-
### Version 1.0.9
|
|
742
|
-
|
|
743
|
-
- 🔔 Update-Benachrichtigung hinzugefügt
|
|
744
|
-
- 💎 Optimierungen für Multi-Device
|
|
118
|
+
`loadSessionsFromStorage()` liefert die erfolgreich geladenen Session-IDs zurueck.
|
|
745
119
|
|
|
746
|
-
|
|
120
|
+
## Verfuegbare Listener
|
|
747
121
|
|
|
748
|
-
|
|
122
|
+
- `onQRUpdated`
|
|
123
|
+
- `onConnected`
|
|
124
|
+
- `onDisconnected`
|
|
125
|
+
- `onConnecting`
|
|
126
|
+
- `onMessageReceived`
|
|
127
|
+
- `onMessageUpdate`
|
|
128
|
+
- `onPairingCode`
|
|
749
129
|
|
|
750
|
-
|
|
130
|
+
## Grenzen
|
|
751
131
|
|
|
752
|
-
|
|
132
|
+
- kein eingebauter HTTP-Server
|
|
133
|
+
- kein Queue-System
|
|
134
|
+
- keine Word2Web-spezifischen Features im Paket
|
|
135
|
+
- veroeffentlicht als vorgebaute `dist/`-Distribution
|
|
136
|
+
- das Low-Level-Verhalten kommt direkt aus `@neelegirl/baileys`
|
|
753
137
|
|
|
754
|
-
|
|
138
|
+
## Lizenz
|
|
755
139
|
|
|
756
|
-
|
|
140
|
+
ISC
|