@andrey4emk/npm-app-back-b24 1.0.5 → 1.0.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.
- package/README.md +453 -382
- package/{dist/bitrix24 → bitrix24}/b24.js +65 -64
- package/bitrix24/eventGet.js +98 -0
- package/index.js +8 -0
- package/{dist/logs → logs}/logs.js +20 -8
- package/package.json +14 -35
- package/{dist/sendMessage → sendMessage}/chatApp.js +90 -80
- package/{dist/sendMessage → sendMessage}/email.js +20 -21
- package/{dist/sendMessage → sendMessage}/smsgold.js +37 -40
- package/{dist/sendMessage → sendMessage}/wappi.js +118 -103
- package/dist/bitrix24/b24.d.ts +0 -13
- package/dist/bitrix24/b24.d.ts.map +0 -1
- package/dist/bitrix24/eventGet.d.ts +0 -8
- package/dist/bitrix24/eventGet.d.ts.map +0 -1
- package/dist/bitrix24/eventGet.js +0 -92
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/logs/logs.d.ts +0 -9
- package/dist/logs/logs.d.ts.map +0 -1
- package/dist/sendMessage/chatApp.d.ts +0 -37
- package/dist/sendMessage/chatApp.d.ts.map +0 -1
- package/dist/sendMessage/email.d.ts +0 -20
- package/dist/sendMessage/email.d.ts.map +0 -1
- package/dist/sendMessage/smsgold.d.ts +0 -21
- package/dist/sendMessage/smsgold.d.ts.map +0 -1
- package/dist/sendMessage/wappi.d.ts +0 -37
- package/dist/sendMessage/wappi.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -211
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -5
package/README.md
CHANGED
|
@@ -2,26 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
Утилиты для работы с Bitrix24 OAuth на основе `@bitrix24/b24jssdk`.
|
|
4
4
|
|
|
5
|
-
**TypeScript-ready** — пакет полностью написан на TypeScript и включает типы.
|
|
6
|
-
|
|
7
5
|
## Содержание
|
|
8
6
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- [Logs](#logs)
|
|
21
|
-
- [Типы](#типы)
|
|
22
|
-
- [Переменные окружения](#переменные-окружения)
|
|
23
|
-
- [Скрипты](#скрипты)
|
|
24
|
-
- [Лицензия](#лицензия)
|
|
7
|
+
- [Установка](#установка)
|
|
8
|
+
- [Использование](#использование)
|
|
9
|
+
- [API](#api)
|
|
10
|
+
- [OAuth функции](#oauth-функции)
|
|
11
|
+
- [Утилиты](#утилиты)
|
|
12
|
+
- [События](#события)
|
|
13
|
+
- [ChatApp](#chatapp)
|
|
14
|
+
- [Smsgold](#smsgold)
|
|
15
|
+
- [Переменные окружения](#переменные-окружения)
|
|
16
|
+
- [Скрипты](#скрипты)
|
|
17
|
+
- [Лицензия](#лицензия)
|
|
25
18
|
|
|
26
19
|
## Установка
|
|
27
20
|
|
|
@@ -31,431 +24,509 @@ npm install @andrey4emk/npm-app-back-b24
|
|
|
31
24
|
|
|
32
25
|
## Использование
|
|
33
26
|
|
|
34
|
-
```
|
|
35
|
-
import {
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
import type { B24Client, TaskData, MessageData, ApiResult } from "@andrey4emk/npm-app-back-b24";
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Пример работы с Bitrix24
|
|
42
|
-
|
|
43
|
-
```typescript
|
|
44
|
-
import { B24Prepared, errTask, Event } from "@andrey4emk/npm-app-back-b24";
|
|
45
|
-
import { B24OAuth } from "@bitrix24/b24jssdk";
|
|
46
|
-
|
|
47
|
-
// Подготовка авторизации
|
|
48
|
-
const b24Prepared = new B24Prepared();
|
|
49
|
-
const authResult = await b24Prepared.makeAuthParams();
|
|
27
|
+
```js
|
|
28
|
+
import { create, refresh, save, errTask, Event } from "@andrey4emk/npm-app-back-b24";
|
|
29
|
+
import { chatApp, smsgold } from "@andrey4emk/npm-app-back-b24";
|
|
30
|
+
import { AuthB24Model } from "./models/AuthB24.js"; // пример модели
|
|
50
31
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
32
|
+
// OAuth функции
|
|
33
|
+
const b24Client = await create(AuthB24Model);
|
|
34
|
+
const refreshResult = await refresh(AuthB24Model);
|
|
55
35
|
|
|
56
|
-
|
|
36
|
+
app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
|
|
57
37
|
|
|
58
|
-
// Создание
|
|
59
|
-
|
|
60
|
-
await $b24.init();
|
|
61
|
-
|
|
62
|
-
// Создание задачи при ошибке
|
|
63
|
-
await errTask($b24, {
|
|
38
|
+
// Создание служебной задачи при ошибке
|
|
39
|
+
await errTask(b24Client, {
|
|
64
40
|
title: "Ошибка синхронизации",
|
|
65
|
-
description: "Детали ошибки",
|
|
66
|
-
responsibleId: 1,
|
|
41
|
+
description: "Детали ошибки здесь",
|
|
67
42
|
});
|
|
68
43
|
|
|
69
44
|
// Работа с событиями
|
|
70
|
-
const eventHandler = new Event(
|
|
71
|
-
const
|
|
45
|
+
const eventHandler = new Event(b24Client);
|
|
46
|
+
const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
72
47
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
48
|
+
// Работа с ChatApp
|
|
49
|
+
await chatApp.makeTokenChatApp();
|
|
50
|
+
const result = await chatApp.sendMessageChatApp("whatsApp", {
|
|
51
|
+
phone: "+1234567890",
|
|
52
|
+
message: "Привет!",
|
|
53
|
+
});
|
|
77
54
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
Пакет полностью типизирован. Все типы экспортируются из главного модуля:
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
import type {
|
|
84
|
-
// Общие
|
|
85
|
-
ApiResult,
|
|
86
|
-
|
|
87
|
-
// Bitrix24
|
|
88
|
-
B24AuthConfig,
|
|
89
|
-
B24AuthParams,
|
|
90
|
-
B24Secret,
|
|
91
|
-
B24Client,
|
|
92
|
-
TaskData,
|
|
93
|
-
|
|
94
|
-
// События
|
|
95
|
-
EventMessage,
|
|
96
|
-
EventsResult,
|
|
97
|
-
ConnectorMessage,
|
|
98
|
-
ConnectorEventsResult,
|
|
99
|
-
|
|
100
|
-
// Wappi
|
|
101
|
-
WappiAuth,
|
|
102
|
-
MessageData,
|
|
103
|
-
MessengerType,
|
|
104
|
-
|
|
105
|
-
// ChatApp
|
|
106
|
-
ChatAppMakeParams,
|
|
107
|
-
ChatAppAuthParams,
|
|
108
|
-
ChatAppTypeParams,
|
|
109
|
-
ChatAppMessengerType,
|
|
110
|
-
|
|
111
|
-
// Email
|
|
112
|
-
EmailAuth,
|
|
113
|
-
EmailData,
|
|
114
|
-
|
|
115
|
-
// SMSGold
|
|
116
|
-
SmsgoldAuth,
|
|
117
|
-
SmsData,
|
|
118
|
-
|
|
119
|
-
// Logs
|
|
120
|
-
LogLevel,
|
|
121
|
-
LogConfig,
|
|
122
|
-
} from "@andrey4emk/npm-app-back-b24";
|
|
55
|
+
// Работа с SMSGold
|
|
56
|
+
await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
|
|
123
57
|
```
|
|
124
58
|
|
|
125
59
|
## API
|
|
126
60
|
|
|
127
|
-
###
|
|
61
|
+
### OAuth функции
|
|
128
62
|
|
|
129
|
-
|
|
63
|
+
- **`create(AuthB24Model)`** — создаёт клиента `B24OAuth` с использованием сохранённых в БД токенов.
|
|
130
64
|
|
|
131
|
-
|
|
132
|
-
|
|
65
|
+
- **Параметры:**
|
|
66
|
+
- `AuthB24Model` (Sequelize Model) — модель для получения данных авторизации из БД.
|
|
67
|
+
- **Возвращает:** промис с экземпляром `B24OAuth`, готовым к вызовам REST API.
|
|
68
|
+
- **Ошибки:** выбрасывает `Error` если запись авторизации не найдена в БД.
|
|
133
69
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
70
|
+
```js
|
|
71
|
+
const b24 = await create(AuthB24Model);
|
|
72
|
+
const result = await b24.callMethod("crm.contact.list", { limit: 5 });
|
|
73
|
+
```
|
|
138
74
|
|
|
139
|
-
-
|
|
75
|
+
- **`refresh(AuthB24Model)`** — продлевает токены через Bitrix24 и обновляет запись в БД.
|
|
140
76
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
77
|
+
- **Параметры:**
|
|
78
|
+
- `AuthB24Model` (Sequelize Model) — модель для обновления токенов.
|
|
79
|
+
- **Возвращает:** промис с объектом `{ error: boolean, message: string }`.
|
|
144
80
|
|
|
81
|
+
```js
|
|
82
|
+
const result = await refresh(AuthB24Model);
|
|
145
83
|
if (!result.error) {
|
|
146
|
-
|
|
147
|
-
// Используйте с @bitrix24/b24jssdk
|
|
84
|
+
console.log("Токены обновлены:", result.message);
|
|
148
85
|
}
|
|
149
86
|
```
|
|
150
87
|
|
|
151
|
-
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
88
|
+
- **`save(req, res, AuthB24Model)`** — HTTP-обработчик для сохранения набора токенов из `req.body`.
|
|
89
|
+
|
|
90
|
+
- **Параметры:**
|
|
91
|
+
- `req` (Express Request) — объект запроса с полем `body`.
|
|
92
|
+
- `res` (Express Response) — объект ответа.
|
|
93
|
+
- `AuthB24Model` (Sequelize Model) — модель для сохранения.
|
|
94
|
+
- **Тело запроса (req.body):**
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"access_token": "string",
|
|
98
|
+
"refresh_token": "string",
|
|
99
|
+
"domain": "string",
|
|
100
|
+
"expires_in": "number",
|
|
101
|
+
"member_id": "number"
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
- **Возвращает:** HTTP-ответ с JSON `{ status, message }` (код `201` при успехе, `400`/`500` при ошибках).
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
app.post("/b24/auth", (req, res) => save(req, res, AuthB24Model));
|
|
159
108
|
```
|
|
160
109
|
|
|
161
|
-
###
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
110
|
+
### Утилиты
|
|
111
|
+
|
|
112
|
+
- **`errTask(b24, dataTask)`** — создаёт служебную задачу в Bitrix24 при ошибках/событиях.
|
|
113
|
+
|
|
114
|
+
- **Алгоритм:**
|
|
115
|
+
|
|
116
|
+
1. Сначала проверяет, сколько задач с таким `TITLE` уже создано (через `tasks.task.list`).
|
|
117
|
+
2. Если их меньше чем `maxTasks`, создаёт новую задачу (`tasks.task.add`).
|
|
118
|
+
|
|
119
|
+
- **Параметры:**
|
|
120
|
+
|
|
121
|
+
- `b24` (B24OAuth) — экземпляр клиента Bitrix24.
|
|
122
|
+
- `dataTask` (object) — объект с параметрами задачи (см. ниже).
|
|
123
|
+
|
|
124
|
+
- **Возвращает:** промис с объектом:
|
|
125
|
+
```js
|
|
126
|
+
{
|
|
127
|
+
error: false,
|
|
128
|
+
message: "Задача создана в Битрикс24.",
|
|
129
|
+
result: { /* API response */ }
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
или при превышении лимита:
|
|
133
|
+
```js
|
|
134
|
+
{
|
|
135
|
+
error: false,
|
|
136
|
+
message: "Превышено максимальное количество задач с таким названием (100). Новая задача не создана."
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
или при ошибке:
|
|
140
|
+
```js
|
|
141
|
+
{
|
|
142
|
+
error: true,
|
|
143
|
+
message: "Не удалось создать задачу в Битрикс24: <текст ошибки>"
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Параметры `dataTask`:**
|
|
148
|
+
|
|
149
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
150
|
+
| ---------------- | ------------ | ------------------------- | --------------------------------------------- |
|
|
151
|
+
| `title` | string | **обязательно** | Заголовок задачи |
|
|
152
|
+
| `description` | string | `""` | Описание задачи |
|
|
153
|
+
| `createdBy` | number | `138` | ID создателя |
|
|
154
|
+
| `responsibleId` | number | `1` | ID ответственного |
|
|
155
|
+
| `deadline` | ISO string | `DateTime.now() + 1 день` | Дедлайн в ISO формате |
|
|
156
|
+
| `groupId` | number\|null | `null` | ID группы (опционально) |
|
|
157
|
+
| `accomplices` | array | `[]` | Массив ID соисполнителей |
|
|
158
|
+
| `maxTasks` | number | `100` | Максимум существующих задач с таким названием |
|
|
159
|
+
| `entityTypeAbbr` | string | `""` | Код CRM сущности для `UF_CRM_TASK` |
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
await errTask(b24, {
|
|
163
|
+
title: "Ошибка синхронизации",
|
|
164
|
+
description: "Не удалось подключиться к API",
|
|
165
|
+
responsibleId: 42,
|
|
166
|
+
deadline: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString(),
|
|
167
|
+
maxTasks: 50,
|
|
168
|
+
});
|
|
169
|
+
```
|
|
201
170
|
|
|
202
|
-
|
|
203
|
-
const result = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
171
|
+
### События
|
|
204
172
|
|
|
205
|
-
|
|
206
|
-
const events = result.data;
|
|
207
|
-
console.log("Process ID:", events.processId);
|
|
208
|
-
console.log("Entity IDs:", events.entitysId);
|
|
173
|
+
- **`Event`** — класс для работы с офлайн-событиями Bitrix24.
|
|
209
174
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const messageIds = events.arrMessageIdAndEntityId.map((e) => e.messageId);
|
|
213
|
-
await eventHandler.clear(events.processId, messageIds);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
```
|
|
175
|
+
```js
|
|
176
|
+
import { Event } from "@andrey4emk/npm-app-back-b24";
|
|
217
177
|
|
|
218
|
-
|
|
178
|
+
const eventHandler = new Event(b24);
|
|
179
|
+
```
|
|
219
180
|
|
|
220
|
-
|
|
221
|
-
|
|
181
|
+
**Методы:**
|
|
182
|
+
|
|
183
|
+
- **`get(eventName)`** — получить события по названию.
|
|
184
|
+
|
|
185
|
+
- **Параметры:**
|
|
186
|
+
|
|
187
|
+
- `eventName` (string) — название события (например, `'ONCRMDYNAMICITEMUPDATE_149'`).
|
|
188
|
+
|
|
189
|
+
- **Возвращает:** промис с объектом:
|
|
190
|
+
|
|
191
|
+
```js
|
|
192
|
+
{
|
|
193
|
+
error: false,
|
|
194
|
+
events: {
|
|
195
|
+
processId: "12345",
|
|
196
|
+
entitysId: [101, 102, 103],
|
|
197
|
+
arrMessageIdAndEntityId: [
|
|
198
|
+
{ messageId: "msg_1", entityId: 101 },
|
|
199
|
+
{ messageId: "msg_2", entityId: 102 },
|
|
200
|
+
{ messageId: "msg_3", entityId: 103 }
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
или при ошибке:
|
|
207
|
+
|
|
208
|
+
```js
|
|
209
|
+
{
|
|
210
|
+
error: true,
|
|
211
|
+
status: "error",
|
|
212
|
+
message: "Не удалось получить события. <текст ошибки>"
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
- **Особенности:**
|
|
217
|
+
- Автоматически фильтрует и удаляет события от пользователя с `user_id: '138'`.
|
|
218
|
+
- Если событий нет, возвращает `events` с пустыми массивами.
|
|
219
|
+
|
|
220
|
+
```js
|
|
221
|
+
const { error, events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
222
|
+
if (!error && events.entitysId.length > 0) {
|
|
223
|
+
console.log("Обработанные ID сущностей:", events.entitysId);
|
|
224
|
+
// events.processId — идентификатор процесса для очистки
|
|
225
|
+
// events.arrMessageIdAndEntityId — данные для методов clear() и deleteMessageId()
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
- **`clear(processId, messageId)`** — очистить события в Bitrix24.
|
|
230
|
+
|
|
231
|
+
- **Параметры:**
|
|
232
|
+
|
|
233
|
+
- `processId` (string|number) — ID процесса (получен из `get()`).
|
|
234
|
+
- `messageId` (array|string) — ID или массив ID сообщений для очистки.
|
|
235
|
+
|
|
236
|
+
- **Возвращает:** промис с объектом:
|
|
237
|
+
```js
|
|
238
|
+
{
|
|
239
|
+
error: false;
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
или при ошибке:
|
|
243
|
+
```js
|
|
244
|
+
{
|
|
245
|
+
error: true,
|
|
246
|
+
status: "error",
|
|
247
|
+
message: "Не удалось очистить события. <текст ошибки>"
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
```js
|
|
252
|
+
const { events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
253
|
+
if (events.processId) {
|
|
254
|
+
const messageIds = events.arrMessageIdAndEntityId.map((item) => item.messageId);
|
|
255
|
+
await eventHandler.clear(events.processId, messageIds);
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
- **`deleteMessageId(entityId, arrMessageIdAndEntityId)`** — удалить запись события из массива (локально).
|
|
260
|
+
|
|
261
|
+
- **Параметры:**
|
|
262
|
+
|
|
263
|
+
- `entityId` (number) — ID сущности для удаления.
|
|
264
|
+
- `arrMessageIdAndEntityId` (array) — исходный массив событий.
|
|
265
|
+
|
|
266
|
+
- **Возвращает:** обновлённый массив без записей с указанным `entityId`.
|
|
267
|
+
|
|
268
|
+
```js
|
|
269
|
+
const { events } = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
270
|
+
const updated = eventHandler.deleteMessageId(101, events.arrMessageIdAndEntityId);
|
|
271
|
+
// updated содержит все события, кроме entityId: 101
|
|
272
|
+
```
|
|
222
273
|
|
|
223
274
|
### ChatApp
|
|
224
275
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
```typescript
|
|
228
|
-
import { ChatApp } from "@andrey4emk/npm-app-back-b24";
|
|
229
|
-
import type { ChatAppMakeParams, ChatAppAuthParams, ChatAppTypeParams } from "@andrey4emk/npm-app-back-b24";
|
|
230
|
-
|
|
231
|
-
const makeParams: ChatAppMakeParams = {
|
|
232
|
-
email: "your-email@example.com",
|
|
233
|
-
pass: "your-password",
|
|
234
|
-
appId: "your-app-id",
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
const authParams: ChatAppAuthParams = {
|
|
238
|
-
accessToken: "",
|
|
239
|
-
accessTokenEndTime: "",
|
|
240
|
-
refreshToken: "",
|
|
241
|
-
refreshTokenEndTime: "",
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const typeParams: ChatAppTypeParams = {
|
|
245
|
-
whatsApp: {
|
|
246
|
-
licenseId: "12345",
|
|
247
|
-
messenger: [{ type: "grWhatsApp" }],
|
|
248
|
-
},
|
|
249
|
-
telegram: {
|
|
250
|
-
licenseId: "67890",
|
|
251
|
-
messenger: [{ type: "telegram" }],
|
|
252
|
-
},
|
|
253
|
-
};
|
|
254
|
-
|
|
255
|
-
const chatApp = new ChatApp(makeParams, authParams, typeParams);
|
|
256
|
-
|
|
257
|
-
// Отправка сообщения
|
|
258
|
-
const result = await chatApp.sendMessageChatApp("whatsApp", {
|
|
259
|
-
phone: "+1234567890",
|
|
260
|
-
message: "Привет!",
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
// Отправка файла
|
|
264
|
-
await chatApp.sendFileChatApp("telegram", {
|
|
265
|
-
phone: "123456789",
|
|
266
|
-
message: "Документ",
|
|
267
|
-
fileUrl: "https://example.com/file.pdf",
|
|
268
|
-
fileName: "document.pdf",
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
// Проверка номера
|
|
272
|
-
const check = await chatApp.phoneCheckChatApp("whatsApp", "+1234567890");
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
### Wappi
|
|
276
|
-
|
|
277
|
-
Класс для работы с Wappi API (WhatsApp, Telegram, Max).
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
import { Wappi } from "@andrey4emk/npm-app-back-b24";
|
|
281
|
-
import type { WappiAuth, MessengerType } from "@andrey4emk/npm-app-back-b24";
|
|
282
|
-
|
|
283
|
-
const whatsAppAuth: WappiAuth = { token: "xxx", profile_id: "123" };
|
|
284
|
-
const telegramAuth: WappiAuth = { token: "yyy", profile_id: "456" };
|
|
285
|
-
const maxAuth: WappiAuth = { token: "zzz", profile_id: "789" };
|
|
286
|
-
|
|
287
|
-
const wappi = new Wappi(maxAuth, telegramAuth, whatsAppAuth);
|
|
276
|
+
- **`chatApp`** — готовый экземпляр класса `ChatApp` для работы с мессенджерами через платформу ChatApp Online.
|
|
288
277
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
message: "Привет!",
|
|
293
|
-
sendOpenLine: true, // Отображать в открытой линии Б24
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
// Отправка файла
|
|
297
|
-
await wappi.sendFileWappi("telegram", {
|
|
298
|
-
phone: "+1234567890",
|
|
299
|
-
message: "Документ",
|
|
300
|
-
fileUrl: "https://example.com/file.pdf",
|
|
301
|
-
fileName: "document.pdf",
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
// Проверка номера
|
|
305
|
-
const check = await wappi.phoneCheckWappi("whatsApp", "+1234567890");
|
|
306
|
-
if (!check.error && check.data?.check) {
|
|
307
|
-
console.log("Номер существует в WhatsApp");
|
|
308
|
-
}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**Поддерживаемые мессенджеры (`MessengerType`):**
|
|
312
|
-
|
|
313
|
-
- `"whatsApp"`
|
|
314
|
-
- `"telegram"`
|
|
315
|
-
- `"max"`
|
|
316
|
-
|
|
317
|
-
### Email
|
|
318
|
-
|
|
319
|
-
Класс для отправки email через Yandex SMTP.
|
|
320
|
-
|
|
321
|
-
```typescript
|
|
322
|
-
import { Email } from "@andrey4emk/npm-app-back-b24";
|
|
323
|
-
import type { EmailAuth, EmailData } from "@andrey4emk/npm-app-back-b24";
|
|
278
|
+
```js
|
|
279
|
+
import { chatApp } from "@andrey4emk/npm-app-back-b24";
|
|
280
|
+
```
|
|
324
281
|
|
|
325
|
-
|
|
326
|
-
user: "your-email@yandex.ru",
|
|
327
|
-
pass: "app-password",
|
|
328
|
-
};
|
|
282
|
+
**Методы:**
|
|
329
283
|
|
|
330
|
-
|
|
284
|
+
- **`makeTokenChatApp()`** — получить токены доступа для ChatApp API.
|
|
285
|
+
|
|
286
|
+
- **Возвращает:** промис с объектом:
|
|
331
287
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
```
|
|
288
|
+
```js
|
|
289
|
+
{
|
|
290
|
+
error: false;
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
или при ошибке:
|
|
295
|
+
|
|
296
|
+
```js
|
|
297
|
+
{
|
|
298
|
+
error: true,
|
|
299
|
+
message: "Не удалось получить токен ChatApp",
|
|
300
|
+
data: { /* API response */ }
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
- **Особенности:**
|
|
305
|
+
- Сохраняет полученные токены в свойствах экземпляра (`accessToken`, `refreshToken` и т.д.).
|
|
306
|
+
- Требует переменные окружения: `CHATAPP_EMAIL`, `CHATAPP_PASS`, `CHATAPP_APP_ID`.
|
|
307
|
+
|
|
308
|
+
```js
|
|
309
|
+
const result = await chatApp.makeTokenChatApp();
|
|
310
|
+
if (!result.error) {
|
|
311
|
+
console.log("Токены успешно получены");
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
- **`refreshTokenChatApp()`** — обновить токены доступа.
|
|
316
|
+
|
|
317
|
+
- **Возвращает:** промис с объектом:
|
|
318
|
+
|
|
319
|
+
```js
|
|
320
|
+
{
|
|
321
|
+
error: false;
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
или при ошибке:
|
|
326
|
+
|
|
327
|
+
```js
|
|
328
|
+
{
|
|
329
|
+
error: true,
|
|
330
|
+
message: "Не удалось обновить токен ChatApp",
|
|
331
|
+
data: { /* API response */ }
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
- **Алгоритм:**
|
|
336
|
+
1. Пытается обновить токены через API.
|
|
337
|
+
2. Если обновление не удалось, автоматически получает новые токены через `makeTokenChatApp()`.
|
|
338
|
+
|
|
339
|
+
```js
|
|
340
|
+
const result = await chatApp.refreshTokenChatApp();
|
|
341
|
+
if (!result.error) {
|
|
342
|
+
console.log("Токены обновлены");
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
- **`checkTokenChatApp()`** — проверить валидность текущего токена.
|
|
347
|
+
|
|
348
|
+
- **Возвращает:** промис с объектом:
|
|
349
|
+
|
|
350
|
+
```js
|
|
351
|
+
{
|
|
352
|
+
error: false,
|
|
353
|
+
message: "Токен действителен" // или "Токен обновлен"
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
или при ошибке:
|
|
358
|
+
|
|
359
|
+
```js
|
|
360
|
+
{
|
|
361
|
+
error: true,
|
|
362
|
+
message: "<текст ошибки>",
|
|
363
|
+
data: null
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
- **Особенности:**
|
|
368
|
+
- Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
|
|
369
|
+
|
|
370
|
+
```js
|
|
371
|
+
const result = await chatApp.checkTokenChatApp();
|
|
372
|
+
console.log(result.message);
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
- **`getLicensesChatApp()`** — получить список лицензий для текущего аккаунта.
|
|
376
|
+
|
|
377
|
+
- **Возвращает:** промис с объектом:
|
|
378
|
+
|
|
379
|
+
```js
|
|
380
|
+
{
|
|
381
|
+
error: false,
|
|
382
|
+
message: "Лицензии успешно получены",
|
|
383
|
+
data: [ /* массив лицензий */ ]
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
или при ошибке:
|
|
388
|
+
|
|
389
|
+
```js
|
|
390
|
+
{
|
|
391
|
+
error: true,
|
|
392
|
+
message: "Не удалось получить лицензии ChatApp",
|
|
393
|
+
data: null
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
- **Структура лицензии в массиве:**
|
|
398
|
+
```js
|
|
399
|
+
{
|
|
400
|
+
id: 15779,
|
|
401
|
+
licenseName: "*5787",
|
|
402
|
+
messengers: [
|
|
403
|
+
{ type: "grWhatsApp", name: "[WEB] WhatsApp" }
|
|
404
|
+
]
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
```js
|
|
409
|
+
const result = await chatApp.getLicensesChatApp();
|
|
410
|
+
if (!result.error) {
|
|
411
|
+
console.log("Доступные лицензии:", result.data);
|
|
412
|
+
}
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
- **`sendMessageChatApp(messengerType, messageData)`** — отправить сообщение через мессенджер.
|
|
416
|
+
|
|
417
|
+
- **Параметры:**
|
|
418
|
+
|
|
419
|
+
- `messengerType` (string) — тип мессенджера: `"whatsApp"` или `"telegram"`.
|
|
420
|
+
- `messageData` (object) — объект с данными сообщения:
|
|
421
|
+
- `phone` (string) — номер телефона или ID чата получателя.
|
|
422
|
+
- `message` (string) — текст сообщения.
|
|
423
|
+
|
|
424
|
+
- **Возвращает:** промис с объектом:
|
|
425
|
+
|
|
426
|
+
```js
|
|
427
|
+
{
|
|
428
|
+
error: false,
|
|
429
|
+
message: "Сообщение успешно отправлено в ChatApp через whatsApp",
|
|
430
|
+
data: null
|
|
431
|
+
}
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
или при ошибке:
|
|
435
|
+
|
|
436
|
+
```js
|
|
437
|
+
{
|
|
438
|
+
error: true,
|
|
439
|
+
message: "Ошибка при отправке сообщения в ChatApp через whatsApp",
|
|
440
|
+
data: null
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
- **Особенности:**
|
|
445
|
+
- Перед отправкой автоматически проверяет токен через `checkTokenChatApp()`.
|
|
446
|
+
- Использует конфигурацию из [config.js](config.js) для получения ID лицензий и типов мессенджеров.
|
|
447
|
+
- Поддерживает отправку сообщений в WhatsApp и Telegram.
|
|
448
|
+
|
|
449
|
+
```js
|
|
450
|
+
const result = await chatApp.sendMessageChatApp("whatsApp", {
|
|
451
|
+
phone: "+1234567890",
|
|
452
|
+
message: "Это тестовое сообщение",
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
if (!result.error) {
|
|
456
|
+
console.log(result.message);
|
|
457
|
+
} else {
|
|
458
|
+
console.error(result.message);
|
|
459
|
+
}
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
**Пример отправки в Telegram:**
|
|
463
|
+
|
|
464
|
+
```js
|
|
465
|
+
const result = await chatApp.sendMessageChatApp("telegram", {
|
|
466
|
+
phone: "123456789", // ID чата в Telegram
|
|
467
|
+
message: "Привет из приложения!",
|
|
468
|
+
});
|
|
469
|
+
```
|
|
341
470
|
|
|
342
471
|
### Smsgold
|
|
343
472
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
```typescript
|
|
347
|
-
import { Smsgold } from "@andrey4emk/npm-app-back-b24";
|
|
348
|
-
import type { SmsgoldAuth, SmsData } from "@andrey4emk/npm-app-back-b24";
|
|
349
|
-
|
|
350
|
-
const auth: SmsgoldAuth = {
|
|
351
|
-
user: "login",
|
|
352
|
-
pass: "password",
|
|
353
|
-
};
|
|
354
|
-
|
|
355
|
-
// Без Bitrix24 (без прикрепления файлов)
|
|
356
|
-
const smsgold = new Smsgold(auth);
|
|
357
|
-
|
|
358
|
-
// С Bitrix24 (для прикрепления файлов через диск)
|
|
359
|
-
const smsgoldWithB24 = new Smsgold(auth, $b24);
|
|
360
|
-
|
|
361
|
-
const result = await smsgold.sendSms({
|
|
362
|
-
phone: "+79990000000",
|
|
363
|
-
message: "Готово!",
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
// С файлом (требуется $b24)
|
|
367
|
-
await smsgoldWithB24.sendSms({
|
|
368
|
-
phone: "+79990000000",
|
|
369
|
-
message: "Ваш документ",
|
|
370
|
-
fileUrl: "https://example.com/file.pdf",
|
|
371
|
-
fileName: "document.pdf",
|
|
372
|
-
});
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
### Logs
|
|
376
|
-
|
|
377
|
-
Логирование с цветами и настройками.
|
|
378
|
-
|
|
379
|
-
```typescript
|
|
380
|
-
import { logs } from "@andrey4emk/npm-app-back-b24";
|
|
381
|
-
|
|
382
|
-
logs.add("Информационное сообщение", "info");
|
|
383
|
-
logs.add("Отладочная информация", "debug", { key: "value" });
|
|
384
|
-
logs.add("Ошибка!", "error");
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
**Уровни логирования (`LogLevel`):**
|
|
388
|
-
|
|
389
|
-
- `"info"` — зелёный (включен по умолчанию)
|
|
390
|
-
- `"debug"` — серый (выключен по умолчанию)
|
|
391
|
-
- `"error"` — красный (включен по умолчанию)
|
|
392
|
-
|
|
393
|
-
Настройки хранятся в `config/log.json`.
|
|
394
|
-
|
|
395
|
-
## Типы
|
|
396
|
-
|
|
397
|
-
### ApiResult
|
|
473
|
+
- **`smsgold.sendSms(phone, message)`** — отправляет SMS через сервис SMSGold.
|
|
398
474
|
|
|
399
|
-
|
|
475
|
+
```js
|
|
476
|
+
import { smsgold } from "@andrey4emk/npm-app-back-b24";
|
|
400
477
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
info?: T;
|
|
409
|
-
}
|
|
410
|
-
```
|
|
478
|
+
const result = await smsgold.sendSms("+79990000000", "Готово!");
|
|
479
|
+
if (!result.error) {
|
|
480
|
+
console.log(result.message);
|
|
481
|
+
} else {
|
|
482
|
+
console.error(result.result);
|
|
483
|
+
}
|
|
484
|
+
```
|
|
411
485
|
|
|
412
|
-
|
|
486
|
+
**Требуемые переменные окружения:**
|
|
413
487
|
|
|
414
|
-
|
|
488
|
+
| Переменная | Назначение |
|
|
489
|
+
| -------------- | ---------------- |
|
|
490
|
+
| `SMSGOLD_USER` | Логин в SMSGold |
|
|
491
|
+
| `SMSGOLD_PASS` | Пароль в SMSGold |
|
|
415
492
|
|
|
416
|
-
|
|
417
|
-
interface MessageData {
|
|
418
|
-
phone: string;
|
|
419
|
-
message: string;
|
|
420
|
-
fileUrl?: string;
|
|
421
|
-
fileName?: string;
|
|
422
|
-
sendOpenLine?: boolean;
|
|
423
|
-
}
|
|
424
|
-
```
|
|
493
|
+
Метод возвращает объект `{ error, message, result }`, где в `result` содержатся статус-код HTTP и тело ответа сервиса.
|
|
425
494
|
|
|
426
495
|
## Переменные окружения
|
|
427
496
|
|
|
428
|
-
| Переменная | Назначение
|
|
429
|
-
| --------------------------- |
|
|
430
|
-
| `
|
|
431
|
-
| `
|
|
432
|
-
| `
|
|
433
|
-
| `
|
|
434
|
-
| `
|
|
435
|
-
| `
|
|
436
|
-
| `
|
|
497
|
+
| Переменная | Назначение |
|
|
498
|
+
| --------------------------- | ------------------------------------------------------------- |
|
|
499
|
+
| `APP_B24_DOMEN` | Домен Bitrix24, для которого хранится запись авторизации в БД |
|
|
500
|
+
| `APP_B24_CLIENT_ID` | Client ID для production |
|
|
501
|
+
| `APP_B24_CLIENT_SECRET` | Client Secret для production |
|
|
502
|
+
| `APP_B24_CLIENT_ID_DEV` | Client ID для DEV окружения |
|
|
503
|
+
| `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV окружения |
|
|
504
|
+
| `APP_ENV` | Определяет окружение (`DEV` или production) |
|
|
505
|
+
| `APP_NAME` | Название приложения (используется в описании задач) |
|
|
506
|
+
| `CHATAPP_EMAIL` | Email аккаунта ChatApp |
|
|
507
|
+
| `CHATAPP_PASS` | Пароль аккаунта ChatApp |
|
|
508
|
+
| `CHATAPP_APP_ID` | ID приложения в ChatApp |
|
|
437
509
|
|
|
438
510
|
**Пример `.env`:**
|
|
439
511
|
|
|
440
512
|
```env
|
|
513
|
+
APP_B24_DOMEN=mycompany.bitrix24.ru
|
|
441
514
|
APP_ENV=DEV
|
|
442
|
-
APP_NAME=MyApp
|
|
443
|
-
CONFIG_DIR=../config
|
|
444
|
-
|
|
445
515
|
APP_B24_CLIENT_ID_DEV=xxx
|
|
446
516
|
APP_B24_CLIENT_SECRET_DEV=yyy
|
|
447
517
|
APP_B24_CLIENT_ID=aaa
|
|
448
518
|
APP_B24_CLIENT_SECRET=bbb
|
|
519
|
+
APP_NAME=MyApp
|
|
520
|
+
|
|
521
|
+
CHATAPP_EMAIL=your-email@example.com
|
|
522
|
+
CHATAPP_PASS=your-password
|
|
523
|
+
CHATAPP_APP_ID=your-app-id
|
|
449
524
|
```
|
|
450
525
|
|
|
451
526
|
## Скрипты
|
|
452
527
|
|
|
453
|
-
|
|
454
|
-
npm run
|
|
455
|
-
npm run build:watch # Компиляция в watch-режиме
|
|
456
|
-
npm run pack:dry # Предпросмотр содержимого пакета
|
|
457
|
-
npm test # Запуск тестов
|
|
458
|
-
```
|
|
528
|
+
- `npm run test` — запуск тестов (заглушка).
|
|
529
|
+
- `npm run pack:dry` — предпросмотр содержимого пакета перед публикацией.
|
|
459
530
|
|
|
460
531
|
## Лицензия
|
|
461
532
|
|