@andrey4emk/npm-app-back-b24 0.9.8 → 1.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 +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 +227 -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
|
@@ -1,54 +1,41 @@
|
|
|
1
1
|
export class ChatApp {
|
|
2
2
|
/**
|
|
3
|
-
* @param
|
|
4
|
-
* @param
|
|
5
|
-
* @param
|
|
6
|
-
* @param {string} makeParam.appId - appId для создания токена
|
|
7
|
-
*
|
|
8
|
-
* @param {Object} authParam - объект с параметрами авторизации
|
|
9
|
-
* @param {string} authParam.accessToken - accessToken для авторизации
|
|
10
|
-
* @param {string} authParam.accessTokenEndTime - время окончания действия accessToken
|
|
11
|
-
* @param {string} authParam.refreshToken - refreshToken для обновления accessToken
|
|
12
|
-
* @param {string} authParam.refreshTokenEndTime - время окончания действия refreshToken
|
|
13
|
-
*
|
|
14
|
-
* @param {Object} typeParam - объект с типами мессенджеров и их параметрами
|
|
15
|
-
* @param {Object} typeParam.whatsApp - параметры для WhatsApp
|
|
16
|
-
* @param {string} typeParam.whatsApp.licenseId - ID лицензии для WhatsApp
|
|
17
|
-
* @param {Array} typeParam.whatsApp.messenger - массив с типами мессенджеров для WhatsApp
|
|
18
|
-
*
|
|
19
|
-
* @param {Object} typeParam.telegram - параметры для Telegram
|
|
20
|
-
* @param {string} typeParam.telegram.licenseId - ID лицензии для Telegram
|
|
21
|
-
* @param {Array} typeParam.telegram.messenger - массив с типами мессенджеров для Telegram
|
|
3
|
+
* @param makeParam - объект с параметрами для создания токена
|
|
4
|
+
* @param authParam - объект с параметрами авторизации
|
|
5
|
+
* @param typeParam - объект с типами мессенджеров и их параметрами
|
|
22
6
|
*/
|
|
7
|
+
make;
|
|
8
|
+
auth;
|
|
9
|
+
type;
|
|
10
|
+
updateToken;
|
|
23
11
|
constructor(makeParam, authParam, typeParam) {
|
|
24
12
|
this.make = makeParam;
|
|
25
13
|
this.auth = authParam;
|
|
26
14
|
this.type = typeParam;
|
|
27
15
|
this.updateToken = false;
|
|
28
16
|
}
|
|
29
|
-
|
|
30
17
|
async sendMessageChatApp(messangerType, messageData) {
|
|
31
|
-
// Проверяем что верно указан
|
|
32
|
-
if (!["whatsApp"
|
|
33
|
-
return { error: true, message: "Неверный тип мессенджера", data:
|
|
18
|
+
// Проверяем что верно указан messangerType и в messageData есть phone и message
|
|
19
|
+
if (!["whatsApp", "telegram"].includes(messangerType)) {
|
|
20
|
+
return { error: true, message: "Неверный тип мессенджера", data: undefined };
|
|
34
21
|
}
|
|
35
22
|
if (!messageData.phone || !messageData.message) {
|
|
36
|
-
return { error: true, message: "Отсутствует phone или message", data:
|
|
23
|
+
return { error: true, message: "Отсутствует phone или message", data: undefined };
|
|
37
24
|
}
|
|
38
|
-
|
|
25
|
+
const check = await this.checkTokenChatApp();
|
|
39
26
|
if (check.error) {
|
|
40
|
-
return { error: true, message: `Ошибка с токеном ChatApp в функции sendMessageChatApp класса ChatApp\n${check.message}`, data:
|
|
27
|
+
return { error: true, message: `Ошибка с токеном ChatApp в функции sendMessageChatApp класса ChatApp\n${check.message}`, data: undefined };
|
|
41
28
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
let url;
|
|
29
|
+
const phone = messageData.phone;
|
|
30
|
+
const message = messageData.message;
|
|
31
|
+
let url = "";
|
|
45
32
|
if (messangerType === "whatsApp") {
|
|
46
33
|
url = `https://api.chatapp.online/v1/licenses/${this.type.whatsApp.licenseId}/messengers/${this.type.whatsApp.messenger[0].type}/chats/${phone}/messages/text`;
|
|
47
34
|
}
|
|
48
35
|
if (messangerType === "telegram") {
|
|
49
36
|
url = `https://api.chatapp.online/v1/licenses/${this.type.telegram.licenseId}/messengers/${this.type.telegram.messenger[0].type}/chats/${phone}/messages/text`;
|
|
50
37
|
}
|
|
51
|
-
|
|
38
|
+
const res = await fetch(url, {
|
|
52
39
|
method: "POST",
|
|
53
40
|
headers: {
|
|
54
41
|
Lang: "en",
|
|
@@ -60,11 +47,11 @@ export class ChatApp {
|
|
|
60
47
|
text: message,
|
|
61
48
|
}),
|
|
62
49
|
});
|
|
63
|
-
|
|
64
|
-
|
|
50
|
+
const data = (await res.json());
|
|
65
51
|
if (!data.success) {
|
|
66
52
|
return { error: true, message: `Ошибка при отправке сообщения в ChatApp через ${messangerType}`, data: data };
|
|
67
|
-
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
68
55
|
// Если в процессе запроса обновили токен, то возвращаем информацию об этом.
|
|
69
56
|
let newAuth = null;
|
|
70
57
|
if (this.updateToken) {
|
|
@@ -75,32 +62,30 @@ export class ChatApp {
|
|
|
75
62
|
return { error: false, message: `Сообщение успешно отправлено в ChatApp через ${messangerType}`, data: data, auth: newAuth };
|
|
76
63
|
}
|
|
77
64
|
}
|
|
78
|
-
|
|
79
65
|
async sendFileChatApp(messangerType, messageData) {
|
|
80
|
-
// Проверяем что верно указан
|
|
81
|
-
if (!["whatsApp"
|
|
82
|
-
return { error: true, message: "Неверный тип мессенджера", data:
|
|
66
|
+
// Проверяем что верно указан messangerType и в messageData есть phone и message
|
|
67
|
+
if (!["whatsApp", "telegram"].includes(messangerType)) {
|
|
68
|
+
return { error: true, message: "Неверный тип мессенджера", data: undefined };
|
|
83
69
|
}
|
|
84
70
|
if (!messageData.phone || !messageData.message) {
|
|
85
|
-
return { error: true, message: "Отсутствует phone или message", data:
|
|
71
|
+
return { error: true, message: "Отсутствует phone или message", data: undefined };
|
|
86
72
|
}
|
|
87
|
-
|
|
73
|
+
const check = await this.checkTokenChatApp();
|
|
88
74
|
if (check.error) {
|
|
89
|
-
return { error: true, message: `Ошибка с токеном ChatApp в функции sendMessageChatApp класса ChatApp\n${check.message}`, data:
|
|
75
|
+
return { error: true, message: `Ошибка с токеном ChatApp в функции sendMessageChatApp класса ChatApp\n${check.message}`, data: undefined };
|
|
90
76
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
let url;
|
|
77
|
+
const phone = messageData.phone;
|
|
78
|
+
const caption = messageData.message;
|
|
79
|
+
const file = messageData.fileUrl;
|
|
80
|
+
const fileName = messageData.fileName;
|
|
81
|
+
let url = "";
|
|
97
82
|
if (messangerType === "whatsApp") {
|
|
98
83
|
url = `https://api.chatapp.online/v1/licenses/${this.type.whatsApp.licenseId}/messengers/${this.type.whatsApp.messenger[0].type}/chats/${phone}/messages/file`;
|
|
99
84
|
}
|
|
100
85
|
if (messangerType === "telegram") {
|
|
101
86
|
url = `https://api.chatapp.online/v1/licenses/${this.type.telegram.licenseId}/messengers/${this.type.telegram.messenger[0].type}/chats/${phone}/messages/file`;
|
|
102
87
|
}
|
|
103
|
-
|
|
88
|
+
const res = await fetch(url, {
|
|
104
89
|
method: "POST",
|
|
105
90
|
headers: {
|
|
106
91
|
Lang: "en",
|
|
@@ -114,11 +99,11 @@ export class ChatApp {
|
|
|
114
99
|
caption: caption,
|
|
115
100
|
}),
|
|
116
101
|
});
|
|
117
|
-
|
|
118
|
-
|
|
102
|
+
const data = (await res.json());
|
|
119
103
|
if (!data.success) {
|
|
120
104
|
return { error: true, message: `Ошибка при отправке сообщения в ChatApp через ${messangerType}`, data: data };
|
|
121
|
-
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
122
107
|
// Если в процессе запроса обновили токен, то возвращаем информацию об этом.
|
|
123
108
|
let newAuth = null;
|
|
124
109
|
if (this.updateToken) {
|
|
@@ -129,23 +114,22 @@ export class ChatApp {
|
|
|
129
114
|
return { error: false, message: `Сообщение успешно отправлено в ChatApp через ${messangerType}`, data: data, auth: newAuth };
|
|
130
115
|
}
|
|
131
116
|
}
|
|
132
|
-
|
|
133
117
|
async phoneCheckChatApp(messangerType, phone) {
|
|
134
|
-
if (!["whatsApp"
|
|
135
|
-
return { error: true, message: "Неверный тип мессенджера", data:
|
|
118
|
+
if (!["whatsApp", "telegram"].includes(messangerType)) {
|
|
119
|
+
return { error: true, message: "Неверный тип мессенджера", data: undefined };
|
|
136
120
|
}
|
|
137
|
-
|
|
121
|
+
const check = await this.checkTokenChatApp();
|
|
138
122
|
if (check.error) {
|
|
139
|
-
return { error: true, message: `Ошибка с токеном ChatApp в функции phoneCheckChatApp класса ChatApp\n${check.message}`, data: check };
|
|
123
|
+
return { error: true, message: `Ошибка с токеном ChatApp в функции phoneCheckChatApp класса ChatApp\n${check.message}`, data: check.data };
|
|
140
124
|
}
|
|
141
|
-
let url;
|
|
125
|
+
let url = "";
|
|
142
126
|
if (messangerType === "whatsApp") {
|
|
143
127
|
url = `https://api.chatapp.online/v1/licenses/${this.type.whatsApp.licenseId}/messengers/${this.type.whatsApp.messenger[0].type}/phones/${phone}/check`;
|
|
144
128
|
}
|
|
145
129
|
if (messangerType === "telegram") {
|
|
146
130
|
url = `https://api.chatapp.online/v1/licenses/${this.type.telegram.licenseId}/messengers/${this.type.telegram.messenger[0].type}/phones/${phone}/check`;
|
|
147
131
|
}
|
|
148
|
-
|
|
132
|
+
const res = await fetch(url, {
|
|
149
133
|
method: "GET",
|
|
150
134
|
headers: {
|
|
151
135
|
Lang: "en",
|
|
@@ -153,10 +137,11 @@ export class ChatApp {
|
|
|
153
137
|
Authorization: this.auth.accessToken,
|
|
154
138
|
},
|
|
155
139
|
});
|
|
156
|
-
|
|
140
|
+
const data = (await res.json());
|
|
157
141
|
if (!data.success) {
|
|
158
142
|
return { error: true, message: `Ошибка при проверке телефона в ChatApp через ${messangerType}`, data: data };
|
|
159
|
-
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
160
145
|
// Если в процессе запроса обновили токен, то возвращаем информацию об этом.
|
|
161
146
|
let newAuth = null;
|
|
162
147
|
if (this.updateToken) {
|
|
@@ -164,11 +149,10 @@ export class ChatApp {
|
|
|
164
149
|
// Сбрасываем флаг обновления токена
|
|
165
150
|
this.updateToken = false;
|
|
166
151
|
}
|
|
167
|
-
data.check = data.data
|
|
152
|
+
data.check = data.data?.exist;
|
|
168
153
|
return { error: false, message: `Телефон успешно проверен в ChatApp через ${messangerType}`, data: data, auth: newAuth };
|
|
169
154
|
}
|
|
170
155
|
}
|
|
171
|
-
|
|
172
156
|
async checkTokenChatApp() {
|
|
173
157
|
try {
|
|
174
158
|
const response = await fetch("https://api.chatapp.online/v1/tokens/check", {
|
|
@@ -179,19 +163,20 @@ export class ChatApp {
|
|
|
179
163
|
Authorization: this.auth.accessToken,
|
|
180
164
|
},
|
|
181
165
|
});
|
|
182
|
-
|
|
183
|
-
const data = await response.json();
|
|
166
|
+
const data = (await response.json());
|
|
184
167
|
if (!data.success) {
|
|
185
168
|
await this.refreshTokenChatApp();
|
|
186
169
|
return { error: false, message: "Токен обновлен" };
|
|
187
|
-
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
188
172
|
return { error: false, message: "Токен действителен" };
|
|
189
173
|
}
|
|
190
|
-
}
|
|
191
|
-
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
const err = error;
|
|
177
|
+
return { error: true, message: err.message, data: undefined };
|
|
192
178
|
}
|
|
193
179
|
}
|
|
194
|
-
|
|
195
180
|
async makeTokenChatApp() {
|
|
196
181
|
console.warn("makeTokenChatApp called");
|
|
197
182
|
try {
|
|
@@ -208,23 +193,24 @@ export class ChatApp {
|
|
|
208
193
|
appId: this.make.appId,
|
|
209
194
|
}),
|
|
210
195
|
});
|
|
211
|
-
|
|
212
|
-
const data = await response.json();
|
|
196
|
+
const data = (await response.json());
|
|
213
197
|
if (!data.success) {
|
|
214
198
|
return { error: true, message: "Не удалось получить токен ChatApp", data: data };
|
|
215
|
-
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
216
201
|
this.auth.accessToken = data.data.accessToken;
|
|
217
202
|
this.auth.accessTokenEndTime = data.data.accessTokenEndTime;
|
|
218
203
|
this.auth.refreshToken = data.data.refreshToken;
|
|
219
204
|
this.auth.refreshTokenEndTime = data.data.refreshTokenEndTime;
|
|
220
205
|
this.updateToken = true;
|
|
221
|
-
return { error: false };
|
|
206
|
+
return { error: false, message: "Токен получен." };
|
|
222
207
|
}
|
|
223
|
-
}
|
|
224
|
-
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
const err = error;
|
|
211
|
+
return { error: true, message: err.message, data: undefined };
|
|
225
212
|
}
|
|
226
213
|
}
|
|
227
|
-
|
|
228
214
|
async refreshTokenChatApp() {
|
|
229
215
|
try {
|
|
230
216
|
const response = await fetch("https://api.chatapp.online/v1/tokens/refresh", {
|
|
@@ -238,28 +224,30 @@ export class ChatApp {
|
|
|
238
224
|
refreshToken: this.auth.refreshToken,
|
|
239
225
|
}),
|
|
240
226
|
});
|
|
241
|
-
const data = await response.json();
|
|
227
|
+
const data = (await response.json());
|
|
242
228
|
if (!data.success) {
|
|
243
|
-
|
|
244
|
-
|
|
229
|
+
const resMakeToken = await this.makeTokenChatApp();
|
|
245
230
|
if (resMakeToken.error) {
|
|
246
231
|
return { error: true, message: "Не удалось обновить токен ChatApp", data: data };
|
|
247
|
-
} else {
|
|
248
|
-
return { error: false };
|
|
249
232
|
}
|
|
250
|
-
|
|
233
|
+
else {
|
|
234
|
+
return { error: false, message: "Токен обновлен через makeToken." };
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
251
238
|
this.auth.accessToken = data.data.accessToken;
|
|
252
239
|
this.auth.accessTokenEndTime = data.data.accessTokenEndTime;
|
|
253
240
|
this.auth.refreshToken = data.data.refreshToken;
|
|
254
241
|
this.auth.refreshTokenEndTime = data.data.refreshTokenEndTime;
|
|
255
242
|
this.updateToken = true;
|
|
256
|
-
return { error: false };
|
|
243
|
+
return { error: false, message: "Токен обновлен." };
|
|
257
244
|
}
|
|
258
|
-
}
|
|
259
|
-
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
const err = error;
|
|
248
|
+
return { error: true, message: err.message, data: undefined };
|
|
260
249
|
}
|
|
261
250
|
}
|
|
262
|
-
|
|
263
251
|
async getLicensesChatApp() {
|
|
264
252
|
try {
|
|
265
253
|
const response = await fetch("https://api.chatapp.online/v1/licenses", {
|
|
@@ -270,15 +258,17 @@ export class ChatApp {
|
|
|
270
258
|
Authorization: this.auth.accessToken,
|
|
271
259
|
},
|
|
272
260
|
});
|
|
273
|
-
const data = await response.json();
|
|
274
|
-
|
|
261
|
+
const data = (await response.json());
|
|
275
262
|
if (!data.success) {
|
|
276
|
-
return { error: true, message: "Не удалось получить лицензии ChatApp", data:
|
|
277
|
-
}
|
|
263
|
+
return { error: true, message: "Не удалось получить лицензии ChatApp", data: undefined };
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
278
266
|
return { error: false, message: "Лицензии успешно получены", data: data.licenses };
|
|
279
267
|
}
|
|
280
|
-
}
|
|
281
|
-
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
const err = error;
|
|
271
|
+
return { error: true, message: err.message, data: undefined };
|
|
282
272
|
}
|
|
283
273
|
}
|
|
284
274
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EmailAuth, EmailData, ApiResult } from "../types/index.js";
|
|
2
|
+
import type SMTPTransport from "nodemailer/lib/smtp-transport/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param auth - объект с данными для авторизации в почте
|
|
5
|
+
* @param auth.user - пользователь (почта)
|
|
6
|
+
* @param auth.pass - пароль или app password
|
|
7
|
+
*/
|
|
8
|
+
export declare class Email {
|
|
9
|
+
private auth;
|
|
10
|
+
private transporter;
|
|
11
|
+
constructor(auth: EmailAuth);
|
|
12
|
+
/**
|
|
13
|
+
* Отправка email
|
|
14
|
+
* @param dataMail - данные письма
|
|
15
|
+
* @returns результат отправки
|
|
16
|
+
*/
|
|
17
|
+
send(dataMail: EmailData): Promise<ApiResult<SMTPTransport.SentMessageInfo>>;
|
|
18
|
+
downloadFileToUrl(fileUrl: string): Promise<ApiResult<Buffer>>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/sendMessage/email.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,aAAa,MAAM,wCAAwC,CAAC;AAExE;;;;GAIG;AACH,qBAAa,KAAK;IACd,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,WAAW,CAAoE;gBAE3E,IAAI,EAAE,SAAS;IAiB3B;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAkC5E,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;CAgBvE"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import nodemailer from "nodemailer";
|
|
2
|
-
|
|
3
2
|
/**
|
|
4
3
|
* @param auth - объект с данными для авторизации в почте
|
|
5
4
|
* @param auth.user - пользователь (почта)
|
|
6
5
|
* @param auth.pass - пароль или app password
|
|
7
6
|
*/
|
|
8
7
|
export class Email {
|
|
8
|
+
auth;
|
|
9
|
+
transporter;
|
|
9
10
|
constructor(auth) {
|
|
10
11
|
this.auth = auth;
|
|
11
12
|
this.transporter = nodemailer.createTransport({
|
|
@@ -22,43 +23,42 @@ export class Email {
|
|
|
22
23
|
// maxMessages: 50
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
|
-
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
* @
|
|
27
|
+
* Отправка email
|
|
28
|
+
* @param dataMail - данные письма
|
|
29
|
+
* @returns результат отправки
|
|
29
30
|
*/
|
|
30
31
|
async send(dataMail) {
|
|
31
32
|
try {
|
|
33
|
+
let attachments = null;
|
|
32
34
|
// Если прислали ссылку на файл, то скачиваем его и добавляем в attachments
|
|
33
35
|
if (dataMail.fileUrl) {
|
|
34
|
-
|
|
36
|
+
const resDownloadFile = await this.downloadFileToUrl(dataMail.fileUrl);
|
|
35
37
|
if (resDownloadFile.error) {
|
|
36
38
|
return { error: true, message: resDownloadFile.message };
|
|
37
39
|
}
|
|
38
|
-
|
|
40
|
+
attachments = [
|
|
39
41
|
{
|
|
40
|
-
filename: dataMail.fileName,
|
|
41
|
-
content: resDownloadFile.
|
|
42
|
+
filename: dataMail.fileName || "file",
|
|
43
|
+
content: resDownloadFile.data,
|
|
42
44
|
},
|
|
43
45
|
];
|
|
44
|
-
} else {
|
|
45
|
-
dataMail.attachments = null;
|
|
46
46
|
}
|
|
47
|
-
|
|
48
47
|
const info = await this.transporter.sendMail({
|
|
49
48
|
from: `Натяжные потолки Репа. <${this.auth.user}>`, // адрес отправителя
|
|
50
49
|
to: [dataMail.to, this.auth.user], // строка или массив адресов
|
|
51
50
|
subject: dataMail.subject,
|
|
52
51
|
text: dataMail.text,
|
|
53
52
|
html: dataMail.html, // html-версия
|
|
54
|
-
attachments:
|
|
53
|
+
attachments: attachments || undefined,
|
|
55
54
|
});
|
|
56
|
-
return { error: false, info };
|
|
57
|
-
}
|
|
58
|
-
|
|
55
|
+
return { error: false, info: info, message: "Email отправлен." };
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const err = error;
|
|
59
|
+
return { error: true, message: err.message };
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
|
-
|
|
62
62
|
async downloadFileToUrl(fileUrl) {
|
|
63
63
|
try {
|
|
64
64
|
const response = await fetch(fileUrl);
|
|
@@ -67,11 +67,12 @@ export class Email {
|
|
|
67
67
|
}
|
|
68
68
|
const arrayBuffer = await response.arrayBuffer();
|
|
69
69
|
const buffer = Buffer.from(arrayBuffer);
|
|
70
|
-
|
|
71
70
|
// Возвращаем буфер
|
|
72
|
-
return { error: false,
|
|
73
|
-
}
|
|
74
|
-
|
|
71
|
+
return { error: false, data: buffer, message: "Файл скачан." };
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const err = error;
|
|
75
|
+
return { error: true, message: `Ошибка при скачивании файла по fileUrl: ${err.message}` };
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { SmsgoldAuth, SmsData, B24Client, ApiResult } from "../types/index.js";
|
|
2
|
+
interface DiskFileResult {
|
|
3
|
+
ID: string;
|
|
4
|
+
NAME: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class Smsgold {
|
|
7
|
+
private user;
|
|
8
|
+
private pass;
|
|
9
|
+
private b24;
|
|
10
|
+
constructor(authParam: SmsgoldAuth, b24?: B24Client | null);
|
|
11
|
+
sendSms(messageData: SmsData): Promise<ApiResult<{
|
|
12
|
+
status: number;
|
|
13
|
+
statusText: string;
|
|
14
|
+
data?: string;
|
|
15
|
+
errorText?: string;
|
|
16
|
+
}>>;
|
|
17
|
+
uploadFileInFolderB24(fileBuffer: Buffer, fileName: string): Promise<ApiResult<DiskFileResult>>;
|
|
18
|
+
downloadFileToUrl(fileUrl: string): Promise<ApiResult<Buffer>>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=smsgold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smsgold.d.ts","sourceRoot":"","sources":["../../src/sendMessage/smsgold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpF,UAAU,cAAc;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,OAAO;IAChB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,GAAG,CAAmB;gBAElB,SAAS,EAAE,WAAW,EAAE,GAAG,GAAE,SAAS,GAAG,IAAW;IAM1D,OAAO,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAwF5H,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAqB/F,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;CAgBvE"}
|
|
@@ -1,48 +1,51 @@
|
|
|
1
1
|
export class Smsgold {
|
|
2
|
+
user;
|
|
3
|
+
pass;
|
|
4
|
+
b24;
|
|
2
5
|
constructor(authParam, b24 = null) {
|
|
3
6
|
this.user = authParam.user;
|
|
4
7
|
this.pass = authParam.pass;
|
|
5
8
|
this.b24 = b24;
|
|
6
9
|
}
|
|
7
|
-
|
|
8
10
|
async sendSms(messageData) {
|
|
9
11
|
const { phone, message } = messageData;
|
|
10
12
|
// Проверяем наличие необходимых данных
|
|
11
13
|
if (!this.user || !this.pass) {
|
|
12
|
-
return { error: true, message: "Отсутствуют учетные данные SMSGold", result:
|
|
14
|
+
return { error: true, message: "Отсутствуют учетные данные SMSGold", result: undefined };
|
|
13
15
|
}
|
|
14
16
|
if (!phone || !message) {
|
|
15
|
-
return { error: true, message: "Отсутствуют номер телефона или текст сообщения", result:
|
|
17
|
+
return { error: true, message: "Отсутствуют номер телефона или текст сообщения", result: undefined };
|
|
16
18
|
}
|
|
17
19
|
// Проверяем нужно ли отправить файл
|
|
18
20
|
let publicLink = "";
|
|
19
21
|
if (messageData.fileUrl && messageData.fileName) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
const fileUrl = messageData.fileUrl;
|
|
23
|
+
const fileName = messageData.fileName;
|
|
22
24
|
// Скачиваем файл по ссылке
|
|
23
|
-
|
|
25
|
+
const resDownloadFile = await this.downloadFileToUrl(fileUrl);
|
|
24
26
|
if (resDownloadFile.error) {
|
|
25
27
|
return { error: true, message: `Не получилось скачать файл: ${resDownloadFile.message}` };
|
|
26
28
|
}
|
|
27
29
|
// Копируем файл на диск проекта битрикс24. Где автоматически запускается БП на автоматическое удаление файла через 14 дней
|
|
28
|
-
|
|
30
|
+
const resUploadFileInFolderB24 = await this.uploadFileInFolderB24(resDownloadFile.data, fileName);
|
|
29
31
|
if (resUploadFileInFolderB24.error) {
|
|
30
32
|
return { error: true, message: resUploadFileInFolderB24.message };
|
|
31
33
|
}
|
|
32
|
-
|
|
34
|
+
const idFileContract = resUploadFileInFolderB24.data.ID;
|
|
33
35
|
// Получаем публичную ссылку на файл для вставки в сообщение
|
|
34
|
-
|
|
35
36
|
try {
|
|
36
|
-
|
|
37
|
+
const response = await this.b24.callMethod("disk.file.getExternalLink", {
|
|
37
38
|
id: idFileContract,
|
|
38
39
|
});
|
|
39
|
-
publicLink =
|
|
40
|
-
}
|
|
41
|
-
|
|
40
|
+
publicLink = response.getData().result;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
const err = error;
|
|
44
|
+
return { error: true, message: `Ошибка при получении публичной ссылки на файл: ${err.message}` };
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
try {
|
|
45
|
-
|
|
48
|
+
const body = new URLSearchParams({
|
|
46
49
|
user: this.user,
|
|
47
50
|
pass: this.pass,
|
|
48
51
|
action: "send",
|
|
@@ -50,25 +53,22 @@ export class Smsgold {
|
|
|
50
53
|
number: phone,
|
|
51
54
|
sender: "potolkiRepa",
|
|
52
55
|
}).toString();
|
|
53
|
-
|
|
54
|
-
let result = await fetch("https://web.smsgold.ru/http2/", {
|
|
56
|
+
const result = await fetch("https://web.smsgold.ru/http2/", {
|
|
55
57
|
method: "POST",
|
|
56
58
|
headers: {
|
|
57
59
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
58
60
|
},
|
|
59
61
|
body: body,
|
|
60
62
|
});
|
|
61
|
-
|
|
62
63
|
if (!result.ok) {
|
|
63
64
|
const errorText = await result.text();
|
|
64
|
-
|
|
65
|
+
const messageErr = {
|
|
65
66
|
status: result.status,
|
|
66
67
|
statusText: result.statusText,
|
|
67
68
|
errorText: errorText,
|
|
68
69
|
};
|
|
69
70
|
return { error: true, message: `API ошибка: ${result.status}`, result: messageErr };
|
|
70
71
|
}
|
|
71
|
-
|
|
72
72
|
const responseData = await result.text();
|
|
73
73
|
return {
|
|
74
74
|
error: false,
|
|
@@ -79,30 +79,32 @@ export class Smsgold {
|
|
|
79
79
|
data: responseData,
|
|
80
80
|
},
|
|
81
81
|
};
|
|
82
|
-
}
|
|
83
|
-
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const err = error;
|
|
85
|
+
return { error: true, message: err.message, result: undefined };
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
|
-
|
|
87
88
|
// Функция для закачивания файла в папку битрикс24. Используем метод disk.folder.uploadfile
|
|
88
89
|
async uploadFileInFolderB24(fileBuffer, fileName) {
|
|
89
90
|
try {
|
|
90
|
-
|
|
91
|
-
// Используем метод
|
|
92
|
-
|
|
93
|
-
id: 2792881, // Id папки "contract_company" из проекта "Документы и договора"
|
|
91
|
+
const base64File = fileBuffer.toString("base64");
|
|
92
|
+
// Используем метод disk.folder.uploadfile
|
|
93
|
+
const res = await this.b24.callMethod("disk.folder.uploadfile", {
|
|
94
|
+
id: 2792881, // Id папки "contract_company" из проекта "Документы и договора"
|
|
94
95
|
data: {
|
|
95
96
|
NAME: fileName,
|
|
96
97
|
},
|
|
97
98
|
fileContent: [fileName, base64File],
|
|
98
99
|
});
|
|
99
|
-
const data =
|
|
100
|
-
return { error: false, data: data };
|
|
101
|
-
}
|
|
102
|
-
|
|
100
|
+
const data = res.getData().result;
|
|
101
|
+
return { error: false, data: data, message: "Файл загружен." };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
const err = error;
|
|
105
|
+
return { error: true, message: `Ошибка при загрузке файла в папку битрикс24: ${err.message}` };
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
|
-
|
|
106
108
|
async downloadFileToUrl(fileUrl) {
|
|
107
109
|
try {
|
|
108
110
|
const response = await fetch(fileUrl);
|
|
@@ -111,11 +113,12 @@ export class Smsgold {
|
|
|
111
113
|
}
|
|
112
114
|
const arrayBuffer = await response.arrayBuffer();
|
|
113
115
|
const buffer = Buffer.from(arrayBuffer);
|
|
114
|
-
|
|
115
116
|
// Возвращаем буфер
|
|
116
|
-
return { error: false,
|
|
117
|
-
}
|
|
118
|
-
|
|
117
|
+
return { error: false, data: buffer, message: "Файл скачан." };
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const err = error;
|
|
121
|
+
return { error: true, message: `Ошибка при скачивании файла по fileUrl: ${err.message}` };
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
124
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wappi API integration class
|
|
3
|
+
* инициализация класса Wappi initWappi
|
|
4
|
+
* @param {WappiAuth} maxAuth - Wappi auth для Max
|
|
5
|
+
* @param {WappiAuth} telegaAuth - Wappi auth для Telegram
|
|
6
|
+
* @param {WappiAuth} whatsAppAuth - Wappi auth для WhatsApp
|
|
7
|
+
* методы класса:
|
|
8
|
+
* sendMessageWappi(messangerType, messageData) - отправка сообщения
|
|
9
|
+
* sendFileWappi(messangerType, messageData) - отправка файла
|
|
10
|
+
* phoneCheckWappi(messangerType, phone) - проверка номера телефона
|
|
11
|
+
*/
|
|
12
|
+
import type { WappiAuth, MessageData, MessengerType, ApiResult } from "../types/index.js";
|
|
13
|
+
interface WappiResponse {
|
|
14
|
+
status: string;
|
|
15
|
+
detail?: string;
|
|
16
|
+
on_max?: boolean;
|
|
17
|
+
on_whatsapp?: boolean;
|
|
18
|
+
contact?: unknown;
|
|
19
|
+
haveContact?: boolean;
|
|
20
|
+
check?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare class Wappi {
|
|
23
|
+
private maxAuth;
|
|
24
|
+
private telegaAuth;
|
|
25
|
+
private whatsAppAuth;
|
|
26
|
+
constructor(maxAuth: WappiAuth, telegaAuth: WappiAuth, whatsAppAuth: WappiAuth);
|
|
27
|
+
sendMessageWappi(messangerType: MessengerType, messageData: MessageData): Promise<ApiResult<WappiResponse>>;
|
|
28
|
+
sendFileWappi(messangerType: MessengerType, messageData: MessageData): Promise<ApiResult<WappiResponse>>;
|
|
29
|
+
phoneCheckWappi(messangerType: MessengerType, phone: string): Promise<ApiResult<WappiResponse>>;
|
|
30
|
+
getContactTelegramWappi(phone: string): Promise<ApiResult<WappiResponse>>;
|
|
31
|
+
addContactTelegramWappi(phone: string): Promise<ApiResult<WappiResponse>>;
|
|
32
|
+
convertToBase64(fileUrl: string): Promise<ApiResult<string>>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=wappi.d.ts.map
|