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.
Files changed (2) hide show
  1. package/common.js +463 -0
  2. 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
+ }