|
|
@@ -497,6 +497,116 @@ function MagicJS(scriptName = "MagicJS", logLevel = "INFO") {
|
|
|
return this.doWxpusherSend(data);
|
|
|
}
|
|
|
|
|
|
+ isEmpty(obj) {
|
|
|
+ return typeof obj == "undefined" || obj == null || obj == "" || obj == "null" || obj == "undefined" || obj.length === 0
|
|
|
+ }
|
|
|
+
|
|
|
+ base64Decode(input) {
|
|
|
+ const base64_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
|
|
|
+ // 确保输入是一个正确的Base64编码字符串
|
|
|
+ if (/([^\s]+[^0-9a-zA-Z\+\/\=]|[^0-9a-zA-Z\+\/\=]\s+)/.test(input)) {
|
|
|
+ throw new Error('Invalid base64 input');
|
|
|
+ }
|
|
|
+
|
|
|
+ let str = input.replace(/\s/g, '');
|
|
|
+ let output = '';
|
|
|
+ let chr1, chr2, chr3;
|
|
|
+ let enc1, enc2, enc3, enc4;
|
|
|
+ let i = 0;
|
|
|
+
|
|
|
+ while (i < str.length) {
|
|
|
+ enc1 = base64_chars.indexOf(str.charAt(i++));
|
|
|
+ enc2 = base64_chars.indexOf(str.charAt(i++));
|
|
|
+ enc3 = base64_chars.indexOf(str.charAt(i++));
|
|
|
+ enc4 = base64_chars.indexOf(str.charAt(i++));
|
|
|
+
|
|
|
+ chr1 = (enc1 << 2) | (enc2 >> 4);
|
|
|
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
|
|
+ chr3 = ((enc3 & 3) << 6) | enc4;
|
|
|
+
|
|
|
+ output = output + String.fromCharCode(chr1);
|
|
|
+
|
|
|
+ if (enc3 !== 64) {
|
|
|
+ output = output + String.fromCharCode(chr2);
|
|
|
+ }
|
|
|
+ if (enc4 !== 64) {
|
|
|
+ output = output + String.fromCharCode(chr3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ output = this.utf8Decode(output);
|
|
|
+
|
|
|
+ return output;
|
|
|
+ }
|
|
|
+
|
|
|
+ utf8Decode(str_data) {
|
|
|
+ let tmp_arr = [],
|
|
|
+ i = 0,
|
|
|
+ c1 = 0,
|
|
|
+ seqlen = 0;
|
|
|
+
|
|
|
+ str_data = str_data.replace(/\r\n/g, "\n");
|
|
|
+
|
|
|
+ while (i < str_data.length) {
|
|
|
+ c1 = str_data.charCodeAt(i) & 0xFF;
|
|
|
+ seqlen = 0;
|
|
|
+
|
|
|
+ // Single byte sequence (0xxxxxxx)
|
|
|
+ if (c1 <= 0xBF) {
|
|
|
+ c1 = (c1 & 0x7F);
|
|
|
+ seqlen = 1;
|
|
|
+ } else if (c1 <= 0xDF) {
|
|
|
+ c1 = (c1 & 0x1F);
|
|
|
+ seqlen = 2;
|
|
|
+ } else if (c1 <= 0xEF) {
|
|
|
+ c1 = (c1 & 0x0F);
|
|
|
+ seqlen = 3;
|
|
|
+ } else {
|
|
|
+ c1 = (c1 & 0x07);
|
|
|
+ seqlen = 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let ai = 1; ai < seqlen; ++ai) {
|
|
|
+ c1 = ((c1 << 0x06) | (str_data.charCodeAt(ai + i) & 0x3F));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (seqlen === 4) {
|
|
|
+ c1 -= 0x10000;
|
|
|
+ tmp_arr.push(String.fromCharCode(0xD800 | ((c1 >> 10) & 0x3FF)));
|
|
|
+ tmp_arr.push(String.fromCharCode(0xDC00 | (c1 & 0x3FF)));
|
|
|
+ } else {
|
|
|
+ tmp_arr.push(String.fromCharCode(c1));
|
|
|
+ }
|
|
|
+
|
|
|
+ i += seqlen;
|
|
|
+ }
|
|
|
+
|
|
|
+ return tmp_arr.join("");
|
|
|
+ }
|
|
|
+
|
|
|
+ parseJwt(token) {
|
|
|
+ try {
|
|
|
+ const segments = token.split('.');
|
|
|
+ const base64HeaderUrl = segments[0];
|
|
|
+ const base64Header = base64HeaderUrl.replace(/-/g, '+').replace(/_/g, '/');
|
|
|
+ const jsonStrHeader = this.base64Decode(base64Header).replace(/\0/g, '');
|
|
|
+ const headerData = JSON.parse(jsonStrHeader);
|
|
|
+
|
|
|
+ const base64PayloadUrl = segments[1];
|
|
|
+ const base64Payload = base64PayloadUrl.replace(/-/g, '+').replace(/_/g, '/');
|
|
|
+ const jsonStrPayload = this.base64Decode(base64Payload).replace(/\0/g, '');
|
|
|
+ const payloadData = JSON.parse(jsonStrPayload);
|
|
|
+
|
|
|
+ return {
|
|
|
+ header: headerData,
|
|
|
+ payload: payloadData,
|
|
|
+ signature: segments[2],
|
|
|
+ };
|
|
|
+ } catch (e) {
|
|
|
+ this.log(e);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
costTime() {
|
|
|
let info = `${this.scriptName}执行完毕!`
|
|
|
// if (this.isNode && this.isExecComm) {
|