dcf-common 1.0.0
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/common.js +463 -0
- package/package.json +24 -0
package/common.js
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
/*
|
|
2
|
+
作者:哇哈哈
|
|
3
|
+
公共工具模块
|
|
4
|
+
包含网络请求、加密、时间处理等通用方法
|
|
5
|
+
可被多个脚本引用
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// 依赖项
|
|
9
|
+
const request = require('request').defaults({ jar: true });
|
|
10
|
+
|
|
11
|
+
// 公共模块类
|
|
12
|
+
class CommonUtils {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.cookie_list = [];
|
|
15
|
+
this.message = '';
|
|
16
|
+
this.CryptoJS = require('crypto-js');
|
|
17
|
+
this.NodeRSA = require('node-rsa');
|
|
18
|
+
this.request = request;
|
|
19
|
+
this.Sha_Rsa = require('jsrsasign');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// 多线程或顺序执行
|
|
23
|
+
async Multithreading(taskName, id, thread, BarClass, globalVars) {
|
|
24
|
+
if (!thread) {
|
|
25
|
+
thread = 1;
|
|
26
|
+
}
|
|
27
|
+
while (thread--) {
|
|
28
|
+
if (globalVars.BF == 1) {
|
|
29
|
+
let workGroup = [];
|
|
30
|
+
for (let user of this.cookie_list) {
|
|
31
|
+
workGroup.push(user[taskName](id));
|
|
32
|
+
}
|
|
33
|
+
await Promise.allSettled(workGroup);
|
|
34
|
+
} else {
|
|
35
|
+
for (let user of this.cookie_list) {
|
|
36
|
+
await user[taskName](id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 变量检查
|
|
43
|
+
ExamineCookie(VALY, CK, BarClass, NAME, usid) {
|
|
44
|
+
let ckStr = process.env[VALY] || CK;
|
|
45
|
+
let userCount = 0;
|
|
46
|
+
if (ckStr) {
|
|
47
|
+
for (let userCookies of ckStr.split('\n').filter(x => !!x)) {
|
|
48
|
+
this.cookie_list.push(new BarClass(userCookies, usid));
|
|
49
|
+
usid++;
|
|
50
|
+
}
|
|
51
|
+
userCount = this.cookie_list.length;
|
|
52
|
+
} else {
|
|
53
|
+
console.log(`\n【${NAME}】:未填写变量: ${VALY}`);
|
|
54
|
+
}
|
|
55
|
+
console.log(`共找到${userCount}个账号`);
|
|
56
|
+
return this.cookie_list;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 运行模块 get post put delete patch head options
|
|
60
|
+
task(method, taskurl, taskheader, taskbody, taskhost) {
|
|
61
|
+
if (method == 'delete') {
|
|
62
|
+
method = method.toUpperCase();
|
|
63
|
+
} else {
|
|
64
|
+
method = method;
|
|
65
|
+
}
|
|
66
|
+
if (method == 'post') {
|
|
67
|
+
delete taskheader['content-type'];
|
|
68
|
+
delete taskheader['Content-type'];
|
|
69
|
+
delete taskheader['content-Type'];
|
|
70
|
+
if (this.safeGet(taskbody)) {
|
|
71
|
+
taskheader['Content-Type'] = 'application/json;charset=UTF-8';
|
|
72
|
+
} else {
|
|
73
|
+
taskheader['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
74
|
+
}
|
|
75
|
+
if (taskbody) {
|
|
76
|
+
taskheader['Content-Length'] = this.lengthInUtf8Bytes(taskbody);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (method == 'get') {
|
|
80
|
+
delete taskheader['content-type'];
|
|
81
|
+
delete taskheader['Content-type'];
|
|
82
|
+
delete taskheader['content-Type'];
|
|
83
|
+
delete taskheader['Content-Length'];
|
|
84
|
+
}
|
|
85
|
+
taskheader['Host'] = taskurl['replace']('//', '/')['split']('/')[1];
|
|
86
|
+
return new Promise(async resolve => {
|
|
87
|
+
if (method.indexOf('T') < 0) {
|
|
88
|
+
var httpget = {
|
|
89
|
+
url: taskurl,
|
|
90
|
+
headers: taskheader,
|
|
91
|
+
body: taskbody,
|
|
92
|
+
//timeout: 6000,
|
|
93
|
+
proxy: 'http://' + taskhost,
|
|
94
|
+
};
|
|
95
|
+
} else {
|
|
96
|
+
var httpget = {
|
|
97
|
+
url: taskurl,
|
|
98
|
+
headers: taskheader,
|
|
99
|
+
form: JSON.parse(taskbody),
|
|
100
|
+
//timeout: 6000,
|
|
101
|
+
proxy: 'http://' + taskhost,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (!taskhost) {
|
|
105
|
+
delete httpget['proxy'];
|
|
106
|
+
}
|
|
107
|
+
this.request[method.toLowerCase()](httpget, (err, response, data) => {
|
|
108
|
+
try {
|
|
109
|
+
if (data) {
|
|
110
|
+
if (global.LOGS == 1) {
|
|
111
|
+
console.log(`================ 请求 ================`);
|
|
112
|
+
console.log(httpget);
|
|
113
|
+
console.log(`================ 返回 ================`);
|
|
114
|
+
if (this.safeGet(data)) {
|
|
115
|
+
console.log(JSON.parse(data));
|
|
116
|
+
} else {
|
|
117
|
+
console.log(data);
|
|
118
|
+
}
|
|
119
|
+
// 打印响应头信息
|
|
120
|
+
console.log(`================ 响应头 ================`);
|
|
121
|
+
console.log(response.headers);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
} catch (e) {
|
|
125
|
+
console.log(e, taskurl + '\n' + taskheader);
|
|
126
|
+
} finally {
|
|
127
|
+
let datas = '';
|
|
128
|
+
if (!err) {
|
|
129
|
+
if (this.safeGet(data)) {
|
|
130
|
+
datas = JSON.parse(data);
|
|
131
|
+
// 添加响应头信息到返回对象
|
|
132
|
+
datas.headers = response.headers;
|
|
133
|
+
} else if (data.indexOf('/') != -1 && data.indexOf('+') != -1) {
|
|
134
|
+
//datas = this.decrypts(data);
|
|
135
|
+
datas = data;
|
|
136
|
+
} else {
|
|
137
|
+
datas = data;
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
datas = taskurl + ' API请求失败,请检查网络重试\n' + err;
|
|
141
|
+
}
|
|
142
|
+
return resolve(datas);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// request请求封装
|
|
149
|
+
async httpRequest(options) {
|
|
150
|
+
var request = require('request');
|
|
151
|
+
options.strictSSL = false;
|
|
152
|
+
options.rejectUnauthorized = false;
|
|
153
|
+
return new Promise((resolve) => {
|
|
154
|
+
request(options, function (error, response) {
|
|
155
|
+
if (error) throw new Error(error);
|
|
156
|
+
let data = JSON.parse(response.body);
|
|
157
|
+
resolve(data);
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// 发送通知
|
|
163
|
+
async SendMsg(message, Notify, NAME) {
|
|
164
|
+
if (!message) return;
|
|
165
|
+
if (Notify == 1) {
|
|
166
|
+
try {
|
|
167
|
+
var notify = require("./sendNotify");
|
|
168
|
+
await notify.sendNotify(NAME, message);
|
|
169
|
+
} catch (e) {
|
|
170
|
+
console.log('发送通知失败:', e);
|
|
171
|
+
}
|
|
172
|
+
} else {
|
|
173
|
+
// console.log(message);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// body长度
|
|
178
|
+
lengthInUtf8Bytes(str) {
|
|
179
|
+
let m = encodeURIComponent(str).match(/%[89ABab]/g);
|
|
180
|
+
return str.length + (m ? m.length : 0);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// 随机数组
|
|
184
|
+
randomArr(arr) {
|
|
185
|
+
return arr[parseInt(Math.random() * arr.length, 10)];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// 延迟
|
|
189
|
+
wait(t) {
|
|
190
|
+
return new Promise(e => setTimeout(e, t));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// 当前时间戳 s=10位时间戳或13位时间戳
|
|
194
|
+
time(s) {
|
|
195
|
+
if (s == 10) {
|
|
196
|
+
return Math.round(+new Date() / 1000);
|
|
197
|
+
} else {
|
|
198
|
+
return +new Date();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// 时间戳格式化日期
|
|
203
|
+
timenow(str) {
|
|
204
|
+
let date = new Date();
|
|
205
|
+
if (str == undefined) {
|
|
206
|
+
let date = new Date(),
|
|
207
|
+
N = date.getFullYear() + '-',
|
|
208
|
+
Y = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-',
|
|
209
|
+
R = date.getDate() + ' ',
|
|
210
|
+
S = date.getHours() + ':',
|
|
211
|
+
F = date.getMinutes() + ':',
|
|
212
|
+
M = date.getSeconds() + 1 < 10 ? '0' + date.getSeconds() : date.getSeconds();
|
|
213
|
+
return N + Y + R + S + F + M;
|
|
214
|
+
} else if (str == 0) {
|
|
215
|
+
// 年
|
|
216
|
+
return date.getFullYear();
|
|
217
|
+
} else if (str == 1) {
|
|
218
|
+
// 月
|
|
219
|
+
return date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
|
|
220
|
+
} else if (str == 2) {
|
|
221
|
+
// 日
|
|
222
|
+
return date.getDate();
|
|
223
|
+
} else if (str == 3) {
|
|
224
|
+
// 时
|
|
225
|
+
return date.getHours();
|
|
226
|
+
} else if (str == 4) {
|
|
227
|
+
// 分
|
|
228
|
+
return date.getMinutes();
|
|
229
|
+
} else if (str == 5) {
|
|
230
|
+
// 秒
|
|
231
|
+
return date.getSeconds() + 1 < 10 ? '0' + date.getSeconds() : date.getSeconds();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// 数据检查
|
|
236
|
+
safeGet(data) {
|
|
237
|
+
try {
|
|
238
|
+
if (typeof JSON.parse(data) == 'object') {
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
} catch (e) {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// 判断是否是周三或周日
|
|
247
|
+
isWednesdayOrSunday() {
|
|
248
|
+
const now = new Date();
|
|
249
|
+
const dayOfWeek = now.getDay();
|
|
250
|
+
if (dayOfWeek === 3 || dayOfWeek === 0) {
|
|
251
|
+
return true;
|
|
252
|
+
} else {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// 处理脚本字符串
|
|
258
|
+
DealScriptStr(str) {
|
|
259
|
+
str = str.replace(/\/\*.*?\*\//g, ' ');
|
|
260
|
+
str = str.replace(/\b0(\d+)/g, '0o$1');
|
|
261
|
+
return str;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// 随机字符
|
|
265
|
+
SJS(len, t) {
|
|
266
|
+
if (t == 0) {
|
|
267
|
+
let chars = 'QWERTYUIOPASDFGHJKLZXCVBNM01234567890123456789';
|
|
268
|
+
let maxLen = chars.length;
|
|
269
|
+
let str = '';
|
|
270
|
+
for (let i = 0; i < len; i++) {
|
|
271
|
+
str += chars.charAt(Math.floor(Math.random() * maxLen));
|
|
272
|
+
}
|
|
273
|
+
return str;
|
|
274
|
+
} else if (t == 1) {
|
|
275
|
+
let chars = 'qwertyuiopasdfghjklzxcvbnm0123456789';
|
|
276
|
+
let maxLen = chars.length;
|
|
277
|
+
let str = '';
|
|
278
|
+
for (let i = 0; i < len; i++) {
|
|
279
|
+
str += chars.charAt(Math.floor(Math.random() * maxLen));
|
|
280
|
+
}
|
|
281
|
+
return str;
|
|
282
|
+
} else {
|
|
283
|
+
let chars = '0123456789';
|
|
284
|
+
let maxLen = chars.length;
|
|
285
|
+
let str = '';
|
|
286
|
+
for (let i = 0; i < len; i++) {
|
|
287
|
+
str += chars.charAt(Math.floor(Math.random() * maxLen));
|
|
288
|
+
}
|
|
289
|
+
return str;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// 随机udid 0=大写 1=小写
|
|
294
|
+
udid(str) {
|
|
295
|
+
function S4() {
|
|
296
|
+
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
|
|
297
|
+
}
|
|
298
|
+
let uuid = S4() + S4() + '-' + S4() + '-' + S4() + '-' + S4() + '-' + S4() + S4() + S4();
|
|
299
|
+
if (str == 0) {
|
|
300
|
+
return uuid.toUpperCase();
|
|
301
|
+
} else {
|
|
302
|
+
return uuid.toLowerCase();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// str编码
|
|
307
|
+
encodeUnicode(str) {
|
|
308
|
+
var res = [];
|
|
309
|
+
for (var i = 0; i < str.length; i++) {
|
|
310
|
+
res[i] = ('00' + str.charCodeAt(i).toString(16)).slice(-4);
|
|
311
|
+
}
|
|
312
|
+
return '\\u' + res.join('\\u');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Base64转Hex
|
|
316
|
+
base64ToHex(base64) {
|
|
317
|
+
const binaryStr = Buffer.from(base64, 'base64').toString('binary');
|
|
318
|
+
const uint8Array = new Uint8Array(binaryStr.length);
|
|
319
|
+
for (let i = 0; i < binaryStr.length; i++) {
|
|
320
|
+
uint8Array[i] = binaryStr.charCodeAt(i);
|
|
321
|
+
}
|
|
322
|
+
let hex = "";
|
|
323
|
+
for (let i = 0; i < uint8Array.length; i++) {
|
|
324
|
+
const byte = uint8Array[i].toString(16).padStart(2, "0");
|
|
325
|
+
hex += byte;
|
|
326
|
+
}
|
|
327
|
+
return hex;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// str解码
|
|
331
|
+
decodeUnicode(str) {
|
|
332
|
+
str = str.replace(/\\u/g, '%u');
|
|
333
|
+
return unescape(unescape(str));
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// 生成指定范围内的随机数
|
|
337
|
+
RT(X, Y) {
|
|
338
|
+
return Math.round(Math.random() * (Y - X) + X);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// 去除数组空值
|
|
342
|
+
arrNull(arr) {
|
|
343
|
+
var r = arr.filter(s => {
|
|
344
|
+
return s && s.trim();
|
|
345
|
+
});
|
|
346
|
+
return r;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// 国际标准时间
|
|
350
|
+
nowtime() {
|
|
351
|
+
return new Date(new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 + 8 * 60 * 60 * 1000);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// 日期格式化时间戳
|
|
355
|
+
timecs() {
|
|
356
|
+
let newtime = this.nowtime();
|
|
357
|
+
if (JSON.stringify(newtime).indexOf(' ') >= 0) {
|
|
358
|
+
newtime = newtime.replace(' ', 'T');
|
|
359
|
+
}
|
|
360
|
+
return new Date(newtime).getTime() - 8 * 60 * 60 * 1000;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// 键值对转json
|
|
364
|
+
rtjson(input, apart, apart2, i) {
|
|
365
|
+
if (i == 0) {
|
|
366
|
+
return JSON.stringify(
|
|
367
|
+
input.split(apart).reduce((sum, item) => {
|
|
368
|
+
let temp = item.split(apart2);
|
|
369
|
+
sum[temp[0].trim()] = temp[1].trim();
|
|
370
|
+
return sum;
|
|
371
|
+
}, {})
|
|
372
|
+
);
|
|
373
|
+
} else {
|
|
374
|
+
return input.split(apart).reduce((sum, item) => {
|
|
375
|
+
let temp = item.split(apart2);
|
|
376
|
+
sum[temp[0].trim()] = temp[1].trim();
|
|
377
|
+
return sum;
|
|
378
|
+
}, {});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// MD5加密
|
|
383
|
+
MD5Encrypt(i, str) {
|
|
384
|
+
if (i == 0) {
|
|
385
|
+
return this.CryptoJS.MD5(str).toString().toLowerCase();
|
|
386
|
+
} else if (i == 1) {
|
|
387
|
+
return this.CryptoJS.MD5(str).toString().toUpperCase();
|
|
388
|
+
} else if (i == 2) {
|
|
389
|
+
return this.CryptoJS.MD5(str).toString().substring(8, 24).toLowerCase();
|
|
390
|
+
} else if (i == 3) {
|
|
391
|
+
return this.CryptoJS.MD5(str).toString().substring(8, 24).toUpperCase();
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// SHA类加密
|
|
396
|
+
SHA_Encrypt(i, Encrypt, str) {
|
|
397
|
+
if (i == 0) {
|
|
398
|
+
return this.CryptoJS[Encrypt](str).toString(this.CryptoJS.enc.Base64);
|
|
399
|
+
} else {
|
|
400
|
+
return this.CryptoJS[Encrypt](str).toString();
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// HmacSHA类加密
|
|
405
|
+
HmacSHA_Encrypt(i, Encrypt, str, key) {
|
|
406
|
+
if (i == 0) {
|
|
407
|
+
return this.CryptoJS[Encrypt](str, key).toString(this.CryptoJS.enc.Base64);
|
|
408
|
+
} else {
|
|
409
|
+
return this.CryptoJS[Encrypt](str, key).toString();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Base64编码解码
|
|
414
|
+
Base64(i, str) {
|
|
415
|
+
if (i == 0) {
|
|
416
|
+
return this.CryptoJS.enc.Base64.stringify(this.CryptoJS.enc.Utf8.parse(str));
|
|
417
|
+
} else {
|
|
418
|
+
return this.CryptoJS.enc.Utf8.stringify(this.CryptoJS.enc.Base64.parse(str));
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// AES/DES加解密
|
|
423
|
+
DecryptCrypto(i, method, mode, padding, data, key, iv) {
|
|
424
|
+
if (i == 0) {
|
|
425
|
+
const encrypted = this.CryptoJS[method].encrypt(this.CryptoJS.enc.Utf8.parse(data), this.CryptoJS.enc.Utf8.parse(key), {
|
|
426
|
+
iv: this.CryptoJS.enc.Utf8.parse(iv),
|
|
427
|
+
mode: this.CryptoJS.mode[mode],
|
|
428
|
+
padding: this.CryptoJS.pad[padding],
|
|
429
|
+
});
|
|
430
|
+
return encrypted.toString();
|
|
431
|
+
} else {
|
|
432
|
+
const decrypt = this.CryptoJS[method].decrypt(data, this.CryptoJS.enc.Utf8.parse(key), {
|
|
433
|
+
iv: this.CryptoJS.enc.Utf8.parse(iv),
|
|
434
|
+
mode: this.CryptoJS.mode[mode],
|
|
435
|
+
padding: this.CryptoJS.pad[padding],
|
|
436
|
+
});
|
|
437
|
+
return decrypt.toString(this.CryptoJS.enc.Utf8);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// RSA加密
|
|
442
|
+
RSA(msg, Key) {
|
|
443
|
+
const NodeRSA = require('node-rsa');
|
|
444
|
+
let nodersa = new NodeRSA('-----BEGIN PUBLIC KEY-----\n' + Key + '\n-----END PUBLIC KEY-----');
|
|
445
|
+
nodersa.setOptions({ encryptionScheme: 'pkcs1' });
|
|
446
|
+
return nodersa.encrypt(msg, 'base64', 'utf8');
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// 获取SHA256withRSA签名
|
|
450
|
+
getSHA256withRSA(content, privateKeyString) {
|
|
451
|
+
const rs = require('jsrsasign');
|
|
452
|
+
const key = rs.KEYUTIL.getKey(privateKeyString);
|
|
453
|
+
const signature = new rs.KJUR.crypto.Signature({ alg: "SHA256withRSA" });
|
|
454
|
+
signature.init(key);
|
|
455
|
+
signature.updateString(content);
|
|
456
|
+
const originSign = signature.sign();
|
|
457
|
+
const sign64u = rs.hextob64u(originSign);
|
|
458
|
+
return sign64u;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// 导出公共模块
|
|
463
|
+
module.exports = new CommonUtils();
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dcf-common",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "公共工具函数模块,包含网络请求、加密、时间处理等通用方法",
|
|
5
|
+
"main": "common.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"utils",
|
|
11
|
+
"common",
|
|
12
|
+
"tools",
|
|
13
|
+
"network",
|
|
14
|
+
"encryption"
|
|
15
|
+
],
|
|
16
|
+
"author": "哇哈哈",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"crypto-js": "^4.2.0",
|
|
20
|
+
"node-rsa": "^1.1.1",
|
|
21
|
+
"jsrsasign": "^10.9.0",
|
|
22
|
+
"request": "^2.88.2"
|
|
23
|
+
}
|
|
24
|
+
}
|