@deathnaitsa/wa-api 1.0.0
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/LICENSE +21 -0
- package/dist/Defaults/index.d.ts +18 -0
- package/dist/Defaults/index.d.ts.map +1 -0
- package/dist/Defaults/index.js +28 -0
- package/dist/Error/index.d.ts +5 -0
- package/dist/Error/index.d.ts.map +1 -0
- package/dist/Error/index.js +14 -0
- package/dist/Messaging/index.d.ts +43 -0
- package/dist/Messaging/index.d.ts.map +1 -0
- package/dist/Messaging/index.js +410 -0
- package/dist/Socket/Socket.d.ts +21 -0
- package/dist/Socket/Socket.d.ts.map +1 -0
- package/dist/Socket/Socket.interface.d.ts +4 -0
- package/dist/Socket/Socket.interface.d.ts.map +1 -0
- package/dist/Socket/Socket.interface.js +2 -0
- package/dist/Socket/Socket.js +31 -0
- package/dist/Socket/index.d.ts +22 -0
- package/dist/Socket/index.d.ts.map +1 -0
- package/dist/Socket/index.js +375 -0
- package/dist/Types/WhatsappOptions.d.ts +3 -0
- package/dist/Types/WhatsappOptions.d.ts.map +1 -0
- package/dist/Types/WhatsappOptions.js +2 -0
- package/dist/Types/index.d.ts +51 -0
- package/dist/Types/index.d.ts.map +1 -0
- package/dist/Types/index.js +2 -0
- package/dist/Utils/create-delay.d.ts +2 -0
- package/dist/Utils/create-delay.d.ts.map +1 -0
- package/dist/Utils/create-delay.js +18 -0
- package/dist/Utils/error.d.ts +4 -0
- package/dist/Utils/error.d.ts.map +1 -0
- package/dist/Utils/error.js +8 -0
- package/dist/Utils/index.d.ts +5 -0
- package/dist/Utils/index.d.ts.map +1 -0
- package/dist/Utils/index.js +21 -0
- package/dist/Utils/is-exist.d.ts +3 -0
- package/dist/Utils/is-exist.d.ts.map +1 -0
- package/dist/Utils/is-exist.js +38 -0
- package/dist/Utils/message-status.d.ts +4 -0
- package/dist/Utils/message-status.d.ts.map +1 -0
- package/dist/Utils/message-status.js +18 -0
- package/dist/Utils/phone-to-jid.d.ts +5 -0
- package/dist/Utils/phone-to-jid.d.ts.map +1 -0
- package/dist/Utils/phone-to-jid.js +30 -0
- package/dist/Utils/save-media.d.ts +5 -0
- package/dist/Utils/save-media.d.ts.map +1 -0
- package/dist/Utils/save-media.js +47 -0
- package/dist/Utils/set-credentials-dir.d.ts +2 -0
- package/dist/Utils/set-credentials-dir.d.ts.map +1 -0
- package/dist/Utils/set-credentials-dir.js +8 -0
- package/dist/Utils/set-credentials.d.ts +2 -0
- package/dist/Utils/set-credentials.d.ts.map +1 -0
- package/dist/Utils/set-credentials.js +8 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/whatsapp/index.d.ts +15 -0
- package/dist/whatsapp/index.d.ts.map +1 -0
- package/dist/whatsapp/index.js +206 -0
- package/package.json +37 -0
- package/readme.md +108 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.saveDocumentHandler = exports.saveVideoHandler = exports.saveImageHandler = void 0;
|
|
16
|
+
const baileys_1 = require("@whiskeysockets/baileys");
|
|
17
|
+
const error_1 = __importDefault(require("./error"));
|
|
18
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
19
|
+
const saveMedia = (path, data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
yield promises_1.default.writeFile(path, data.toString("base64"), "base64");
|
|
21
|
+
});
|
|
22
|
+
const saveImageHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
+
var _a;
|
|
24
|
+
if (!((_a = msg.message) === null || _a === void 0 ? void 0 : _a.imageMessage))
|
|
25
|
+
throw new error_1.default("Message is not contain Image");
|
|
26
|
+
const buf = yield (0, baileys_1.downloadMediaMessage)(msg, "buffer", {});
|
|
27
|
+
return saveMedia(path, buf);
|
|
28
|
+
});
|
|
29
|
+
exports.saveImageHandler = saveImageHandler;
|
|
30
|
+
const saveVideoHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
|
|
31
|
+
var _b;
|
|
32
|
+
if (!((_b = msg.message) === null || _b === void 0 ? void 0 : _b.videoMessage))
|
|
33
|
+
throw new error_1.default("Message is not contain Video");
|
|
34
|
+
const buf = yield (0, baileys_1.downloadMediaMessage)(msg, "buffer", {});
|
|
35
|
+
return saveMedia(path, buf);
|
|
36
|
+
});
|
|
37
|
+
exports.saveVideoHandler = saveVideoHandler;
|
|
38
|
+
const saveDocumentHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
|
|
39
|
+
var _c, _d;
|
|
40
|
+
if (!((_c = msg.message) === null || _c === void 0 ? void 0 : _c.documentMessage))
|
|
41
|
+
throw new error_1.default("Message is not contain Document");
|
|
42
|
+
const buf = yield (0, baileys_1.downloadMediaMessage)(msg, "buffer", {});
|
|
43
|
+
const ext = (_d = msg.message.documentMessage.fileName) === null || _d === void 0 ? void 0 : _d.split(".").pop();
|
|
44
|
+
path += "." + ext;
|
|
45
|
+
return saveMedia(path, buf);
|
|
46
|
+
});
|
|
47
|
+
exports.saveDocumentHandler = saveDocumentHandler;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-credentials-dir.d.ts","sourceRoot":"","sources":["../../src/Utils/set-credentials-dir.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,aAAa,MAAM,SAEhD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setCredentialsDir = void 0;
|
|
4
|
+
const Defaults_1 = require("../Defaults");
|
|
5
|
+
const setCredentialsDir = (dirname = "wa_credentials") => {
|
|
6
|
+
Defaults_1.CREDENTIALS.DIR_NAME = dirname;
|
|
7
|
+
};
|
|
8
|
+
exports.setCredentialsDir = setCredentialsDir;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-credentials-dir.d.ts","sourceRoot":"","sources":["../../src/Utils/set-credentials.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,aAAa,MAAM,SAEhD,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setCredentials = void 0;
|
|
4
|
+
const Defaults_1 = require("../Defaults");
|
|
5
|
+
const setCredentials = (dirname = "_credentials") => {
|
|
6
|
+
Defaults_1.CREDENTIALS.SUFFIX = dirname;
|
|
7
|
+
};
|
|
8
|
+
exports.setCredentials = setCredentials;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./Socket"), exports);
|
|
18
|
+
__exportStar(require("./Messaging"), exports);
|
|
19
|
+
__exportStar(require("./Utils"), exports);
|
|
20
|
+
__exportStar(require("./Types"), exports);
|
|
21
|
+
__exportStar(require("./Error"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Socket } from "../Socket/Socket";
|
|
2
|
+
import { WhatsappOptions } from "../Types/WhatsappOptions";
|
|
3
|
+
export declare class Whatsapp {
|
|
4
|
+
constructor(options?: WhatsappOptions);
|
|
5
|
+
sockets: Map<string, Socket>;
|
|
6
|
+
callback: Map<string, Function>;
|
|
7
|
+
retryCount: Map<string, number>;
|
|
8
|
+
load(each?: (socket: Socket) => Socket): Promise<void>;
|
|
9
|
+
private shouldLoadSession;
|
|
10
|
+
private getSocket;
|
|
11
|
+
startSession: (socket: Socket) => Promise<Socket>;
|
|
12
|
+
private isSessionExistAndRunning;
|
|
13
|
+
deleteSession: (sessionId: string) => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Whatsapp/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAc3D,qBAAa,QAAQ;gBACP,OAAO,GAAE,eAAoB;IAEzC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACzC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IAC5C,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IAEtC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM;IAsB5C,OAAO,CAAC,iBAAiB,CAoBvB;IAEF,OAAO,CAAC,SAAS,CACe;IAEhC,YAAY,WAAkB,MAAM,KAAG,QAAQ,MAAM,CAAC,CAiGpD;IAEF,OAAO,CAAC,wBAAwB,CAoB9B;IAEF,aAAa,cAAqB,MAAM,mBAWtC;CACH"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
|
+
};
|
|
37
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
+
exports.Whatsapp = void 0;
|
|
39
|
+
const baileys_1 = __importStar(require("@whiskeysockets/baileys"));
|
|
40
|
+
const Defaults_1 = require("../Defaults");
|
|
41
|
+
const Socket_1 = require("../Socket/Socket");
|
|
42
|
+
const fs_1 = __importDefault(require("fs"));
|
|
43
|
+
const path_1 = __importDefault(require("path"));
|
|
44
|
+
const Error_1 = require("../Error");
|
|
45
|
+
const pino_1 = __importDefault(require("pino"));
|
|
46
|
+
const message_status_1 = require("../Utils/message-status");
|
|
47
|
+
const save_media_1 = require("../Utils/save-media");
|
|
48
|
+
class Whatsapp {
|
|
49
|
+
constructor(options = {}) {
|
|
50
|
+
this.sockets = new Map();
|
|
51
|
+
this.callback = new Map();
|
|
52
|
+
this.retryCount = new Map();
|
|
53
|
+
this.shouldLoadSession = (socket) => {
|
|
54
|
+
if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
55
|
+
fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)) &&
|
|
56
|
+
fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)).length &&
|
|
57
|
+
!this.getSocket(socket.id)) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
};
|
|
62
|
+
this.getSocket = (key) => { var _a; return (_a = this.sockets.get(key)) !== null && _a !== void 0 ? _a : null; };
|
|
63
|
+
this.startSession = (socket) => __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
if (this.isSessionExistAndRunning(socket))
|
|
65
|
+
throw new Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(socket.id));
|
|
66
|
+
const logger = (0, pino_1.default)({ level: "silent" });
|
|
67
|
+
const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
|
|
68
|
+
const startSocket = () => __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
var _a;
|
|
70
|
+
const { state, saveCreds } = yield (0, baileys_1.useMultiFileAuthState)(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX));
|
|
71
|
+
const sock = (0, baileys_1.default)({
|
|
72
|
+
version,
|
|
73
|
+
auth: {
|
|
74
|
+
creds: state.creds,
|
|
75
|
+
keys: (0, baileys_1.makeCacheableSignalKeyStore)(state.keys, logger),
|
|
76
|
+
},
|
|
77
|
+
logger,
|
|
78
|
+
markOnlineOnConnect: false,
|
|
79
|
+
browser: baileys_1.Browsers.ubuntu("Chrome"),
|
|
80
|
+
});
|
|
81
|
+
socket.socket = sock;
|
|
82
|
+
this.sockets.set(socket.id, socket);
|
|
83
|
+
try {
|
|
84
|
+
sock.ev.process((events) => __awaiter(this, void 0, void 0, function* () {
|
|
85
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
86
|
+
if (events["connection.update"]) {
|
|
87
|
+
const update = events["connection.update"];
|
|
88
|
+
const { connection, lastDisconnect } = update;
|
|
89
|
+
if (update.qr) {
|
|
90
|
+
(_b = socket.onQr) === null || _b === void 0 ? void 0 : _b.call(socket, update.qr);
|
|
91
|
+
}
|
|
92
|
+
if (connection == "connecting") {
|
|
93
|
+
(_c = socket.onConnecting) === null || _c === void 0 ? void 0 : _c.call(socket);
|
|
94
|
+
}
|
|
95
|
+
if (connection === "close") {
|
|
96
|
+
const code = (_e = (_d = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _d === void 0 ? void 0 : _d.output) === null || _e === void 0 ? void 0 : _e.statusCode;
|
|
97
|
+
let retryAttempt = (_f = this.retryCount.get(socket.id)) !== null && _f !== void 0 ? _f : 0;
|
|
98
|
+
let shouldRetry;
|
|
99
|
+
if (code != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
100
|
+
shouldRetry = true;
|
|
101
|
+
}
|
|
102
|
+
if (shouldRetry) {
|
|
103
|
+
retryAttempt++;
|
|
104
|
+
}
|
|
105
|
+
if (shouldRetry) {
|
|
106
|
+
this.retryCount.set(socket.id, retryAttempt);
|
|
107
|
+
startSocket();
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.retryCount.delete(socket.id);
|
|
111
|
+
this.deleteSession(socket.id);
|
|
112
|
+
(_g = socket.onDisconnected) === null || _g === void 0 ? void 0 : _g.call(socket);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (connection == "open") {
|
|
116
|
+
this.retryCount.delete(socket.id);
|
|
117
|
+
(_h = socket.onConnected) === null || _h === void 0 ? void 0 : _h.call(socket);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (events["creds.update"]) {
|
|
121
|
+
yield saveCreds();
|
|
122
|
+
}
|
|
123
|
+
if (events["messages.update"]) {
|
|
124
|
+
const msg = events["messages.update"][0];
|
|
125
|
+
const data = Object.assign({ sessionId: socket.id, messageStatus: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
|
|
126
|
+
(_j = socket.onMessageUpdated) === null || _j === void 0 ? void 0 : _j.call(socket, data);
|
|
127
|
+
}
|
|
128
|
+
if (events["messages.upsert"]) {
|
|
129
|
+
const msg = (_k = events["messages.upsert"]
|
|
130
|
+
.messages) === null || _k === void 0 ? void 0 : _k[0];
|
|
131
|
+
msg.sessionId = socket.id;
|
|
132
|
+
msg.saveImage = (path) => (0, save_media_1.saveImageHandler)(msg, path);
|
|
133
|
+
msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
|
|
134
|
+
msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
|
|
135
|
+
(_l = socket.onMessageReceived) === null || _l === void 0 ? void 0 : _l.call(socket, msg);
|
|
136
|
+
}
|
|
137
|
+
}));
|
|
138
|
+
if (!sock.authState.creds.registered) {
|
|
139
|
+
yield new Promise((resolve) => setTimeout(resolve, 5000));
|
|
140
|
+
const code = yield sock.requestPairingCode(socket.phoneNumber);
|
|
141
|
+
console.log(code);
|
|
142
|
+
(_a = socket.onPairing) === null || _a === void 0 ? void 0 : _a.call(socket, code);
|
|
143
|
+
}
|
|
144
|
+
return socket;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.log(error.message);
|
|
148
|
+
return socket;
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
return startSocket();
|
|
152
|
+
});
|
|
153
|
+
this.isSessionExistAndRunning = (socket) => {
|
|
154
|
+
if (fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME)) &&
|
|
155
|
+
fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)) &&
|
|
156
|
+
fs_1.default.readdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX)).length &&
|
|
157
|
+
this.getSocket(socket.id)) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
};
|
|
162
|
+
this.deleteSession = (sessionId) => __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
const socket = this.getSocket(sessionId);
|
|
164
|
+
if (!socket)
|
|
165
|
+
return;
|
|
166
|
+
yield socket.logout();
|
|
167
|
+
const dir = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, socket.id + "_" + socket.phoneNumber + Defaults_1.CREDENTIALS.SUFFIX);
|
|
168
|
+
if (fs_1.default.existsSync(dir)) {
|
|
169
|
+
fs_1.default.rmSync(dir, { force: true, recursive: true });
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
load(each) {
|
|
174
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
+
if (!fs_1.default.existsSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME))) {
|
|
176
|
+
fs_1.default.mkdirSync(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME));
|
|
177
|
+
}
|
|
178
|
+
fs_1.default.readdir(path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME), (err, dirs) => __awaiter(this, void 0, void 0, function* () {
|
|
179
|
+
var _a;
|
|
180
|
+
if (err) {
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
for (const dir of dirs) {
|
|
184
|
+
const sessionId = dir.split("_")[0];
|
|
185
|
+
const phoneNumber = dir.split("_")[1];
|
|
186
|
+
let socket = new Socket_1.Socket({
|
|
187
|
+
id: sessionId,
|
|
188
|
+
phoneNumber: phoneNumber,
|
|
189
|
+
});
|
|
190
|
+
socket = (_a = each === null || each === void 0 ? void 0 : each(socket)) !== null && _a !== void 0 ? _a : socket;
|
|
191
|
+
if (!this.shouldLoadSession(socket))
|
|
192
|
+
continue;
|
|
193
|
+
this.startSession(socket);
|
|
194
|
+
}
|
|
195
|
+
}));
|
|
196
|
+
});
|
|
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);
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deathnaitsa/wa-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi Session Whatsapp Library",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/DeathNaitsa/wa-api.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/DeathNaitsa/wa-api#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/DeathNaitsa/wa-api/issues"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist/**/*"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"start": "tsc && node ./dist/index.js",
|
|
21
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
22
|
+
"run-script": "node ./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"author": "DeathNaitsa",
|
|
25
|
+
"license": "ISC",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@adiwajshing/keyed-db": "^0.2.4",
|
|
28
|
+
"@hapi/boom": "^10.0.1",
|
|
29
|
+
"@whiskeysockets/baileys": "^6.7.16",
|
|
30
|
+
"mime": "^4.0.7",
|
|
31
|
+
"pino": "^9.6.0",
|
|
32
|
+
"qrcode-terminal": "^0.12.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/mime": "^4.0.0"
|
|
36
|
+
}
|
|
37
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# wa-api
|
|
2
|
+
|
|
3
|
+
Leichte Bibliothek zur Verwaltung mehrerer WhatsApp-Sessions – mit **einer** universellen `sendMessage`-Funktion für **alle** Nachrichtentypen.
|
|
4
|
+
|
|
5
|
+
## 📦 Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @DeathNaitsa/wa-api@latest
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 🔌 Import & Setup
|
|
12
|
+
|
|
13
|
+
Verwende den klassischen Import-Stil:
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
// CommonJS
|
|
17
|
+
const wa = require('@DeathNaitsa/wa-api');
|
|
18
|
+
|
|
19
|
+
// ES Module
|
|
20
|
+
import * as wa from '@DeathNaitsa/wa-api';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Danach stehen dir alle Funktionen unter dem Namespace `wa` zur Verfügung.
|
|
24
|
+
|
|
25
|
+
## 🚀 Session Management
|
|
26
|
+
|
|
27
|
+
```js
|
|
28
|
+
// Neue Session erzeugen und QR-Code scannen
|
|
29
|
+
const session = await wa.startSession('meineSession');
|
|
30
|
+
|
|
31
|
+
// Alternativ: per Pairing-Code starten
|
|
32
|
+
const paired = await wa.startSessionWithPairingCode('meineSession', { phoneNumber: '491234567890' });
|
|
33
|
+
|
|
34
|
+
// Alle aktiven Sessions abrufen
|
|
35
|
+
const sessions = wa.getAllSession(); // z.B. ['meineSession']
|
|
36
|
+
|
|
37
|
+
// Metadaten einer Session abrufen
|
|
38
|
+
const data = wa.getSession('meineSession');
|
|
39
|
+
|
|
40
|
+
// Vorhandene Sessions aus Ordner automatisch laden
|
|
41
|
+
const loaded = await wa.loadSessionsFromStorage();
|
|
42
|
+
console.log('Geladene Sessions:', loaded);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 💬 Nachrichten senden mit `sendMessage`
|
|
46
|
+
|
|
47
|
+
Eine **einzige** Funktion für **Text**, **Media**, **Polls**, **Reaktionen**, **Löschen/Pinning**, **Kontakte**, **Standort**, **Weiterleiten** u.v.m.
|
|
48
|
+
|
|
49
|
+
```js
|
|
50
|
+
await wa.sendMessage(
|
|
51
|
+
'meineSession', // sessionId
|
|
52
|
+
'491234567890@c.us', // JID oder Telefonnummer
|
|
53
|
+
content, // AnyMessageContent-Objekt
|
|
54
|
+
options // MiscMessageGenerationOptions (optional)
|
|
55
|
+
);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Beispiele für `content` & `options`
|
|
59
|
+
|
|
60
|
+
| Typ | content-Beispiel | optionale Flags | Beschreibung |
|
|
61
|
+
| ------------ | ----------------------------------------------------------------------------------------------- | ---------------------- | --------------------------------------------- |
|
|
62
|
+
| **Text** | `{ text: 'Hallo Welt!' }` | `{ quoted, mentions }` | Einfache Textnachricht |
|
|
63
|
+
| **Quote** | `{ text: 'Antwort...' }`, `options: { quoted: msgObj }` | | Text als Antwort (Quote) |
|
|
64
|
+
| **Mention** | `{ text: '@491234567890 Hallo' }`, `options: { mentions: ['491234567890@s.whatsapp.net'] }` | | Erwähnung in Text |
|
|
65
|
+
| **Bild** | `{ image: { url:'./bild.png' }, caption:'Bild', viewOnce:true }` | `viewOnce` | Bild senden; `viewOnce` für Einmaldarstellung |
|
|
66
|
+
| **Video** | `{ video: { url:'./video.mp4' }, caption:'Video', gifPlayback:true }` | `gifPlayback` | Video oder GIF (als MP4) |
|
|
67
|
+
| **Audio** | `{ audio: { url:'./audio.ogg' }, mimetype:'audio/ogg', ptt:true }` | `ptt` | Audio/Sprachnachricht |
|
|
68
|
+
| **Dokument** | `{ document: { url:'./doc.pdf', filename:'D.pdf' } }` | | Datei/Dokument |
|
|
69
|
+
| **Umfrage** | `{ poll: { name:'Umfrage?', values:['A','B'], selectableCount:1, toAnnouncementGroup:false } }` | | Neue Umfrage |
|
|
70
|
+
| **Reaktion** | `{ react: { text:'👍', key:msgObj.key } }` | | Nachricht mit Emoji reagieren |
|
|
71
|
+
| **Löschen** | `{ delete: msgObj.key }` | | Nachricht für alle löschen |
|
|
72
|
+
| **Pinning** | `{ pin: { type:1, time:86400, key:msgObj.key } }` | | Nachricht pinnen (1) oder entpinnen (0) |
|
|
73
|
+
| **Kontakte** | `{ contacts:{ displayName:'Max', contacts:[{ vcard }] } }` | | Kontaktkarte |
|
|
74
|
+
| **Standort** | `{ location:{ degreesLatitude:52.52, degreesLongitude:13.405 } }` | | Standort |
|
|
75
|
+
| **Weiterl.** | `{ forward: msgToForward }` | | Nachricht weiterleiten |
|
|
76
|
+
|
|
77
|
+
> **Hinweis:** Weitere Flags und Optionen (`edit`, `mentions`, `quoted`, etc.) können über das `options`-Objekt übergeben werden.
|
|
78
|
+
|
|
79
|
+
## 🎧 Listener
|
|
80
|
+
|
|
81
|
+
```js
|
|
82
|
+
// Eingehende Nachrichten
|
|
83
|
+
wa.onMessageReceived(msg => console.log('Neue Message:', msg));
|
|
84
|
+
|
|
85
|
+
// QR-Code zum Scannen aktualisiert
|
|
86
|
+
wa.onQRUpdated(({ sessionId, qr }) => console.log(`Scan QR (${sessionId}):`, qr));
|
|
87
|
+
|
|
88
|
+
// Session erfolgreich verbunden
|
|
89
|
+
wa.onConnected(sessionId => console.log(`Session online: ${sessionId}`));
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## ⚠️ Fehlerbehandlung
|
|
93
|
+
|
|
94
|
+
Alle Fehler werden als `WhatsappError` geworfen:
|
|
95
|
+
|
|
96
|
+
```js
|
|
97
|
+
try {
|
|
98
|
+
await wa.sendMessage(...);
|
|
99
|
+
} catch (e) {
|
|
100
|
+
if (e instanceof wa.WhatsappError) {
|
|
101
|
+
console.error('WhatsApp-Fehler:', e.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
© 2025 `@DeathNaitsa/wa-api` • Support: [sebloidl13@gmail.com](mailto:sebloidl13@gmail.com)
|