@andrey4emk/npm-app-back-b24 0.3.3 → 0.3.6

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.
Files changed (4) hide show
  1. package/README.md +213 -0
  2. package/chatApp.js +201 -0
  3. package/config.js +19 -0
  4. package/package.json +4 -2
package/README.md CHANGED
@@ -10,6 +10,7 @@
10
10
  - [OAuth функции](#oauth-функции)
11
11
  - [Утилиты](#утилиты)
12
12
  - [События](#события)
13
+ - [ChatApp](#chatapp)
13
14
  - [Переменные окружения](#переменные-окружения)
14
15
  - [Скрипты](#скрипты)
15
16
  - [Лицензия](#лицензия)
@@ -24,6 +25,7 @@ npm install @andrey4emk/npm-app-back-b24
24
25
 
25
26
  ```js
26
27
  import { create, refresh, save, errTask, Event } from "@andrey4emk/npm-app-back-b24";
28
+ import { chatApp } from "@andrey4emk/npm-app-back-b24";
27
29
  import { AuthB24Model } from "./models/AuthB24.js"; // пример модели
28
30
 
29
31
  // OAuth функции
@@ -41,6 +43,13 @@ await errTask(b24Client, {
41
43
  // Работа с событиями
42
44
  const eventHandler = new Event(b24Client);
43
45
  const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
46
+
47
+ // Работа с ChatApp
48
+ await chatApp.makeTokenChatApp();
49
+ const result = await chatApp.sendMessageChatApp("whatsApp", {
50
+ phone: "+1234567890",
51
+ message: "Привет!",
52
+ });
44
53
  ```
45
54
 
46
55
  ## API
@@ -258,6 +267,203 @@ const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
258
267
  // updated содержит все события, кроме entityId: 101
259
268
  ```
260
269
 
270
+ ### ChatApp
271
+
272
+ - **`chatApp`** — готовый экземпляр класса `ChatApp` для работы с мессенджерами через платформу ChatApp Online.
273
+
274
+ ```js
275
+ import { chatApp } from "@andrey4emk/npm-app-back-b24";
276
+ ```
277
+
278
+ **Методы:**
279
+
280
+ - **`makeTokenChatApp()`** — получить токены доступа для ChatApp API.
281
+
282
+ - **Возвращает:** промис с объектом:
283
+
284
+ ```js
285
+ {
286
+ error: false;
287
+ }
288
+ ```
289
+
290
+ или при ошибке:
291
+
292
+ ```js
293
+ {
294
+ error: true,
295
+ message: "Не удалось получить токен ChatApp",
296
+ data: { /* API response */ }
297
+ }
298
+ ```
299
+
300
+ - **Особенности:**
301
+ - Сохраняет полученные токены в свойствах экземпляра (`accessToken`, `refreshToken` и т.д.).
302
+ - Требует переменные окружения: `CHATAPP_EMAIL`, `CHATAPP_PASS`, `CHATAPP_APP_ID`.
303
+
304
+ ```js
305
+ const result = await chatApp.makeTokenChatApp();
306
+ if (!result.error) {
307
+ console.log("Токены успешно получены");
308
+ }
309
+ ```
310
+
311
+ - **`refreshTokenChatApp()`** — обновить токены доступа.
312
+
313
+ - **Возвращает:** промис с объектом:
314
+
315
+ ```js
316
+ {
317
+ error: false;
318
+ }
319
+ ```
320
+
321
+ или при ошибке:
322
+
323
+ ```js
324
+ {
325
+ error: true,
326
+ message: "Не удалось обновить токен ChatApp",
327
+ data: { /* API response */ }
328
+ }
329
+ ```
330
+
331
+ - **Алгоритм:**
332
+ 1. Пытается обновить токены через API.
333
+ 2. Если обновление не удалось, автоматически получает новые токены через `makeTokenChatApp()`.
334
+
335
+ ```js
336
+ const result = await chatApp.refreshTokenChatApp();
337
+ if (!result.error) {
338
+ console.log("Токены обновлены");
339
+ }
340
+ ```
341
+
342
+ - **`checkTokenChatApp()`** — проверить валидность текущего токена.
343
+
344
+ - **Возвращает:** промис с объектом:
345
+
346
+ ```js
347
+ {
348
+ error: false,
349
+ message: "Токен действителен" // или "Токен обновлен"
350
+ }
351
+ ```
352
+
353
+ или при ошибке:
354
+
355
+ ```js
356
+ {
357
+ error: true,
358
+ message: "<текст ошибки>",
359
+ data: null
360
+ }
361
+ ```
362
+
363
+ - **Особенности:**
364
+ - Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
365
+
366
+ ```js
367
+ const result = await chatApp.checkTokenChatApp();
368
+ console.log(result.message);
369
+ ```
370
+
371
+ - **`getLicensesChatApp()`** — получить список лицензий для текущего аккаунта.
372
+
373
+ - **Возвращает:** промис с объектом:
374
+
375
+ ```js
376
+ {
377
+ error: false,
378
+ message: "Лицензии успешно получены",
379
+ data: [ /* массив лицензий */ ]
380
+ }
381
+ ```
382
+
383
+ или при ошибке:
384
+
385
+ ```js
386
+ {
387
+ error: true,
388
+ message: "Не удалось получить лицензии ChatApp",
389
+ data: null
390
+ }
391
+ ```
392
+
393
+ - **Структура лицензии в массиве:**
394
+ ```js
395
+ {
396
+ id: 15779,
397
+ licenseName: "*5787",
398
+ messengers: [
399
+ { type: "grWhatsApp", name: "[WEB] WhatsApp" }
400
+ ]
401
+ }
402
+ ```
403
+
404
+ ```js
405
+ const result = await chatApp.getLicensesChatApp();
406
+ if (!result.error) {
407
+ console.log("Доступные лицензии:", result.data);
408
+ }
409
+ ```
410
+
411
+ - **`sendMessageChatApp(messengerType, messageData)`** — отправить сообщение через мессенджер.
412
+
413
+ - **Параметры:**
414
+
415
+ - `messengerType` (string) — тип мессенджера: `"whatsApp"` или `"telegram"`.
416
+ - `messageData` (object) — объект с данными сообщения:
417
+ - `phone` (string) — номер телефона или ID чата получателя.
418
+ - `message` (string) — текст сообщения.
419
+
420
+ - **Возвращает:** промис с объектом:
421
+
422
+ ```js
423
+ {
424
+ error: false,
425
+ message: "Сообщение успешно отправлено в ChatApp через whatsApp",
426
+ data: null
427
+ }
428
+ ```
429
+
430
+ или при ошибке:
431
+
432
+ ```js
433
+ {
434
+ error: true,
435
+ message: "Ошибка при отправке сообщения в ChatApp через whatsApp",
436
+ data: null
437
+ }
438
+ ```
439
+
440
+ - **Особенности:**
441
+ - Перед отправкой автоматически проверяет токен через `checkTokenChatApp()`.
442
+ - Использует конфигурацию из [config.js](config.js) для получения ID лицензий и типов мессенджеров.
443
+ - Поддерживает отправку сообщений в WhatsApp и Telegram.
444
+
445
+ ```js
446
+ const result = await chatApp.sendMessageChatApp("whatsApp", {
447
+ phone: "+1234567890",
448
+ message: "Это тестовое сообщение",
449
+ });
450
+
451
+ if (!result.error) {
452
+ console.log(result.message);
453
+ } else {
454
+ console.error(result.message);
455
+ }
456
+ ```
457
+
458
+ **Пример отправки в Telegram:**
459
+
460
+ ```js
461
+ const result = await chatApp.sendMessageChatApp("telegram", {
462
+ phone: "123456789", // ID чата в Telegram
463
+ message: "Привет из приложения!",
464
+ });
465
+ ```
466
+
261
467
  ## Переменные окружения
262
468
 
263
469
  | Переменная | Назначение |
@@ -269,6 +475,9 @@ const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
269
475
  | `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV окружения |
270
476
  | `APP_ENV` | Определяет окружение (`DEV` или production) |
271
477
  | `APP_NAME` | Название приложения (используется в описании задач) |
478
+ | `CHATAPP_EMAIL` | Email аккаунта ChatApp |
479
+ | `CHATAPP_PASS` | Пароль аккаунта ChatApp |
480
+ | `CHATAPP_APP_ID` | ID приложения в ChatApp |
272
481
 
273
482
  **Пример `.env`:**
274
483
 
@@ -280,6 +489,10 @@ APP_B24_CLIENT_SECRET_DEV=yyy
280
489
  APP_B24_CLIENT_ID=aaa
281
490
  APP_B24_CLIENT_SECRET=bbb
282
491
  APP_NAME=MyApp
492
+
493
+ CHATAPP_EMAIL=your-email@example.com
494
+ CHATAPP_PASS=your-password
495
+ CHATAPP_APP_ID=your-app-id
283
496
  ```
284
497
 
285
498
  ## Скрипты
package/chatApp.js ADDED
@@ -0,0 +1,201 @@
1
+ import { config } from "./config.js";
2
+ import dotEnv from "dotenv";
3
+
4
+ dotEnv.config();
5
+
6
+ class ChatApp {
7
+ constructor() {
8
+ this.accessToken = null;
9
+ this.accessTokenEndTime = null;
10
+ this.refreshToken = null;
11
+ this.refreshTokenEndTime = null;
12
+ }
13
+
14
+ async makeTokenChatApp() {
15
+ try {
16
+ const response = await fetch("https://api.chatapp.online/v1/tokens", {
17
+ method: "POST",
18
+ headers: {
19
+ Lang: "en",
20
+ "Content-Type": "application/json",
21
+ Accept: "application/json",
22
+ },
23
+ body: JSON.stringify({
24
+ email: process.env.CHATAPP_EMAIL,
25
+ password: process.env.CHATAPP_PASS,
26
+ appId: process.env.CHATAPP_APP_ID,
27
+ }),
28
+ });
29
+
30
+ const data = await response.json();
31
+ if (!data.success) {
32
+ return { error: true, message: "Не удалось получить токен ChatApp", data: data };
33
+ } else {
34
+ this.accessToken = data.data.accessToken;
35
+ this.accessTokenEndTime = data.data.accessTokenEndTime;
36
+ this.refreshToken = data.data.refreshToken;
37
+ this.refreshTokenEndTime = data.data.refreshTokenEndTime;
38
+ return { error: false };
39
+ }
40
+ } catch (error) {
41
+ return { error: true, message: error.message, data: null };
42
+ }
43
+ }
44
+
45
+ async refreshTokenChatApp() {
46
+ try {
47
+ const response = await fetch("https://api.chatapp.online/v1/tokens/refresh", {
48
+ method: "POST",
49
+ headers: {
50
+ Lang: "en",
51
+ "Content-Type": "application/json",
52
+ Accept: "application/json",
53
+ },
54
+ body: JSON.stringify({
55
+ refreshToken: this.refreshToken,
56
+ }),
57
+ });
58
+ const data = await response.json();
59
+
60
+ if (!data.success) {
61
+ let resMakeToken = await this.makeTokenChatApp();
62
+
63
+ if (resMakeToken.error) {
64
+ return { error: true, message: "Не удалось обновить токен ChatApp", data: data };
65
+ } else {
66
+ return { error: false };
67
+ }
68
+ } else {
69
+ this.accessToken = data.accessToken;
70
+ this.accessTokenEndTime = data.accessTokenEndTime;
71
+ this.refreshToken = data.refreshToken;
72
+ this.refreshTokenEndTime = data.refreshTokenEndTime;
73
+ return { error: false };
74
+ }
75
+ } catch (error) {
76
+ return { error: true, message: error.message, data: null };
77
+ }
78
+ }
79
+
80
+ async checkTokenChatApp() {
81
+ try {
82
+ const response = await fetch("https://api.chatapp.online/v1/tokens/check", {
83
+ method: "POST",
84
+ headers: {
85
+ Lang: "en",
86
+ "Content-Type": "application/json",
87
+ Accept: "application/json",
88
+ },
89
+ body: JSON.stringify({
90
+ accessToken: this.accessToken,
91
+ }),
92
+ });
93
+
94
+ const data = await response.json();
95
+ if (!data.success) {
96
+ await this.refreshTokenChatApp();
97
+ return { error: false, message: "Токен обновлен" };
98
+ } else {
99
+ return { error: false, message: "Токен действителен" };
100
+ }
101
+ } catch (error) {
102
+ return { error: true, message: error.message, data: null };
103
+ }
104
+ }
105
+
106
+ async getLicensesChatApp() {
107
+ try {
108
+ const response = await fetch("https://api.chatapp.online/v1/licenses", {
109
+ method: "GET",
110
+ headers: {
111
+ Lang: "en",
112
+ Accept: "application/json",
113
+ Authorization: this.accessToken,
114
+ },
115
+ });
116
+ const data = await response.json();
117
+
118
+ if (!data.success) {
119
+ return { error: true, message: "Не удалось получить лицензии ChatApp", data: null };
120
+ } else {
121
+ return { error: false, message: "Лицензии успешно получены", data: data.licenses };
122
+ }
123
+ } catch (error) {
124
+ return { error: true, message: error.message, data: null };
125
+ }
126
+ }
127
+
128
+ async sendMessageChatApp(messangerType, messageData) {
129
+ // Проверяем что верно указан messangerType и в messageData есть phone и message
130
+ if (!["whatsApp"].includes(messangerType) && !["telegram"].includes(messangerType)) {
131
+ return { error: true, message: "Неверный тип мессенджера", data: null };
132
+ }
133
+ if (!messageData.phone || !messageData.message) {
134
+ return { error: true, message: "Отсутствует phone или message", data: null };
135
+ }
136
+ let check = await this.checkTokenChatApp();
137
+ if (check.error) {
138
+ return { error: true, message: `Ошибка с токеном ChatApp в функции sendMessageChatApp класса ChatApp\n${check.message}`, data: null };
139
+ }
140
+ let phone = messageData.phone;
141
+ let message = messageData.message;
142
+ let url;
143
+ if (messangerType === "whatsApp") {
144
+ url = `https://api.chatapp.online/v1/licenses/${config.chatApp.type.whatsApp.licenseId}/messengers/${config.chatApp.type.whatsApp.messenger[0].type}/chats/${phone}/messages/text`;
145
+ }
146
+ if (messangerType === "telegram") {
147
+ url = `https://api.chatapp.online/v1/licenses/${config.chatApp.type.telegram.licenseId}/messengers/${config.chatApp.type.telegram.messenger[0].type}/chats/${phone}/messages/text`;
148
+ }
149
+ let res = await fetch(url, {
150
+ method: "POST",
151
+ headers: {
152
+ Lang: "en",
153
+ "Content-Type": "application/json",
154
+ Accept: "application/json",
155
+ Authorization: this.accessToken,
156
+ },
157
+ body: JSON.stringify({
158
+ text: message,
159
+ }),
160
+ });
161
+ let data = await res.json();
162
+ if (!data.success) {
163
+ return { error: true, message: `Ошибка при отправке сообщения в ChatApp через ${messangerType}`, data: null };
164
+ } else {
165
+ return { error: false, message: `Сообщение успешно отправлено в ChatApp через ${messangerType}`, data: null };
166
+ }
167
+ }
168
+
169
+ async phoneCheckChatApp(messangerType, phone) {
170
+ if (!["whatsApp"].includes(messangerType) && !["telegram"].includes(messangerType)) {
171
+ return { error: true, message: "Неверный тип мессенджера", data: null };
172
+ }
173
+ let check = await this.checkTokenChatApp();
174
+ if (check.error) {
175
+ return { error: true, message: `Ошибка с токеном ChatApp в функции phoneCheckChatApp класса ChatApp\n${check.message}`, data: null };
176
+ }
177
+ let url;
178
+ if (messangerType === "whatsApp") {
179
+ url = `https://api.chatapp.online/v1/licenses/${config.chatApp.type.whatsApp.licenseId}/messengers/${config.chatApp.type.whatsApp.messenger[0].type}/chats/${phone}/check`;
180
+ }
181
+ if (messangerType === "telegram") {
182
+ url = `https://api.chatapp.online/v1/licenses/${config.chatApp.type.telegram.licenseId}/messengers/${config.chatApp.type.telegram.messenger[0].type}/chats/${phone}/check`;
183
+ }
184
+ let res = await fetch(url, {
185
+ method: "GET",
186
+ headers: {
187
+ Lang: "en",
188
+ Accept: "application/json",
189
+ Authorization: this.accessToken,
190
+ },
191
+ });
192
+ let data = await res.json();
193
+ if (!data.success) {
194
+ return { error: true, message: `Ошибка при проверке телефона в ChatApp через ${messangerType}`, data: null };
195
+ } else {
196
+ return { error: false, message: `Телефон успешно проверен в ChatApp через ${messangerType}`, data: data };
197
+ }
198
+ }
199
+ }
200
+
201
+ export const chatApp = new ChatApp();
package/config.js ADDED
@@ -0,0 +1,19 @@
1
+ export const config = {
2
+ chatApp: {
3
+ // Получаем из класса ChatApp().getLicensesChatApp и статично сохраняем в конфиге тут
4
+ type: {
5
+ whatsApp: {
6
+ licenseId: 15779,
7
+ licenseTo: 1765027066,
8
+ licenseName: "*5787",
9
+ messenger: [{ type: "grWhatsApp", name: "[WEB] WhatsApp" }],
10
+ },
11
+ telegram: {
12
+ licenseId: 17530,
13
+ licenseTo: 1765552526,
14
+ licenseName: "*6980 telegram",
15
+ messenger: [{ type: "telegram", name: "Telegram Personal" }],
16
+ },
17
+ },
18
+ },
19
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrey4emk/npm-app-back-b24",
3
- "version": "0.3.3",
3
+ "version": "0.3.6",
4
4
  "description": "Bitrix24 OAuth helpers for Node.js projects",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -22,7 +22,9 @@
22
22
  "files": [
23
23
  "index.js",
24
24
  "b24.js",
25
- "eventGet.js"
25
+ "eventGet.js",
26
+ "chatApp.js",
27
+ "config.js"
26
28
  ],
27
29
  "dependencies": {
28
30
  "@bitrix24/b24jssdk": "^0.5.1",