@andrey4emk/npm-app-back-b24 0.9.8 → 1.0.1
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 +382 -453
- package/dist/bitrix24/b24.d.ts +19 -0
- package/dist/bitrix24/b24.d.ts.map +1 -0
- package/{bitrix24 → dist/bitrix24}/b24.js +62 -64
- package/dist/bitrix24/eventGet.d.ts +8 -0
- package/dist/bitrix24/eventGet.d.ts.map +1 -0
- package/dist/bitrix24/eventGet.js +92 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/logs/logs.d.ts +9 -0
- package/dist/logs/logs.d.ts.map +1 -0
- package/{logs → dist/logs}/logs.js +8 -20
- package/dist/sendMessage/chatApp.d.ts +37 -0
- package/dist/sendMessage/chatApp.d.ts.map +1 -0
- package/{sendMessage → dist/sendMessage}/chatApp.js +80 -90
- package/dist/sendMessage/email.d.ts +20 -0
- package/dist/sendMessage/email.d.ts.map +1 -0
- package/{sendMessage → dist/sendMessage}/email.js +21 -20
- package/dist/sendMessage/smsgold.d.ts +21 -0
- package/dist/sendMessage/smsgold.d.ts.map +1 -0
- package/{sendMessage → dist/sendMessage}/smsgold.js +38 -35
- package/dist/sendMessage/wappi.d.ts +35 -0
- package/dist/sendMessage/wappi.d.ts.map +1 -0
- package/{sendMessage → dist/sendMessage}/wappi.js +101 -116
- package/dist/types/index.d.ts +226 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/package.json +25 -14
- package/bitrix24/eventGet.js +0 -98
- package/index.js +0 -8
package/README.md
CHANGED
|
@@ -2,19 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
Утилиты для работы с Bitrix24 OAuth на основе `@bitrix24/b24jssdk`.
|
|
4
4
|
|
|
5
|
+
**TypeScript-ready** — пакет полностью написан на TypeScript и включает типы.
|
|
6
|
+
|
|
5
7
|
## Содержание
|
|
6
8
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
9
|
+
- [Установка](#установка)
|
|
10
|
+
- [Использование](#использование)
|
|
11
|
+
- [TypeScript](#typescript)
|
|
12
|
+
- [API](#api)
|
|
13
|
+
- [B24Prepared](#b24prepared)
|
|
14
|
+
- [errTask](#errtask)
|
|
15
|
+
- [Event](#event)
|
|
16
|
+
- [ChatApp](#chatapp)
|
|
17
|
+
- [Wappi](#wappi)
|
|
18
|
+
- [Email](#email)
|
|
19
|
+
- [Smsgold](#smsgold)
|
|
20
|
+
- [Logs](#logs)
|
|
21
|
+
- [Типы](#типы)
|
|
22
|
+
- [Переменные окружения](#переменные-окружения)
|
|
23
|
+
- [Скрипты](#скрипты)
|
|
24
|
+
- [Лицензия](#лицензия)
|
|
18
25
|
|
|
19
26
|
## Установка
|
|
20
27
|
|
|
@@ -24,509 +31,431 @@ npm install @andrey4emk/npm-app-back-b24
|
|
|
24
31
|
|
|
25
32
|
## Использование
|
|
26
33
|
|
|
27
|
-
```
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
```typescript
|
|
35
|
+
import { B24Prepared, errTask, Event, ChatApp, Wappi, Email, Smsgold, logs } from "@andrey4emk/npm-app-back-b24";
|
|
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();
|
|
31
50
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
51
|
+
if (authResult.error) {
|
|
52
|
+
console.error(authResult.message);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
35
55
|
|
|
36
|
-
|
|
56
|
+
const { AuthParams, secret } = authResult.data!;
|
|
37
57
|
|
|
38
|
-
// Создание
|
|
39
|
-
|
|
58
|
+
// Создание клиента B24
|
|
59
|
+
const $b24 = new B24OAuth(AuthParams, secret);
|
|
60
|
+
await $b24.init();
|
|
61
|
+
|
|
62
|
+
// Создание задачи при ошибке
|
|
63
|
+
await errTask($b24, {
|
|
40
64
|
title: "Ошибка синхронизации",
|
|
41
|
-
description: "Детали ошибки
|
|
65
|
+
description: "Детали ошибки",
|
|
66
|
+
responsibleId: 1,
|
|
42
67
|
});
|
|
43
68
|
|
|
44
69
|
// Работа с событиями
|
|
45
|
-
const eventHandler = new Event(
|
|
46
|
-
const
|
|
70
|
+
const eventHandler = new Event($b24);
|
|
71
|
+
const result = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
47
72
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
message: "Привет!",
|
|
53
|
-
});
|
|
73
|
+
if (!result.error && result.data) {
|
|
74
|
+
console.log("ID сущностей:", result.data.entitysId);
|
|
75
|
+
}
|
|
76
|
+
```
|
|
54
77
|
|
|
55
|
-
|
|
56
|
-
|
|
78
|
+
## TypeScript
|
|
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";
|
|
57
123
|
```
|
|
58
124
|
|
|
59
125
|
## API
|
|
60
126
|
|
|
61
|
-
###
|
|
127
|
+
### B24Prepared
|
|
62
128
|
|
|
63
|
-
|
|
129
|
+
Класс для подготовки авторизации Bitrix24.
|
|
64
130
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- **Возвращает:** промис с экземпляром `B24OAuth`, готовым к вызовам REST API.
|
|
68
|
-
- **Ошибки:** выбрасывает `Error` если запись авторизации не найдена в БД.
|
|
131
|
+
```typescript
|
|
132
|
+
import { B24Prepared } from "@andrey4emk/npm-app-back-b24";
|
|
69
133
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
134
|
+
const b24Prepared = new B24Prepared();
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Методы:**
|
|
74
138
|
|
|
75
|
-
-
|
|
139
|
+
- **`makeAuthParams()`** — формирует параметры авторизации из конфига.
|
|
76
140
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
141
|
+
```typescript
|
|
142
|
+
const result = await b24Prepared.makeAuthParams();
|
|
143
|
+
// result: ApiResult<{ AuthParams: B24AuthParams; secret: B24Secret }>
|
|
80
144
|
|
|
81
|
-
```js
|
|
82
|
-
const result = await refresh(AuthB24Model);
|
|
83
145
|
if (!result.error) {
|
|
84
|
-
|
|
146
|
+
const { AuthParams, secret } = result.data!;
|
|
147
|
+
// Используйте с @bitrix24/b24jssdk
|
|
85
148
|
}
|
|
86
149
|
```
|
|
87
150
|
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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));
|
|
108
|
-
```
|
|
151
|
+
- **`save(req, res, $b24)`** — сохраняет токены из фронта или обновляет из бэка.
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
// Из Express endpoint
|
|
155
|
+
app.post("/b24/auth", (req, res) => b24Prepared.save(req, res));
|
|
109
156
|
|
|
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
|
-
});
|
|
157
|
+
// Из бэка для пересохранения
|
|
158
|
+
await b24Prepared.save(null, null, $b24);
|
|
169
159
|
```
|
|
170
160
|
|
|
171
|
-
###
|
|
161
|
+
### errTask
|
|
172
162
|
|
|
173
|
-
|
|
163
|
+
Создаёт служебную задачу в Bitrix24 при ошибках.
|
|
174
164
|
|
|
175
|
-
|
|
176
|
-
|
|
165
|
+
```typescript
|
|
166
|
+
import { errTask } from "@andrey4emk/npm-app-back-b24";
|
|
167
|
+
import type { TaskData, B24Client } from "@andrey4emk/npm-app-back-b24";
|
|
177
168
|
|
|
178
|
-
|
|
179
|
-
|
|
169
|
+
const taskData: TaskData = {
|
|
170
|
+
title: "Ошибка синхронизации",
|
|
171
|
+
description: "Не удалось подключиться к API",
|
|
172
|
+
responsibleId: 42,
|
|
173
|
+
maxTasks: 50,
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const result = await errTask($b24, taskData);
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Параметры `TaskData`:**
|
|
180
|
+
|
|
181
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
182
|
+
| ---------------- | -------------- | --------------- | -------------------------------- |
|
|
183
|
+
| `title` | `string` | **обязательно** | Заголовок задачи |
|
|
184
|
+
| `description` | `string` | `""` | Описание задачи |
|
|
185
|
+
| `createdBy` | `number` | `138` | ID создателя |
|
|
186
|
+
| `responsibleId` | `number` | `1` | ID ответственного |
|
|
187
|
+
| `deadline` | `string` | `+1 день` | Дедлайн в ISO формате |
|
|
188
|
+
| `groupId` | `number\|null` | `null` | ID группы |
|
|
189
|
+
| `accomplices` | `number[]` | `[]` | Массив ID соисполнителей |
|
|
190
|
+
| `maxTasks` | `number` | `100` | Макс. задач с таким названием |
|
|
191
|
+
| `entityTypeAbbr` | `string` | `""` | Код CRM сущности для UF_CRM_TASK |
|
|
180
192
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
```
|
|
193
|
+
### Event
|
|
194
|
+
|
|
195
|
+
Класс для работы с офлайн-событиями Bitrix24.
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
import { Event } from "@andrey4emk/npm-app-back-b24";
|
|
199
|
+
|
|
200
|
+
const eventHandler = new Event($b24);
|
|
201
|
+
|
|
202
|
+
// Получить события
|
|
203
|
+
const result = await eventHandler.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
204
|
+
|
|
205
|
+
if (!result.error && result.data) {
|
|
206
|
+
const events = result.data;
|
|
207
|
+
console.log("Process ID:", events.processId);
|
|
208
|
+
console.log("Entity IDs:", events.entitysId);
|
|
209
|
+
|
|
210
|
+
// Очистить события
|
|
211
|
+
if (events.processId) {
|
|
212
|
+
const messageIds = events.arrMessageIdAndEntityId.map((e) => e.messageId);
|
|
213
|
+
await eventHandler.clear(events.processId, messageIds);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**Методы:**
|
|
219
|
+
|
|
220
|
+
- **`get(eventName)`** — получить события по названию
|
|
221
|
+
- **`clear(processId, messageId)`** — очистить события в Bitrix24
|
|
273
222
|
|
|
274
223
|
### ChatApp
|
|
275
224
|
|
|
276
|
-
|
|
225
|
+
Класс для работы с мессенджерами через ChatApp Online.
|
|
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
|
+
});
|
|
277
262
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
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);
|
|
281
288
|
|
|
282
|
-
|
|
289
|
+
// Отправка сообщения
|
|
290
|
+
const result = await wappi.sendMessageWappi("whatsApp", {
|
|
291
|
+
phone: "+1234567890",
|
|
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.
|
|
283
320
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
321
|
+
```typescript
|
|
322
|
+
import { Email } from "@andrey4emk/npm-app-back-b24";
|
|
323
|
+
import type { EmailAuth, EmailData } from "@andrey4emk/npm-app-back-b24";
|
|
287
324
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
```
|
|
325
|
+
const auth: EmailAuth = {
|
|
326
|
+
user: "your-email@yandex.ru",
|
|
327
|
+
pass: "app-password",
|
|
328
|
+
};
|
|
329
|
+
|
|
330
|
+
const email = new Email(auth);
|
|
331
|
+
|
|
332
|
+
const result = await email.send({
|
|
333
|
+
to: "recipient@example.com",
|
|
334
|
+
subject: "Тема письма",
|
|
335
|
+
text: "Текст письма",
|
|
336
|
+
html: "<p>HTML версия</p>",
|
|
337
|
+
fileUrl: "https://example.com/file.pdf", // Опционально
|
|
338
|
+
fileName: "document.pdf",
|
|
339
|
+
});
|
|
340
|
+
```
|
|
470
341
|
|
|
471
342
|
### Smsgold
|
|
472
343
|
|
|
473
|
-
|
|
344
|
+
Класс для отправки SMS через SMSGold.
|
|
474
345
|
|
|
475
|
-
|
|
476
|
-
|
|
346
|
+
```typescript
|
|
347
|
+
import { Smsgold } from "@andrey4emk/npm-app-back-b24";
|
|
348
|
+
import type { SmsgoldAuth, SmsData } from "@andrey4emk/npm-app-back-b24";
|
|
477
349
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
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
|
+
});
|
|
485
365
|
|
|
486
|
-
|
|
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"` — красный (включен по умолчанию)
|
|
487
392
|
|
|
488
|
-
|
|
489
|
-
| -------------- | ---------------- |
|
|
490
|
-
| `SMSGOLD_USER` | Логин в SMSGold |
|
|
491
|
-
| `SMSGOLD_PASS` | Пароль в SMSGold |
|
|
393
|
+
Настройки хранятся в `config/log.json`.
|
|
492
394
|
|
|
493
|
-
|
|
395
|
+
## Типы
|
|
396
|
+
|
|
397
|
+
### ApiResult
|
|
398
|
+
|
|
399
|
+
Универсальный результат операций:
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
interface ApiResult<T = unknown> {
|
|
403
|
+
error: boolean;
|
|
404
|
+
message: string;
|
|
405
|
+
data?: T;
|
|
406
|
+
result?: T;
|
|
407
|
+
status?: string;
|
|
408
|
+
info?: T;
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### MessageData
|
|
413
|
+
|
|
414
|
+
Данные сообщения для Wappi/ChatApp:
|
|
415
|
+
|
|
416
|
+
```typescript
|
|
417
|
+
interface MessageData {
|
|
418
|
+
phone: string;
|
|
419
|
+
message: string;
|
|
420
|
+
fileUrl?: string;
|
|
421
|
+
fileName?: string;
|
|
422
|
+
sendOpenLine?: boolean;
|
|
423
|
+
}
|
|
424
|
+
```
|
|
494
425
|
|
|
495
426
|
## Переменные окружения
|
|
496
427
|
|
|
497
|
-
| Переменная | Назначение
|
|
498
|
-
| --------------------------- |
|
|
499
|
-
| `
|
|
500
|
-
| `
|
|
501
|
-
| `
|
|
502
|
-
| `
|
|
503
|
-
| `
|
|
504
|
-
| `
|
|
505
|
-
| `
|
|
506
|
-
| `CHATAPP_EMAIL` | Email аккаунта ChatApp |
|
|
507
|
-
| `CHATAPP_PASS` | Пароль аккаунта ChatApp |
|
|
508
|
-
| `CHATAPP_APP_ID` | ID приложения в ChatApp |
|
|
428
|
+
| Переменная | Назначение |
|
|
429
|
+
| --------------------------- | ---------------------------- |
|
|
430
|
+
| `APP_ENV` | Окружение (`DEV` или `PROD`) |
|
|
431
|
+
| `APP_NAME` | Название приложения |
|
|
432
|
+
| `CONFIG_DIR` | Путь к папке с конфигами |
|
|
433
|
+
| `APP_B24_CLIENT_ID` | Client ID для production |
|
|
434
|
+
| `APP_B24_CLIENT_SECRET` | Client Secret для production |
|
|
435
|
+
| `APP_B24_CLIENT_ID_DEV` | Client ID для DEV |
|
|
436
|
+
| `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV |
|
|
509
437
|
|
|
510
438
|
**Пример `.env`:**
|
|
511
439
|
|
|
512
440
|
```env
|
|
513
|
-
APP_B24_DOMEN=mycompany.bitrix24.ru
|
|
514
441
|
APP_ENV=DEV
|
|
442
|
+
APP_NAME=MyApp
|
|
443
|
+
CONFIG_DIR=../config
|
|
444
|
+
|
|
515
445
|
APP_B24_CLIENT_ID_DEV=xxx
|
|
516
446
|
APP_B24_CLIENT_SECRET_DEV=yyy
|
|
517
447
|
APP_B24_CLIENT_ID=aaa
|
|
518
448
|
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
|
|
524
449
|
```
|
|
525
450
|
|
|
526
451
|
## Скрипты
|
|
527
452
|
|
|
528
|
-
|
|
529
|
-
|
|
453
|
+
```bash
|
|
454
|
+
npm run build # Компиляция TypeScript
|
|
455
|
+
npm run build:watch # Компиляция в watch-режиме
|
|
456
|
+
npm run pack:dry # Предпросмотр содержимого пакета
|
|
457
|
+
npm test # Запуск тестов
|
|
458
|
+
```
|
|
530
459
|
|
|
531
460
|
## Лицензия
|
|
532
461
|
|