@andrey4emk/npm-app-back-b24 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +334 -263
- package/bitrix24/errTaskB24.ts +5 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -7,11 +7,14 @@
|
|
|
7
7
|
- [Установка](#установка)
|
|
8
8
|
- [Использование](#использование)
|
|
9
9
|
- [API](#api)
|
|
10
|
-
- [OAuth
|
|
11
|
-
- [
|
|
10
|
+
- [Bitrix24 OAuth](#bitrix24-oauth)
|
|
11
|
+
- [Задачи ошибок](#задачи-ошибок)
|
|
12
12
|
- [События](#события)
|
|
13
13
|
- [ChatApp](#chatapp)
|
|
14
14
|
- [Smsgold](#smsgold)
|
|
15
|
+
- [Email](#email)
|
|
16
|
+
- [Wappi](#wappi)
|
|
17
|
+
- [Логирование](#логирование)
|
|
15
18
|
- [Переменные окружения](#переменные-окружения)
|
|
16
19
|
- [Скрипты](#скрипты)
|
|
17
20
|
- [Лицензия](#лицензия)
|
|
@@ -25,72 +28,91 @@ npm install @andrey4emk/npm-app-back-b24
|
|
|
25
28
|
## Использование
|
|
26
29
|
|
|
27
30
|
```js
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
import {
|
|
32
|
+
$b24,
|
|
33
|
+
saveAuthB24Handler,
|
|
34
|
+
refreshAndSaveTokens,
|
|
35
|
+
errorB24,
|
|
36
|
+
event,
|
|
37
|
+
Event,
|
|
38
|
+
ChatApp,
|
|
39
|
+
Smsgold,
|
|
40
|
+
Email,
|
|
41
|
+
Wappi,
|
|
42
|
+
logs,
|
|
43
|
+
} from "@andrey4emk/npm-app-back-b24";
|
|
44
|
+
|
|
45
|
+
// $b24 — готовый экземпляр B24OAuth (или null, если токены не настроены)
|
|
46
|
+
if ($b24) {
|
|
47
|
+
const result = await $b24.callMethod("crm.contact.list", { limit: 5 });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// HTTP-обработчик для сохранения токенов с фронта
|
|
51
|
+
app.post("/b24/auth", saveAuthB24Handler);
|
|
52
|
+
|
|
53
|
+
// Обновление токенов вручную
|
|
54
|
+
const refreshResult = await refreshAndSaveTokens();
|
|
37
55
|
|
|
38
56
|
// Создание служебной задачи при ошибке
|
|
39
|
-
await
|
|
57
|
+
await errorB24({
|
|
40
58
|
title: "Ошибка синхронизации",
|
|
41
59
|
description: "Детали ошибки здесь",
|
|
60
|
+
ufCrmTask: ["D_5"],
|
|
42
61
|
});
|
|
43
62
|
|
|
44
|
-
// Работа с событиями
|
|
45
|
-
|
|
46
|
-
const { error,
|
|
63
|
+
// Работа с событиями (готовый экземпляр, или null если $b24 не инициализирован)
|
|
64
|
+
if (event) {
|
|
65
|
+
const { error, data } = await event.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
66
|
+
}
|
|
47
67
|
|
|
48
|
-
//
|
|
49
|
-
|
|
50
|
-
|
|
68
|
+
// ChatApp — создаёте экземпляр самостоятельно
|
|
69
|
+
const chatApp = new ChatApp(makeParam, authParam, typeParam);
|
|
70
|
+
await chatApp.sendMessageChatApp("whatsApp", {
|
|
51
71
|
phone: "+1234567890",
|
|
52
72
|
message: "Привет!",
|
|
53
73
|
});
|
|
54
74
|
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
75
|
+
// Smsgold — создаёте экземпляр самостоятельно
|
|
76
|
+
const smsClient = new Smsgold({ user: "login", pass: "password" });
|
|
77
|
+
await smsClient.sendSms({ phone: "+79990000000", message: "Привет!" });
|
|
58
78
|
|
|
59
|
-
|
|
79
|
+
// Email — создаёте экземпляр самостоятельно
|
|
80
|
+
const emailClient = new Email({ user: "email@yandex.ru", pass: "app-password" });
|
|
81
|
+
await emailClient.send({ to: "dest@mail.ru", subject: "Тема", text: "Текст" });
|
|
60
82
|
|
|
61
|
-
|
|
83
|
+
// Wappi — создаёте экземпляр самостоятельно
|
|
84
|
+
const wappi = new Wappi(maxAuth, telegaAuth, whatsAppAuth);
|
|
85
|
+
await wappi.sendMessageWappi("whatsApp", { phone: "+1234567890", message: "Привет!" });
|
|
62
86
|
|
|
63
|
-
|
|
87
|
+
// Логирование
|
|
88
|
+
logs.add("Сообщение", "info");
|
|
89
|
+
```
|
|
64
90
|
|
|
65
|
-
|
|
66
|
-
- `AuthB24Model` (Sequelize Model) — модель для получения данных авторизации из БД.
|
|
67
|
-
- **Возвращает:** промис с экземпляром `B24OAuth`, готовым к вызовам REST API.
|
|
68
|
-
- **Ошибки:** выбрасывает `Error` если запись авторизации не найдена в БД.
|
|
91
|
+
## API
|
|
69
92
|
|
|
70
|
-
|
|
71
|
-
const b24 = await create(AuthB24Model);
|
|
72
|
-
const result = await b24.callMethod("crm.contact.list", { limit: 5 });
|
|
73
|
-
```
|
|
93
|
+
### Bitrix24 OAuth
|
|
74
94
|
|
|
75
|
-
|
|
95
|
+
Модуль работает с токенами через файл `authB24.json` (используется библиотека `conf`). Модель БД не требуется.
|
|
76
96
|
|
|
77
|
-
|
|
78
|
-
- `AuthB24Model` (Sequelize Model) — модель для обновления токенов.
|
|
79
|
-
- **Возвращает:** промис с объектом `{ error: boolean, message: string }`.
|
|
97
|
+
- **`$b24`** — готовый экземпляр `B24OAuth`, создаётся автоматически при импорте на основе сохранённых токенов. Если данные авторизации отсутствуют — `null`.
|
|
80
98
|
|
|
81
99
|
```js
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
100
|
+
import { $b24 } from "@andrey4emk/npm-app-back-b24";
|
|
101
|
+
|
|
102
|
+
if ($b24) {
|
|
103
|
+
const result = await $b24.callMethod("crm.contact.list", { limit: 5 });
|
|
85
104
|
}
|
|
86
105
|
```
|
|
87
106
|
|
|
88
|
-
|
|
107
|
+
**Особенности:**
|
|
108
|
+
- При обновлении токенов SDK автоматически сохраняет их в файл через callback `setCallbackRefreshAuth`.
|
|
109
|
+
- Окружение (`DEV`/`PROD`) определяется переменной `APP_ENV` — от неё зависят используемые `CLIENT_ID`/`CLIENT_SECRET`.
|
|
110
|
+
|
|
111
|
+
- **`saveAuthB24Handler(req, res)`** — HTTP-обработчик для сохранения набора токенов из `req.body`.
|
|
89
112
|
|
|
90
113
|
- **Параметры:**
|
|
91
114
|
- `req` (Express Request) — объект запроса с полем `body`.
|
|
92
115
|
- `res` (Express Response) — объект ответа.
|
|
93
|
-
- `AuthB24Model` (Sequelize Model) — модель для сохранения.
|
|
94
116
|
- **Тело запроса (req.body):**
|
|
95
117
|
```json
|
|
96
118
|
{
|
|
@@ -98,18 +120,35 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
|
|
|
98
120
|
"refresh_token": "string",
|
|
99
121
|
"domain": "string",
|
|
100
122
|
"expires_in": "number",
|
|
101
|
-
"member_id": "
|
|
123
|
+
"member_id": "string"
|
|
102
124
|
}
|
|
103
125
|
```
|
|
104
126
|
- **Возвращает:** HTTP-ответ с JSON `{ status, message }` (код `201` при успехе, `400`/`500` при ошибках).
|
|
105
127
|
|
|
106
128
|
```js
|
|
107
|
-
app.post("/b24/auth",
|
|
129
|
+
app.post("/b24/auth", saveAuthB24Handler);
|
|
108
130
|
```
|
|
109
131
|
|
|
110
|
-
|
|
132
|
+
- **`refreshAndSaveTokens()`** — обновляет токены из текущего экземпляра `$b24` и сохраняет в файл.
|
|
133
|
+
|
|
134
|
+
- **Возвращает:** промис с объектом `{ error: boolean, message: string }`.
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
const result = await refreshAndSaveTokens();
|
|
138
|
+
if (!result.error) {
|
|
139
|
+
console.log("Токены обновлены:", result.message);
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- **`saveTokens(authData)`** — низкоуровневая функция для прямого сохранения токенов в файл.
|
|
144
|
+
|
|
145
|
+
- **Параметры:**
|
|
146
|
+
- `authData` (AuthData) — объект с полями `access_token`, `refresh_token`, `domain`, `expires_in`, `member_id`, `expires`.
|
|
147
|
+
- **Возвращает:** объект `{ error: boolean, message: string }`.
|
|
111
148
|
|
|
112
|
-
|
|
149
|
+
### Задачи ошибок
|
|
150
|
+
|
|
151
|
+
- **`errorB24(dataTask)`** — создаёт служебную задачу в Bitrix24 при ошибках/событиях. Использует глобальный `$b24`.
|
|
113
152
|
|
|
114
153
|
- **Алгоритм:**
|
|
115
154
|
|
|
@@ -118,15 +157,14 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
|
|
|
118
157
|
|
|
119
158
|
- **Параметры:**
|
|
120
159
|
|
|
121
|
-
- `
|
|
122
|
-
- `dataTask` (object) — объект с параметрами задачи (см. ниже).
|
|
160
|
+
- `dataTask` (ErrorTaskData) — объект с параметрами задачи (см. ниже).
|
|
123
161
|
|
|
124
162
|
- **Возвращает:** промис с объектом:
|
|
125
163
|
```js
|
|
126
164
|
{
|
|
127
165
|
error: false,
|
|
128
166
|
message: "Задача создана в Битрикс24.",
|
|
129
|
-
|
|
167
|
+
data: { /* API response */ }
|
|
130
168
|
}
|
|
131
169
|
```
|
|
132
170
|
или при превышении лимита:
|
|
@@ -143,167 +181,177 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
|
|
|
143
181
|
message: "Не удалось создать задачу в Битрикс24: <текст ошибки>"
|
|
144
182
|
}
|
|
145
183
|
```
|
|
184
|
+
или если `$b24` не инициализирован:
|
|
185
|
+
```js
|
|
186
|
+
{
|
|
187
|
+
error: true,
|
|
188
|
+
message: "$b24 не инициализирован"
|
|
189
|
+
}
|
|
190
|
+
```
|
|
146
191
|
|
|
147
|
-
**Параметры `dataTask
|
|
148
|
-
|
|
149
|
-
| Параметр | Тип
|
|
150
|
-
| ---------------- |
|
|
151
|
-
| `title` | string
|
|
152
|
-
| `description` | string
|
|
153
|
-
| `createdBy` | number
|
|
154
|
-
| `responsibleId` | number
|
|
155
|
-
| `deadline` | ISO string
|
|
156
|
-
| `groupId` | number\|null
|
|
157
|
-
| `accomplices` |
|
|
158
|
-
| `maxTasks` | number
|
|
159
|
-
| `
|
|
192
|
+
**Параметры `dataTask` (ErrorTaskData):**
|
|
193
|
+
|
|
194
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
195
|
+
| ---------------- | ---------------- | ------------------------- | ---------------------------------------------- |
|
|
196
|
+
| `title` | string | **обязательно** | Заголовок задачи |
|
|
197
|
+
| `description` | string | `""` | Описание задачи |
|
|
198
|
+
| `createdBy` | number | `138` | ID создателя |
|
|
199
|
+
| `responsibleId` | number | `1` | ID ответственного |
|
|
200
|
+
| `deadline` | ISO string | `DateTime.now() + 1 день` | Дедлайн в ISO формате |
|
|
201
|
+
| `groupId` | number\|null | `null` | ID группы (опционально) |
|
|
202
|
+
| `accomplices` | number[] | `[]` | Массив ID соисполнителей |
|
|
203
|
+
| `maxTasks` | number | `100` | Максимум существующих задач с таким названием |
|
|
204
|
+
| `ufCrmTask` | string\|string[] | `""` | Значение для `UF_CRM_TASK` (массив или строка) |
|
|
205
|
+
| `entityTypeAbbr` | string | `""` | ~~Устаревший~~ Используйте `ufCrmTask` |
|
|
160
206
|
|
|
161
207
|
```js
|
|
162
|
-
await
|
|
208
|
+
await errorB24({
|
|
163
209
|
title: "Ошибка синхронизации",
|
|
164
210
|
description: "Не удалось подключиться к API",
|
|
165
211
|
responsibleId: 42,
|
|
166
212
|
deadline: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString(),
|
|
167
213
|
maxTasks: 50,
|
|
214
|
+
ufCrmTask: ["D_5", "C_10"],
|
|
168
215
|
});
|
|
169
216
|
```
|
|
170
217
|
|
|
218
|
+
- **`checkB24Scope()`** — проверяет и логирует права (скоупы) приложения Bitrix24. Вызывается автоматически при старте, если `$b24` инициализирован.
|
|
219
|
+
|
|
171
220
|
### События
|
|
172
221
|
|
|
173
|
-
- **`
|
|
222
|
+
- **`event`** — готовый экземпляр класса `Event` (или `null`, если `$b24` не инициализирован). Создаётся автоматически при импорте.
|
|
223
|
+
|
|
224
|
+
```js
|
|
225
|
+
import { event } from "@andrey4emk/npm-app-back-b24";
|
|
226
|
+
|
|
227
|
+
if (event) {
|
|
228
|
+
const result = await event.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
- **`Event`** — класс для работы с офлайн-событиями Bitrix24. Можно создать свой экземпляр, передав `B24OAuth`.
|
|
174
233
|
|
|
175
234
|
```js
|
|
176
235
|
import { Event } from "@andrey4emk/npm-app-back-b24";
|
|
177
236
|
|
|
178
|
-
const
|
|
237
|
+
const myEvent = new Event(b24Instance);
|
|
179
238
|
```
|
|
180
239
|
|
|
181
240
|
**Методы:**
|
|
182
241
|
|
|
183
|
-
- **`get(eventName)`** — получить
|
|
242
|
+
- **`get(eventName)`** — получить офлайн-события по названию.
|
|
184
243
|
|
|
185
244
|
- **Параметры:**
|
|
186
245
|
|
|
187
|
-
- `eventName` (string) — название события (например, `'ONCRMDYNAMICITEMUPDATE_149'`).
|
|
246
|
+
- `eventName` (string) — название события (например, `'ONCRMDYNAMICITEMUPDATE_149'` или `'ONIMCONNECTORMESSAGEADD'`).
|
|
247
|
+
|
|
248
|
+
- **Возвращает:** промис с объектом `{ error, message, data }`.
|
|
188
249
|
|
|
189
|
-
|
|
250
|
+
Для событий сущностей (сделки, смарт-процессы):
|
|
190
251
|
|
|
191
252
|
```js
|
|
192
253
|
{
|
|
193
254
|
error: false,
|
|
194
|
-
|
|
255
|
+
message: "События получены",
|
|
256
|
+
data: {
|
|
195
257
|
processId: "12345",
|
|
196
|
-
entitysId: [101, 102, 103],
|
|
258
|
+
entitysId: ["101", "102", "103"],
|
|
197
259
|
arrMessageIdAndEntityId: [
|
|
198
|
-
{ messageId: "msg_1", entityId: 101 },
|
|
199
|
-
{ messageId: "msg_2", entityId: 102 }
|
|
200
|
-
{ messageId: "msg_3", entityId: 103 }
|
|
260
|
+
{ messageId: "msg_1", entityId: "101" },
|
|
261
|
+
{ messageId: "msg_2", entityId: "102" }
|
|
201
262
|
]
|
|
202
263
|
}
|
|
203
264
|
}
|
|
204
265
|
```
|
|
205
266
|
|
|
206
|
-
|
|
267
|
+
Для событий коннектора (`ONIMCONNECTORMESSAGEADD`):
|
|
207
268
|
|
|
208
269
|
```js
|
|
209
270
|
{
|
|
210
|
-
error:
|
|
211
|
-
|
|
212
|
-
|
|
271
|
+
error: false,
|
|
272
|
+
message: "События коннектора получены",
|
|
273
|
+
data: {
|
|
274
|
+
processId: "12345",
|
|
275
|
+
message: [
|
|
276
|
+
{
|
|
277
|
+
connectorId: "...",
|
|
278
|
+
lineId: "...",
|
|
279
|
+
chatId: "...",
|
|
280
|
+
text: "Текст сообщения",
|
|
281
|
+
file: null,
|
|
282
|
+
attachments: null,
|
|
283
|
+
im: null
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
}
|
|
213
287
|
}
|
|
214
288
|
```
|
|
215
289
|
|
|
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
290
|
или при ошибке:
|
|
291
|
+
|
|
243
292
|
```js
|
|
244
293
|
{
|
|
245
294
|
error: true,
|
|
246
|
-
|
|
247
|
-
|
|
295
|
+
message: "Не удалось получить события. <текст ошибки>",
|
|
296
|
+
data: null
|
|
248
297
|
}
|
|
249
298
|
```
|
|
250
299
|
|
|
300
|
+
- **Особенности:**
|
|
301
|
+
- Автоматически фильтрует и удаляет события от системного пользователя (`user_id: '138'`).
|
|
302
|
+
- Для коннекторных событий конвертирует файлы в формат с типами `image`, `video`, `document`.
|
|
303
|
+
- Если событий нет, возвращает `data` с пустыми массивами.
|
|
304
|
+
|
|
251
305
|
```js
|
|
252
|
-
const {
|
|
253
|
-
if (
|
|
254
|
-
|
|
255
|
-
await eventHandler.clear(events.processId, messageIds);
|
|
306
|
+
const { error, data } = await event.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
307
|
+
if (!error && data.entitysId.length > 0) {
|
|
308
|
+
console.log("Обработанные ID сущностей:", data.entitysId);
|
|
256
309
|
}
|
|
257
310
|
```
|
|
258
311
|
|
|
259
|
-
- **`
|
|
312
|
+
- **`clear(processId, messageId?)`** — очистить обработанные офлайн-события в Bitrix24.
|
|
260
313
|
|
|
261
314
|
- **Параметры:**
|
|
262
315
|
|
|
263
|
-
- `
|
|
264
|
-
- `
|
|
316
|
+
- `processId` (string) — ID процесса (получен из `get()`).
|
|
317
|
+
- `messageId` (string|string[]) — опциональный ID или массив ID сообщений для очистки.
|
|
265
318
|
|
|
266
|
-
- **Возвращает:**
|
|
319
|
+
- **Возвращает:** промис с объектом `{ error, message, data }`.
|
|
267
320
|
|
|
268
321
|
```js
|
|
269
|
-
const {
|
|
270
|
-
|
|
271
|
-
|
|
322
|
+
const { data } = await event.get("ONCRMDYNAMICITEMUPDATE_149");
|
|
323
|
+
if (data.processId) {
|
|
324
|
+
const messageIds = data.arrMessageIdAndEntityId.map((item) => item.messageId);
|
|
325
|
+
await event.clear(data.processId, messageIds);
|
|
326
|
+
}
|
|
272
327
|
```
|
|
273
328
|
|
|
274
329
|
### ChatApp
|
|
275
330
|
|
|
276
|
-
- **`
|
|
331
|
+
- **`ChatApp`** — класс для работы с мессенджерами через платформу ChatApp Online. Экземпляр нужно создать самостоятельно.
|
|
277
332
|
|
|
278
333
|
```js
|
|
279
|
-
import {
|
|
334
|
+
import { ChatApp } from "@andrey4emk/npm-app-back-b24";
|
|
335
|
+
|
|
336
|
+
const chatApp = new ChatApp(
|
|
337
|
+
// makeParam — данные для создания токена
|
|
338
|
+
{ email: "your-email", pass: "your-password", appId: "your-app-id" },
|
|
339
|
+
// authParam — текущие токены (можно пустой объект, заполнится после makeTokenChatApp)
|
|
340
|
+
{ accessToken: "", accessTokenEndTime: "", refreshToken: "", refreshTokenEndTime: "" },
|
|
341
|
+
// typeParam — конфигурация мессенджеров и лицензий
|
|
342
|
+
{
|
|
343
|
+
whatsApp: { licenseId: "12345", messenger: [{ type: "grWhatsApp" }] },
|
|
344
|
+
telegram: { licenseId: "67890", messenger: [{ type: "telegram" }] },
|
|
345
|
+
}
|
|
346
|
+
);
|
|
280
347
|
```
|
|
281
348
|
|
|
282
349
|
**Методы:**
|
|
283
350
|
|
|
284
351
|
- **`makeTokenChatApp()`** — получить токены доступа для ChatApp API.
|
|
285
352
|
|
|
286
|
-
- **Возвращает:** промис с
|
|
287
|
-
|
|
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`.
|
|
353
|
+
- **Возвращает:** промис с объектом `{ error }` или `{ error, message, data }` при ошибке.
|
|
354
|
+
- **Особенности:** Сохраняет полученные токены в свойствах экземпляра.
|
|
307
355
|
|
|
308
356
|
```js
|
|
309
357
|
const result = await chatApp.makeTokenChatApp();
|
|
@@ -314,183 +362,204 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
|
|
|
314
362
|
|
|
315
363
|
- **`refreshTokenChatApp()`** — обновить токены доступа.
|
|
316
364
|
|
|
317
|
-
- **Возвращает:** промис с
|
|
365
|
+
- **Возвращает:** промис с объектом `{ error }` или `{ error, message, data }` при ошибке.
|
|
366
|
+
- **Алгоритм:** Пытается обновить токены через API. Если не удалось — автоматически вызывает `makeTokenChatApp()`.
|
|
318
367
|
|
|
319
|
-
|
|
320
|
-
{
|
|
321
|
-
error: false;
|
|
322
|
-
}
|
|
323
|
-
```
|
|
368
|
+
- **`checkTokenChatApp()`** — проверить валидность текущего токена.
|
|
324
369
|
|
|
325
|
-
|
|
370
|
+
- **Возвращает:** промис с объектом `{ error, message }`.
|
|
371
|
+
- **Особенности:** Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
|
|
326
372
|
|
|
327
|
-
|
|
328
|
-
{
|
|
329
|
-
error: true,
|
|
330
|
-
message: "Не удалось обновить токен ChatApp",
|
|
331
|
-
data: { /* API response */ }
|
|
332
|
-
}
|
|
333
|
-
```
|
|
373
|
+
- **`getLicensesChatApp()`** — получить список лицензий для текущего аккаунта.
|
|
334
374
|
|
|
335
|
-
-
|
|
336
|
-
1. Пытается обновить токены через API.
|
|
337
|
-
2. Если обновление не удалось, автоматически получает новые токены через `makeTokenChatApp()`.
|
|
375
|
+
- **Возвращает:** промис с объектом `{ error, message, data }`, где `data` — массив лицензий.
|
|
338
376
|
|
|
339
377
|
```js
|
|
340
|
-
const result = await chatApp.
|
|
378
|
+
const result = await chatApp.getLicensesChatApp();
|
|
341
379
|
if (!result.error) {
|
|
342
|
-
console.log("
|
|
380
|
+
console.log("Доступные лицензии:", result.data);
|
|
343
381
|
}
|
|
344
382
|
```
|
|
345
383
|
|
|
346
|
-
- **`
|
|
384
|
+
- **`sendMessageChatApp(messengerType, messageData)`** — отправить текстовое сообщение.
|
|
347
385
|
|
|
348
|
-
-
|
|
386
|
+
- **Параметры:**
|
|
387
|
+
- `messengerType` (string) — `"whatsApp"` или `"telegram"`.
|
|
388
|
+
- `messageData` (object) — `{ phone: string, message: string }`.
|
|
389
|
+
- **Возвращает:** промис с объектом `{ error, message, data, auth }`. Если в процессе обновился токен, `auth` содержит новые данные авторизации.
|
|
349
390
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
391
|
+
```js
|
|
392
|
+
const result = await chatApp.sendMessageChatApp("whatsApp", {
|
|
393
|
+
phone: "+1234567890",
|
|
394
|
+
message: "Это тестовое сообщение",
|
|
395
|
+
});
|
|
396
|
+
```
|
|
356
397
|
|
|
357
|
-
|
|
398
|
+
- **`sendFileChatApp(messengerType, messageData)`** — отправить файл.
|
|
358
399
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
message: "<текст ошибки>",
|
|
363
|
-
data: null
|
|
364
|
-
}
|
|
365
|
-
```
|
|
400
|
+
- **Параметры:**
|
|
401
|
+
- `messengerType` (string) — `"whatsApp"` или `"telegram"`.
|
|
402
|
+
- `messageData` (object) — `{ phone, message, fileUrl, fileName }`.
|
|
366
403
|
|
|
367
|
-
|
|
368
|
-
- Если токен невалидный, автоматически вызывает `refreshTokenChatApp()`.
|
|
404
|
+
- **`phoneCheckChatApp(messengerType, phone)`** — проверить, существует ли номер в мессенджере.
|
|
369
405
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
406
|
+
- **Параметры:**
|
|
407
|
+
- `messengerType` (string) — `"whatsApp"` или `"telegram"`.
|
|
408
|
+
- `phone` (string) — номер телефона.
|
|
409
|
+
- **Возвращает:** промис с объектом `{ error, message, data }`, где `data.check` — результат проверки.
|
|
374
410
|
|
|
375
|
-
|
|
411
|
+
### Smsgold
|
|
376
412
|
|
|
377
|
-
|
|
413
|
+
- **`Smsgold`** — класс для отправки SMS через сервис SMSGold. Экземпляр нужно создать самостоятельно.
|
|
378
414
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
error: false,
|
|
382
|
-
message: "Лицензии успешно получены",
|
|
383
|
-
data: [ /* массив лицензий */ ]
|
|
384
|
-
}
|
|
385
|
-
```
|
|
415
|
+
```js
|
|
416
|
+
import { Smsgold } from "@andrey4emk/npm-app-back-b24";
|
|
386
417
|
|
|
387
|
-
|
|
418
|
+
const smsClient = new Smsgold(
|
|
419
|
+
{ user: "smsgold_login", pass: "smsgold_password" },
|
|
420
|
+
b24Instance // опционально — экземпляр B24OAuth для загрузки файлов на диск
|
|
421
|
+
);
|
|
422
|
+
```
|
|
388
423
|
|
|
389
|
-
|
|
390
|
-
{
|
|
391
|
-
error: true,
|
|
392
|
-
message: "Не удалось получить лицензии ChatApp",
|
|
393
|
-
data: null
|
|
394
|
-
}
|
|
395
|
-
```
|
|
424
|
+
**Методы:**
|
|
396
425
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
```
|
|
426
|
+
- **`sendSms(messageData)`** — отправить SMS.
|
|
427
|
+
|
|
428
|
+
- **Параметры:**
|
|
429
|
+
- `messageData` (object):
|
|
430
|
+
- `phone` (string) — номер телефона.
|
|
431
|
+
- `message` (string) — текст сообщения.
|
|
432
|
+
- `fileUrl` (string) — опционально, ссылка на файл (будет загружен на диск Bitrix24 и публичная ссылка добавлена в SMS).
|
|
433
|
+
- `fileName` (string) — опционально, имя файла.
|
|
434
|
+
- **Возвращает:** промис с объектом `{ error, message, result }`.
|
|
407
435
|
|
|
408
436
|
```js
|
|
409
|
-
const result = await
|
|
437
|
+
const result = await smsClient.sendSms({
|
|
438
|
+
phone: "+79990000000",
|
|
439
|
+
message: "Готово!",
|
|
440
|
+
});
|
|
410
441
|
if (!result.error) {
|
|
411
|
-
console.log(
|
|
442
|
+
console.log(result.message);
|
|
412
443
|
}
|
|
413
444
|
```
|
|
414
445
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
- **Параметры:**
|
|
446
|
+
### Email
|
|
418
447
|
|
|
419
|
-
|
|
420
|
-
- `messageData` (object) — объект с данными сообщения:
|
|
421
|
-
- `phone` (string) — номер телефона или ID чата получателя.
|
|
422
|
-
- `message` (string) — текст сообщения.
|
|
448
|
+
- **`Email`** — класс для отправки email через SMTP Яндекса. Экземпляр нужно создать самостоятельно.
|
|
423
449
|
|
|
424
|
-
|
|
450
|
+
```js
|
|
451
|
+
import { Email } from "@andrey4emk/npm-app-back-b24";
|
|
425
452
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
}
|
|
432
|
-
```
|
|
453
|
+
const emailClient = new Email({
|
|
454
|
+
user: "your-email@yandex.ru",
|
|
455
|
+
pass: "your-app-password",
|
|
456
|
+
});
|
|
457
|
+
```
|
|
433
458
|
|
|
434
|
-
|
|
459
|
+
**Методы:**
|
|
435
460
|
|
|
436
|
-
|
|
437
|
-
{
|
|
438
|
-
error: true,
|
|
439
|
-
message: "Ошибка при отправке сообщения в ChatApp через whatsApp",
|
|
440
|
-
data: null
|
|
441
|
-
}
|
|
442
|
-
```
|
|
461
|
+
- **`send(dataMail)`** — отправить письмо.
|
|
443
462
|
|
|
444
|
-
-
|
|
445
|
-
-
|
|
446
|
-
|
|
447
|
-
|
|
463
|
+
- **Параметры:**
|
|
464
|
+
- `dataMail` (object):
|
|
465
|
+
- `to` (string) — адрес получателя.
|
|
466
|
+
- `subject` (string) — тема письма.
|
|
467
|
+
- `text` (string) — текстовая версия.
|
|
468
|
+
- `html` (string) — опционально, HTML-версия.
|
|
469
|
+
- `fileUrl` (string) — опционально, ссылка на файл (будет скачан и прикреплён).
|
|
470
|
+
- `fileName` (string) — опционально, имя файла для вложения.
|
|
471
|
+
- **Возвращает:** промис с объектом `{ error, info }` при успехе или `{ error, message }` при ошибке.
|
|
448
472
|
|
|
449
473
|
```js
|
|
450
|
-
const result = await
|
|
451
|
-
|
|
452
|
-
|
|
474
|
+
const result = await emailClient.send({
|
|
475
|
+
to: "recipient@example.com",
|
|
476
|
+
subject: "Тема письма",
|
|
477
|
+
text: "Текст письма",
|
|
478
|
+
html: "<b>HTML текст</b>",
|
|
453
479
|
});
|
|
454
|
-
|
|
455
|
-
if (!result.error) {
|
|
456
|
-
console.log(result.message);
|
|
457
|
-
} else {
|
|
458
|
-
console.error(result.message);
|
|
459
|
-
}
|
|
460
480
|
```
|
|
461
481
|
|
|
462
|
-
|
|
482
|
+
- **Особенности:**
|
|
483
|
+
- SMTP-сервер: `smtp.yandex.ru:465` (SMTPS).
|
|
484
|
+
- Копия письма автоматически отправляется на адрес отправителя.
|
|
485
|
+
|
|
486
|
+
### Wappi
|
|
487
|
+
|
|
488
|
+
- **`Wappi`** — класс для отправки сообщений через Wappi API (WhatsApp, Telegram, Max). Экземпляр нужно создать самостоятельно.
|
|
489
|
+
|
|
490
|
+
```js
|
|
491
|
+
import { Wappi } from "@andrey4emk/npm-app-back-b24";
|
|
492
|
+
|
|
493
|
+
const wappi = new Wappi(
|
|
494
|
+
{ token: "max-token", profile_id: "max-profile" },
|
|
495
|
+
{ token: "telegram-token", profile_id: "telegram-profile" },
|
|
496
|
+
{ token: "whatsapp-token", profile_id: "whatsapp-profile" }
|
|
497
|
+
);
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
**Методы:**
|
|
501
|
+
|
|
502
|
+
- **`sendMessageWappi(messengerType, messageData)`** — отправить текстовое сообщение.
|
|
503
|
+
|
|
504
|
+
- **Параметры:**
|
|
505
|
+
- `messengerType` (string) — `"whatsApp"`, `"telegram"` или `"max"`.
|
|
506
|
+
- `messageData` (object):
|
|
507
|
+
- `phone` (string) — номер телефона.
|
|
508
|
+
- `message` (string) — текст сообщения.
|
|
509
|
+
- `sendOpenLine` (boolean) — опционально, отображать ли в открытой линии Битрикс24 (по умолчанию `true`).
|
|
510
|
+
- **Возвращает:** промис с объектом `{ error, message, data }`.
|
|
463
511
|
|
|
464
512
|
```js
|
|
465
|
-
const result = await
|
|
466
|
-
phone: "
|
|
467
|
-
message: "Привет из
|
|
513
|
+
const result = await wappi.sendMessageWappi("whatsApp", {
|
|
514
|
+
phone: "+1234567890",
|
|
515
|
+
message: "Привет из Wappi!",
|
|
468
516
|
});
|
|
469
517
|
```
|
|
470
518
|
|
|
471
|
-
|
|
519
|
+
- **`sendFileWappi(messengerType, messageData)`** — отправить файл.
|
|
520
|
+
|
|
521
|
+
- **Параметры:**
|
|
522
|
+
- `messengerType` (string) — `"whatsApp"`, `"telegram"` или `"max"`.
|
|
523
|
+
- `messageData` (object):
|
|
524
|
+
- `phone` (string) — номер телефона.
|
|
525
|
+
- `message` (string) — подпись к файлу.
|
|
526
|
+
- `fileUrl` (string) — ссылка на файл.
|
|
527
|
+
- `fileName` (string) — имя файла.
|
|
528
|
+
- `sendOpenLine` (boolean) — опционально.
|
|
529
|
+
- **Особенности:** Для WhatsApp и Telegram файл конвертируется в base64. Для Max отправляется по URL.
|
|
472
530
|
|
|
473
|
-
- **`
|
|
531
|
+
- **`phoneCheckWappi(messengerType, phone)`** — проверить, существует ли номер в мессенджере.
|
|
532
|
+
|
|
533
|
+
- **Параметры:**
|
|
534
|
+
- `messengerType` (string) — `"whatsApp"`, `"telegram"` или `"max"`.
|
|
535
|
+
- `phone` (string) — номер телефона.
|
|
536
|
+
- **Возвращает:** промис с объектом `{ error, message, data }`, где `data.check` — `true`/`false`.
|
|
537
|
+
- **Особенности:** Для Telegram сначала проверяет контакт, при отсутствии — пытается создать.
|
|
538
|
+
|
|
539
|
+
### Логирование
|
|
540
|
+
|
|
541
|
+
- **`logs`** — экземпляр класса `LogsAPI` для цветного логирования в консоль.
|
|
474
542
|
|
|
475
543
|
```js
|
|
476
|
-
import {
|
|
544
|
+
import { logs } from "@andrey4emk/npm-app-back-b24";
|
|
477
545
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
}
|
|
546
|
+
logs.add("Информационное сообщение", "info");
|
|
547
|
+
logs.add("Отладочное сообщение", "debug");
|
|
548
|
+
logs.add("Ошибка!", "error");
|
|
549
|
+
logs.add({ key: "value" }); // объект будет JSON.stringify
|
|
550
|
+
logs.add("С доп. данными", "info", { detail: 123 }); // jsonData выведется через console.dir
|
|
484
551
|
```
|
|
485
552
|
|
|
486
|
-
|
|
553
|
+
**Уровни логирования:**
|
|
487
554
|
|
|
488
|
-
|
|
|
489
|
-
|
|
|
490
|
-
| `
|
|
491
|
-
| `
|
|
555
|
+
| Уровень | Цвет | По умолчанию |
|
|
556
|
+
| ------- | ------- | ------------ |
|
|
557
|
+
| `debug` | Серый | Выключен |
|
|
558
|
+
| `info` | Зелёный | Включён |
|
|
559
|
+
| `error` | Красный | Включён |
|
|
492
560
|
|
|
493
|
-
|
|
561
|
+
- Конфигурация хранится в файле `log.json` (через `conf`).
|
|
562
|
+
- Каждый уровень можно включить/выключить, изменить цвет.
|
|
494
563
|
|
|
495
564
|
## Переменные окружения
|
|
496
565
|
|
|
@@ -503,6 +572,7 @@ await smsgold.sendSms("+1234567890", "Привет из SMSGold!");
|
|
|
503
572
|
| `APP_B24_CLIENT_SECRET_DEV` | Client Secret для DEV окружения |
|
|
504
573
|
| `APP_ENV` | Определяет окружение (`DEV` или production) |
|
|
505
574
|
| `APP_NAME` | Название приложения (используется в описании задач) |
|
|
575
|
+
| `CONFIG_DIR` | Путь к директории с конфигами (по умолчанию `../config`) |
|
|
506
576
|
| `CHATAPP_EMAIL` | Email аккаунта ChatApp |
|
|
507
577
|
| `CHATAPP_PASS` | Пароль аккаунта ChatApp |
|
|
508
578
|
| `CHATAPP_APP_ID` | ID приложения в ChatApp |
|
|
@@ -517,6 +587,7 @@ APP_B24_CLIENT_SECRET_DEV=yyy
|
|
|
517
587
|
APP_B24_CLIENT_ID=aaa
|
|
518
588
|
APP_B24_CLIENT_SECRET=bbb
|
|
519
589
|
APP_NAME=MyApp
|
|
590
|
+
CONFIG_DIR=../config
|
|
520
591
|
|
|
521
592
|
CHATAPP_EMAIL=your-email@example.com
|
|
522
593
|
CHATAPP_PASS=your-password
|
package/bitrix24/errTaskB24.ts
CHANGED
|
@@ -17,6 +17,9 @@ export interface ErrorTaskData {
|
|
|
17
17
|
groupId?: number | null;
|
|
18
18
|
accomplices?: number[];
|
|
19
19
|
maxTasks?: number;
|
|
20
|
+
/** Значение для UF_CRM_TASK (массив или строка). Приоритетнее entityTypeAbbr */
|
|
21
|
+
ufCrmTask?: string[] | string;
|
|
22
|
+
/** @deprecated Используйте ufCrmTask. Код CRM сущности для UF_CRM_TASK */
|
|
20
23
|
entityTypeAbbr?: string;
|
|
21
24
|
}
|
|
22
25
|
|
|
@@ -90,7 +93,7 @@ export async function errorB24(dataTask: ErrorTaskData): Promise<ErrorB24Result>
|
|
|
90
93
|
const groupId = dataTask.groupId || null;
|
|
91
94
|
const accomplices = dataTask.accomplices || [];
|
|
92
95
|
const maxTasks = dataTask.maxTasks || 100;
|
|
93
|
-
const
|
|
96
|
+
const ufCrmTask = dataTask.ufCrmTask ?? dataTask.entityTypeAbbr ?? "";
|
|
94
97
|
|
|
95
98
|
// Проверяем сколько создано таких задач
|
|
96
99
|
const response = await $b24.callMethod("tasks.task.list", {
|
|
@@ -119,7 +122,7 @@ export async function errorB24(dataTask: ErrorTaskData): Promise<ErrorB24Result>
|
|
|
119
122
|
CREATED_BY: createdBy,
|
|
120
123
|
RESPONSIBLE_ID: responsibleId,
|
|
121
124
|
DEADLINE: deadline,
|
|
122
|
-
UF_CRM_TASK:
|
|
125
|
+
UF_CRM_TASK: ufCrmTask,
|
|
123
126
|
GROUP_ID: groupId,
|
|
124
127
|
ACCOMPLICES: accomplices,
|
|
125
128
|
},
|