diff --git a/README.md b/README.md index fc83974..97a13b5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # drpyS(drpy-node) nodejs作为服务端的drpy实现。全面升级异步写法 -~~积极开发中,每日一更~~,当前进度 `48%` +~~积极开发中,每日一更~~,当前进度 `49%` 找工作中,随缘更新 * [本地配置接口-动态本地](/config?pwd=) @@ -19,6 +19,22 @@ nodejs作为服务端的drpy实现。全面升级异步写法 ## 更新记录 +### 20250310 + +更新至V1.1.23 + +### 20250227 + +更新至V1.1.22 + +### 20250226 + +更新至V1.1.21 + +### 20250225 + +更新至V1.1.20 + ### 20250224 更新至V1.1.19 diff --git a/apps/cookie-butler/index.html b/apps/cookie-butler/index.html index c9e24cc..c313001 100644 --- a/apps/cookie-butler/index.html +++ b/apps/cookie-butler/index.html @@ -9,6 +9,7 @@ + @@ -19,6 +20,7 @@
  • 阿里
  • 夸克
  • UC
  • +
  • UC_TOKEN
  • 哔哩哔哩
  • diff --git a/apps/cookie-butler/static/js/cookie.js b/apps/cookie-butler/static/js/cookie.js index 564b79a..5b5c9fe 100644 --- a/apps/cookie-butler/static/js/cookie.js +++ b/apps/cookie-butler/static/js/cookie.js @@ -20,7 +20,7 @@ function showToast(message, type = 'success') { // 初始化页面 async function initializePage() { // 加载cookie - const platforms = ['ali', 'quark', 'uc', 'bili']; + const platforms = ['ali', 'quark', 'uc','uc_token', 'bili']; // 绑定按钮事件 platforms.forEach(platform => { diff --git a/apps/cookie-butler/static/js/core.js b/apps/cookie-butler/static/js/core.js index 19838c5..4f03ed6 100644 --- a/apps/cookie-butler/static/js/core.js +++ b/apps/cookie-butler/static/js/core.js @@ -1,3 +1,4 @@ + class QRCodeHandler { // 状态常量 static STATUS_NEW = "NEW"; // 待扫描 @@ -10,6 +11,7 @@ class QRCodeHandler { static PLATFORM_QUARK = "quark"; // 夸克 static PLATFORM_ALI = "ali"; // 阿里云盘 static PLATFORM_UC = "uc"; // UC + static PLATFORM_UC_TOKEN = "uc_token"; // uc_token static PLATFORM_BILI = "bili"; // 哔哩哔哩 // 通用请求头 @@ -24,8 +26,22 @@ class QRCodeHandler { [QRCodeHandler.PLATFORM_QUARK]: null, [QRCodeHandler.PLATFORM_ALI]: null, [QRCodeHandler.PLATFORM_UC]: null, + [QRCodeHandler.PLATFORM_UC_TOKEN]: null, [QRCodeHandler.PLATFORM_BILI]: null }; + this.Addition = { + DeviceID: '07b48aaba8a739356ab8107b5e230ad4', + RefreshToken: '', + AccessToken: '' + } + this.conf = { + api: "https://open-api-drive.uc.cn", + clientID: "5acf882d27b74502b7040b0c65519aa7", + signKey: "l3srvtd7p42l0d0x1u8d7yc8ye9kki4d", + appVer: "1.6.8", + channel: "UCTVOFFICIALWEB", + codeApi: "http://api.extscreen.com/ucdrive", + }; } static generateUUID() { @@ -107,6 +123,8 @@ class QRCodeHandler { return await this._startAliScan(); case QRCodeHandler.PLATFORM_UC: return await this._startUCScan(); + case QRCodeHandler.PLATFORM_UC_TOKEN: + return await this._startUC_TOKENScan(); case QRCodeHandler.PLATFORM_BILI: return await this._startBiliScan(); default: @@ -122,6 +140,8 @@ class QRCodeHandler { return await this._checkAliStatus(); case QRCodeHandler.PLATFORM_UC: return await this._checkUCStatus(); + case QRCodeHandler.PLATFORM_UC_TOKEN: + return await this._checkUC_TOKENStatus(); case QRCodeHandler.PLATFORM_BILI: return await this._checkBiliStatus(); default: @@ -380,14 +400,12 @@ class QRCodeHandler { }); const resData = res.data; const token = resData.data.data.members.token; - const qrUrl = `https://su.uc.cn/1_n0ZCv?token=${token}&client_id=381&uc_param_str=&uc_biz_str=S%3Acustom%7CC%3Atitlebar_fix`; this.platformStates[QRCodeHandler.PLATFORM_UC] = { token: token, request_id: requestId }; - const qrCode = await this._generateQRCode(qrUrl); return { qrcode: qrCode, @@ -404,8 +422,8 @@ class QRCodeHandler { if (!state) { return {status: QRCodeHandler.STATUS_EXPIRED}; } - try { + const res = await axios({ url: "/http", method: "POST", @@ -426,9 +444,12 @@ class QRCodeHandler { } } }); + // this.code = await this.getCode(this.token) + // let access_token = await this.refreshToken(this.code); + // console.log(access_token) const resData = res.data; - if (resData.data.status === 2000000) { // 扫码成功 + const serviceTicket = resData.data.data.members.service_ticket; const cookieRes = await axios({ url: "/http", @@ -482,6 +503,178 @@ class QRCodeHandler { } } + generateDeviceID(timestamp) { + return CryptoJS.MD5(timestamp).toString().slice(0, 16); // 取前16位 + } + + generateReqId(deviceID, timestamp) { + return CryptoJS.MD5(deviceID + timestamp).toString().slice(0, 16); + } + + generateXPanToken(method, pathname, timestamp, key) { + const data = method + '&' + pathname + '&' + timestamp + '&' + key; + return CryptoJS.SHA256(data).toString(); + } + + //uc_token + async _startUC_TOKENScan() { + try { + const pathname = '/oauth/authorize' + const timestamp = Math.floor(Date.now() / 1000).toString()+'000'; // 13位时间戳需调整 + const deviceID = this.Addition.DeviceID || this.generateDeviceID(timestamp); + const reqId = this.generateReqId(deviceID, timestamp); + const token = this.generateXPanToken('GET', pathname, timestamp, this.conf.signKey); + const headers = { + Accept: 'application/json, text/plain, */*', + 'User-Agent': 'Mozilla/5.0 (Linux; U; Android 13; zh-cn; M2004J7AC Build/UKQ1.231108.001) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1', + 'x-pan-tm': timestamp, + 'x-pan-token': token, + 'x-pan-client-id': this.conf.clientID, + ...(this.Addition.AccessToken ? { 'Authorization': `Bearer ${this.Addition.AccessToken}` } : {}) + }; + const res = await axios({ + url: "/http", + method: "POST", + data: { + url: `${this.conf.api}${pathname}`, + headers: headers, + params: { + req_id: reqId, + access_token: this.Addition.AccessToken, + app_ver: this.conf.appVer, + device_id: deviceID, + device_brand: 'Xiaomi', + platform: 'tv', + device_name: 'M2004J7AC', + device_model: 'M2004J7AC', + build_device: 'M2004J7AC', + build_product: 'M2004J7AC', + device_gpu: 'Adreno (TM) 550', + activity_rect: '{}', + channel: this.conf.channel, + auth_type : 'code', + client_id : this.conf.clientID, + scope : 'netdisk', + qrcode : '1', + qr_width : '460', + qr_height : '460', + }, + } + }); + const resData = res.data; + this.query_token = resData.data.query_token; + const qrCode = resData.data.qr_data; + this.platformStates[QRCodeHandler.PLATFORM_UC_TOKEN] = { + query_token: this.query_token, + request_id: reqId + }; + return { + qrcode: 'data:image/png;base64,'+qrCode, + status: QRCodeHandler.STATUS_NEW + }; + } catch (e) { + this.platformStates[QRCodeHandler.PLATFORM_UC_TOKEN] = null; + throw e; + } + } + + async _checkUC_TOKENStatus() { + const state = this.platformStates[QRCodeHandler.PLATFORM_UC_TOKEN]; + if (!state) { + return {status: QRCodeHandler.STATUS_EXPIRED}; + } + const pathname = '/oauth/code'; + const timestamp = Math.floor(Date.now() / 1000).toString()+'000'; // 13位时间戳需调整 + const deviceID = this.Addition.DeviceID || this.generateDeviceID(timestamp); + const reqId = this.generateReqId(deviceID, timestamp); + const x_pan_token = this.generateXPanToken("GET", pathname, timestamp, this.conf.signKey); + const headers = { + Accept: 'application/json, text/plain, */*', + 'User-Agent': 'Mozilla/5.0 (Linux; U; Android 13; zh-cn; M2004J7AC Build/UKQ1.231108.001) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1', + 'x-pan-tm': timestamp, + 'x-pan-token': x_pan_token, + 'x-pan-client-id': this.conf.clientID, + ...(this.Addition.AccessToken ? { 'Authorization': `Bearer ${this.Addition.AccessToken}` } : {}) + }; + try { + const res = await axios({ + url: "/http", + method: "POST", + data: { + url: `${this.conf.api}${pathname}`, + headers: headers, + params: { + req_id: reqId, + access_token: this.Addition.AccessToken, + app_ver: this.conf.appVer, + device_id: deviceID, + device_brand: 'Xiaomi', + platform: 'tv', + device_name: 'M2004J7AC', + device_model: 'M2004J7AC', + build_device: 'M2004J7AC', + build_product: 'M2004J7AC', + device_gpu: 'Adreno (TM) 550', + activity_rect: '{}', + channel: this.conf.channel, + client_id: this.conf.clientID, + scope: 'netdisk', + query_token: this.query_token + } + } + }).catch(err => err.response); + const resData = res.data; + if (resData.status === 200) { // 扫码成功 + const pathname = '/token'; + const timestamp = Math.floor(Date.now() / 1000).toString()+'000'; + const reqId = this.generateReqId(this.Addition.DeviceID, timestamp); + const data = JSON.stringify({ + req_id: reqId, + app_ver: this.conf.appVer, + device_id: this.Addition.DeviceID, + device_brand: 'Xiaomi', + platform: 'tv', + device_name: 'M2004J7AC', + device_model: 'M2004J7AC', + build_device: 'M2004J7AC', + build_product: 'M2004J7AC', + device_gpu: 'Adreno (TM) 550', + activity_rect: '{}', + channel: this.conf.channel, + code:resData.data.code + }); + const response = await axios({ + url: '/http', + method: "POST", + data:{ + url:`${this.conf.codeApi}${pathname}`, + method: "POST", + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Content-Type': 'application/json', + }, + data:data + } + }); + const resp = response.data; + if(resp.status === 200) { + this.platformStates[QRCodeHandler.PLATFORM_UC_TOKEN] = null; + return { + status: QRCodeHandler.STATUS_CONFIRMED, + cookie: resp.data.data.access_token + }; + } + + } else if (resData.status === 400){ + return {status: QRCodeHandler.STATUS_NEW}; + } + } catch (e) { + this.platformStates[QRCodeHandler.PLATFORM_UC_TOKEN] = null; + throw new Error(e.message); + } + } + // 哔哩哔哩平台相关方法 async _startBiliScan() { try { diff --git a/apps/cookie-butler/static/js/crypto-js.min.js b/apps/cookie-butler/static/js/crypto-js.min.js new file mode 100644 index 0000000..20b3099 --- /dev/null +++ b/apps/cookie-butler/static/js/crypto-js.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports?module.exports=exports=e():"function"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var n,o,s,a,h,t,e,l,r,i,c,f,d,u,p,S,x,b,A,H,z,_,v,g,y,B,w,k,m,C,D,E,R,M,F,P,W,O,I,U=U||function(h){var i;if("undefined"!=typeof window&&window.crypto&&(i=window.crypto),"undefined"!=typeof self&&self.crypto&&(i=self.crypto),!(i=!(i=!(i="undefined"!=typeof globalThis&&globalThis.crypto?globalThis.crypto:i)&&"undefined"!=typeof window&&window.msCrypto?window.msCrypto:i)&&"undefined"!=typeof global&&global.crypto?global.crypto:i)&&"function"==typeof require)try{i=require("crypto")}catch(t){}var r=Object.create||function(t){return e.prototype=t,t=new e,e.prototype=null,t};function e(){}var t={},n=t.lib={},o=n.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},l=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=h.ceil(e/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new l.init(r,e/2)}},a=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new l.init(r,e)}},f=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(a.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return a.parse(unescape(encodeURIComponent(t)))}},d=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new l.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?h.ceil(s):h.max((0|s)-this._minBufferSize,0))*o,n=h.min(4*c,n);if(c){for(var a=0;a>>32-e}function j(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s>24&255)?(r=t>>8&255,i=255&t,255===(e=t>>16&255)?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i):t+=1<<24,t}function N(){for(var t=this._X,e=this._C,r=0;r<8;r++)E[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;R[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=R[0]+(R[7]<<16|R[7]>>>16)+(R[6]<<16|R[6]>>>16)|0,t[1]=R[1]+(R[0]<<8|R[0]>>>24)+R[7]|0,t[2]=R[2]+(R[1]<<16|R[1]>>>16)+(R[0]<<16|R[0]>>>16)|0,t[3]=R[3]+(R[2]<<8|R[2]>>>24)+R[1]|0,t[4]=R[4]+(R[3]<<16|R[3]>>>16)+(R[2]<<16|R[2]>>>16)|0,t[5]=R[5]+(R[4]<<8|R[4]>>>24)+R[3]|0,t[6]=R[6]+(R[5]<<16|R[5]>>>16)+(R[4]<<16|R[4]>>>16)|0,t[7]=R[7]+(R[6]<<8|R[6]>>>24)+R[5]|0}function q(){for(var t=this._X,e=this._C,r=0;r<8;r++)O[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;I[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=I[0]+(I[7]<<16|I[7]>>>16)+(I[6]<<16|I[6]>>>16)|0,t[1]=I[1]+(I[0]<<8|I[0]>>>24)+I[7]|0,t[2]=I[2]+(I[1]<<16|I[1]>>>16)+(I[0]<<16|I[0]>>>16)|0,t[3]=I[3]+(I[2]<<8|I[2]>>>24)+I[1]|0,t[4]=I[4]+(I[3]<<16|I[3]>>>16)+(I[2]<<16|I[2]>>>16)|0,t[5]=I[5]+(I[4]<<8|I[4]>>>24)+I[3]|0,t[6]=I[6]+(I[5]<<16|I[5]>>>16)+(I[4]<<16|I[4]>>>16)|0,t[7]=I[7]+(I[6]<<8|I[6]>>>24)+I[5]|0}return F=(M=U).lib,n=F.Base,o=F.WordArray,(M=M.x64={}).Word=n.extend({init:function(t,e){this.high=t,this.low=e}}),M.WordArray=n.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:8*t.length},toX32:function(){for(var t=this.words,e=t.length,r=[],i=0;i>>2]|=t[i]<<24-i%4*8;s.call(this,r,e)}else s.apply(this,arguments)}).prototype=P),function(){var t=U,n=t.lib.WordArray,t=t.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),a=(w=U).lib.WordArray,w.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join("")},parse:function(t){var e=t.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],n=0;n>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return a.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},h=(F=U).lib.WordArray,F.enc.Base64url={stringify:function(t,e=!0){var r=t.words,i=t.sigBytes,n=e?this._safe_map:this._map;t.clamp();for(var o=[],s=0;s>>2]>>>24-s%4*8&255)<<16|(r[s+1>>>2]>>>24-(s+1)%4*8&255)<<8|r[s+2>>>2]>>>24-(s+2)%4*8&255,a=0;a<4&&s+.75*a>>6*(3-a)&63));var h=n.charAt(64);if(h)for(;o.length%4;)o.push(h);return o.join("")},parse:function(t,e=!0){var r=t.length,i=e?this._safe_map:this._map;if(!(n=this._reverseMap))for(var n=this._reverseMap=[],o=0;o>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return h.create(i,n)}(t,r,n)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",_safe_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},function(a){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,A=[];!function(){for(var t=0;t<64;t++)A[t]=4294967296*a.abs(a.sin(t+1))|0}();e=e.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],y=t[e+10],v=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],m=H(m=o[0],b=o[1],x=o[2],S=o[3],s,7,A[0]),S=H(S,m,b,x,c,12,A[1]),x=H(x,S,m,b,a,17,A[2]),b=H(b,x,S,m,h,22,A[3]);m=H(m,b,x,S,l,7,A[4]),S=H(S,m,b,x,f,12,A[5]),x=H(x,S,m,b,d,17,A[6]),b=H(b,x,S,m,u,22,A[7]),m=H(m,b,x,S,p,7,A[8]),S=H(S,m,b,x,_,12,A[9]),x=H(x,S,m,b,y,17,A[10]),b=H(b,x,S,m,v,22,A[11]),m=H(m,b,x,S,g,7,A[12]),S=H(S,m,b,x,B,12,A[13]),x=H(x,S,m,b,w,17,A[14]),m=z(m,b=H(b,x,S,m,k,22,A[15]),x,S,c,5,A[16]),S=z(S,m,b,x,d,9,A[17]),x=z(x,S,m,b,v,14,A[18]),b=z(b,x,S,m,s,20,A[19]),m=z(m,b,x,S,f,5,A[20]),S=z(S,m,b,x,y,9,A[21]),x=z(x,S,m,b,k,14,A[22]),b=z(b,x,S,m,l,20,A[23]),m=z(m,b,x,S,_,5,A[24]),S=z(S,m,b,x,w,9,A[25]),x=z(x,S,m,b,h,14,A[26]),b=z(b,x,S,m,p,20,A[27]),m=z(m,b,x,S,B,5,A[28]),S=z(S,m,b,x,a,9,A[29]),x=z(x,S,m,b,u,14,A[30]),m=C(m,b=z(b,x,S,m,g,20,A[31]),x,S,f,4,A[32]),S=C(S,m,b,x,p,11,A[33]),x=C(x,S,m,b,v,16,A[34]),b=C(b,x,S,m,w,23,A[35]),m=C(m,b,x,S,c,4,A[36]),S=C(S,m,b,x,l,11,A[37]),x=C(x,S,m,b,u,16,A[38]),b=C(b,x,S,m,y,23,A[39]),m=C(m,b,x,S,B,4,A[40]),S=C(S,m,b,x,s,11,A[41]),x=C(x,S,m,b,h,16,A[42]),b=C(b,x,S,m,d,23,A[43]),m=C(m,b,x,S,_,4,A[44]),S=C(S,m,b,x,g,11,A[45]),x=C(x,S,m,b,k,16,A[46]),m=D(m,b=C(b,x,S,m,a,23,A[47]),x,S,s,6,A[48]),S=D(S,m,b,x,u,10,A[49]),x=D(x,S,m,b,w,15,A[50]),b=D(b,x,S,m,f,21,A[51]),m=D(m,b,x,S,g,6,A[52]),S=D(S,m,b,x,h,10,A[53]),x=D(x,S,m,b,y,15,A[54]),b=D(b,x,S,m,c,21,A[55]),m=D(m,b,x,S,p,6,A[56]),S=D(S,m,b,x,k,10,A[57]),x=D(x,S,m,b,d,15,A[58]),b=D(b,x,S,m,B,21,A[59]),m=D(m,b,x,S,l,6,A[60]),S=D(S,m,b,x,v,10,A[61]),x=D(x,S,m,b,a,15,A[62]),b=D(b,x,S,m,_,21,A[63]),o[0]=o[0]+m|0,o[1]=o[1]+b|0,o[2]=o[2]+x|0,o[3]=o[3]+S|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=a.floor(r/4294967296),r=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,o=e.words,s=0;s<4;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return e},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function H(t,e,r,i,n,o,s){s=t+(e&r|~e&i)+n+s;return(s<>>32-o)+e}function z(t,e,r,i,n,o,s){s=t+(e&i|r&~i)+n+s;return(s<>>32-o)+e}function C(t,e,r,i,n,o,s){s=t+(e^r^i)+n+s;return(s<>>32-o)+e}function D(t,e,r,i,n,o,s){s=t+(r^(e|~i))+n+s;return(s<>>32-o)+e}t.MD5=i._createHelper(e),t.HmacMD5=i._createHmacHelper(e)}(Math),P=(M=U).lib,t=P.WordArray,e=P.Hasher,P=M.algo,l=[],P=P.SHA1=e.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){a<16?l[a]=0|t[e+a]:(h=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=h<<1|h>>>31);var h=(i<<5|i>>>27)+c+l[a];h+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=h}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t}}),M.SHA1=e._createHelper(P),M.HmacSHA1=e._createHmacHelper(P),function(n){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,o=[],p=[];!function(){function t(t){return 4294967296*(t-(0|t))|0}for(var e=2,r=0;r<64;)!function(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}(e)||(r<8&&(o[r]=t(n.pow(e,.5))),p[r]=t(n.pow(e,1/3)),r++),e++}();var _=[],e=e.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){f<16?_[f]=0|t[e+f]:(d=_[f-15],u=_[f-2],_[f]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+_[f-7]+((u<<15|u>>>17)^(u<<13|u>>>19)^u>>>10)+_[f-16]);var d=i&n^i&o^n&o,u=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+p[f]+_[f],l=h,h=a,a=c,c=s+u|0,s=o,o=n,n=i,i=u+(((i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22))+d)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(e),t.HmacSHA256=i._createHmacHelper(e)}(Math),r=(w=U).lib.WordArray,F=w.algo,i=F.SHA256,F=F.SHA224=i.extend({_doReset:function(){this._hash=new r.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=4,t}}),w.SHA224=i._createHelper(F),w.HmacSHA224=i._createHmacHelper(F),function(){var t=U,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,r=t.algo;function o(){return i.create.apply(i,arguments)}var t1=[o(1116352408,3609767458),o(1899447441,602891725),o(3049323471,3964484399),o(3921009573,2173295548),o(961987163,4081628472),o(1508970993,3053834265),o(2453635748,2937671579),o(2870763221,3664609560),o(3624381080,2734883394),o(310598401,1164996542),o(607225278,1323610764),o(1426881987,3590304994),o(1925078388,4068182383),o(2162078206,991336113),o(2614888103,633803317),o(3248222580,3479774868),o(3835390401,2666613458),o(4022224774,944711139),o(264347078,2341262773),o(604807628,2007800933),o(770255983,1495990901),o(1249150122,1856431235),o(1555081692,3175218132),o(1996064986,2198950837),o(2554220882,3999719339),o(2821834349,766784016),o(2952996808,2566594879),o(3210313671,3203337956),o(3336571891,1034457026),o(3584528711,2466948901),o(113926993,3758326383),o(338241895,168717936),o(666307205,1188179964),o(773529912,1546045734),o(1294757372,1522805485),o(1396182291,2643833823),o(1695183700,2343527390),o(1986661051,1014477480),o(2177026350,1206759142),o(2456956037,344077627),o(2730485921,1290863460),o(2820302411,3158454273),o(3259730800,3505952657),o(3345764771,106217008),o(3516065817,3606008344),o(3600352804,1432725776),o(4094571909,1467031594),o(275423344,851169720),o(430227734,3100823752),o(506948616,1363258195),o(659060556,3750685593),o(883997877,3785050280),o(958139571,3318307427),o(1322822218,3812723403),o(1537002063,2003034995),o(1747873779,3602036899),o(1955562222,1575990012),o(2024104815,1125592928),o(2227730452,2716904306),o(2361852424,442776044),o(2428436474,593698344),o(2756734187,3733110249),o(3204031479,2999351573),o(3329325298,3815920427),o(3391569614,3928383900),o(3515267271,566280711),o(3940187606,3454069534),o(4118630271,4000239992),o(116418474,1914138554),o(174292421,2731055270),o(289380356,3203993006),o(460393269,320620315),o(685471733,587496836),o(852142971,1086792851),o(1017036298,365543100),o(1126000580,2618297676),o(1288033470,3409855158),o(1501505948,4234509866),o(1607167915,987167468),o(1816402316,1246189591)],e1=[];!function(){for(var t=0;t<80;t++)e1[t]=o()}();r=r.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,y=o.low,v=s.high,g=s.low,B=c.high,w=c.low,k=a.high,m=a.low,S=h.high,x=h.low,b=l.high,r=l.low,A=f,H=d,z=u,C=p,D=_,E=y,R=v,M=g,F=B,P=w,W=k,O=m,I=S,U=x,K=b,X=r,L=0;L<80;L++){var j,T,N=e1[L];L<16?(T=N.high=0|t[e+2*L],j=N.low=0|t[e+2*L+1]):($=(q=e1[L-15]).high,J=q.low,G=(Q=e1[L-2]).high,V=Q.low,Z=(Y=e1[L-7]).high,q=Y.low,Y=(Q=e1[L-16]).high,T=(T=(($>>>1|J<<31)^($>>>8|J<<24)^$>>>7)+Z+((j=(Z=(J>>>1|$<<31)^(J>>>8|$<<24)^(J>>>7|$<<25))+q)>>>0>>0?1:0))+((G>>>19|V<<13)^(G<<3|V>>>29)^G>>>6)+((j+=J=(V>>>19|G<<13)^(V<<3|G>>>29)^(V>>>6|G<<26))>>>0>>0?1:0),j+=$=Q.low,N.high=T=T+Y+(j>>>0<$>>>0?1:0),N.low=j);var q=F&W^~F&I,Z=P&O^~P&U,V=A&z^A&D^z&D,G=(H>>>28|A<<4)^(H<<30|A>>>2)^(H<<25|A>>>7),J=t1[L],Q=J.high,Y=J.low,$=X+((P>>>14|F<<18)^(P>>>18|F<<14)^(P<<23|F>>>9)),N=K+((F>>>14|P<<18)^(F>>>18|P<<14)^(F<<23|P>>>9))+($>>>0>>0?1:0),J=G+(H&C^H&E^C&E),K=I,X=U,I=W,U=O,W=F,O=P,F=R+(N=(N=(N=N+q+(($=$+Z)>>>0>>0?1:0))+Q+(($=$+Y)>>>0>>0?1:0))+T+(($=$+j)>>>0>>0?1:0))+((P=M+$|0)>>>0>>0?1:0)|0,R=D,M=E,D=z,E=C,z=A,C=H,A=N+(((A>>>28|H<<4)^(A<<30|H>>>2)^(A<<25|H>>>7))+V+(J>>>0>>0?1:0))+((H=$+J|0)>>>0<$>>>0?1:0)|0}d=i.low=d+H,i.high=f+A+(d>>>0>>0?1:0),p=n.low=p+C,n.high=u+z+(p>>>0>>0?1:0),y=o.low=y+E,o.high=_+D+(y>>>0>>0?1:0),g=s.low=g+M,s.high=v+R+(g>>>0>>0?1:0),w=c.low=w+P,c.high=B+F+(w>>>0

    >>0?1:0),m=a.low=m+O,a.high=k+W+(m>>>0>>0?1:0),x=h.low=x+U,h.high=S+I+(x>>>0>>0?1:0),r=l.low=r+X,l.high=b+K+(r>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(r),t.HmacSHA512=e._createHmacHelper(r)}(),P=(M=U).x64,c=P.Word,f=P.WordArray,P=M.algo,d=P.SHA512,P=P.SHA384=d.extend({_doReset:function(){this._hash=new f.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var t=d._doFinalize.call(this);return t.sigBytes-=16,t}}),M.SHA384=d._createHelper(P),M.HmacSHA384=d._createHmacHelper(P),function(l){var t=U,e=t.lib,f=e.WordArray,i=e.Hasher,d=t.x64.Word,e=t.algo,A=[],H=[],z=[];!function(){for(var t=1,e=0,r=0;r<24;r++){A[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)H[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s,c=0,a=0,h=0;h<7;h++)1&n&&((s=(1<>>24)|4278255360&(o<<24|o>>>8);(m=r[n]).high^=s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),m.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++)h^=(m=r[a+5*f]).high,l^=m.low;var d=C[a];d.high=h,d.low=l}for(a=0;a<5;a++)for(var u=C[(a+4)%5],p=C[(a+1)%5],_=p.high,p=p.low,h=u.high^(_<<1|p>>>31),l=u.low^(p<<1|_>>>31),f=0;f<5;f++)(m=r[a+5*f]).high^=h,m.low^=l;for(var y=1;y<25;y++){var v=(m=r[y]).high,g=m.low,B=A[y];l=B<32?(h=v<>>32-B,g<>>32-B):(h=g<>>64-B,v<>>64-B);B=C[H[y]];B.high=h,B.low=l}var w=C[0],k=r[0];w.high=k.high,w.low=k.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var m=r[y=a+5*f],S=C[y],x=C[(a+1)%5+5*f],b=C[(a+2)%5+5*f];m.high=S.high^~x.high&b.high,m.low=S.low^~x.low&b.low}m=r[0],k=z[c];m.high^=k.high,m.low^=k.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(l.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,e=this.cfg.outputLength/8,o=e/8,s=[],c=0;c>>24)|4278255360&(h<<24|h>>>8);s.push(a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)),s.push(h)}return new f.init(s,e)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(e),t.HmacSHA3=i._createHmacHelper(e)}(Math),Math,F=(w=U).lib,u=F.WordArray,p=F.Hasher,F=w.algo,S=u.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=u.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=u.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=u.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),H=u.create([0,1518500249,1859775393,2400959708,2840853838]),z=u.create([1352829926,1548603684,1836072691,2053994217,0]),F=F.RIPEMD160=p.extend({_doReset:function(){this._hash=u.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}for(var o,s,c,a,h,l,f=this._hash.words,d=H.words,u=z.words,p=S.words,_=x.words,y=b.words,v=A.words,g=o=f[0],B=s=f[1],w=c=f[2],k=a=f[3],m=h=f[4],r=0;r<80;r+=1)l=o+t[e+p[r]]|0,l+=r<16?(s^c^a)+d[0]:r<32?K(s,c,a)+d[1]:r<48?((s|~c)^a)+d[2]:r<64?X(s,c,a)+d[3]:(s^(c|~a))+d[4],l=(l=L(l|=0,y[r]))+h|0,o=h,h=a,a=L(c,10),c=s,s=l,l=g+t[e+_[r]]|0,l+=r<16?(B^(w|~k))+u[0]:r<32?X(B,w,k)+u[1]:r<48?((B|~w)^k)+u[2]:r<64?K(B,w,k)+u[3]:(B^w^k)+u[4],l=(l=L(l|=0,v[r]))+m|0,g=m,m=k,k=L(w,10),w=B,B=l;l=f[1]+c+k|0,f[1]=f[2]+a+m|0,f[2]=f[3]+h+g|0,f[3]=f[4]+o+B|0,f[4]=f[0]+s+w|0,f[0]=l},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,n=e.words,o=0;o<5;o++){var s=n[o];n[o]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return e},clone:function(){var t=p.clone.call(this);return t._hash=this._hash.clone(),t}}),w.RIPEMD160=p._createHelper(F),w.HmacRIPEMD160=p._createHmacHelper(F),P=(M=U).lib.Base,_=M.enc.Utf8,M.algo.HMAC=P.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;(e=e.sigBytes>i?t.finalize(e):e).clamp();for(var t=this._oKey=e.clone(),e=this._iKey=e.clone(),n=t.words,o=e.words,s=0;s>>2];t.sigBytes-=e}},d=(e.BlockCipher=a.extend({cfg:a.cfg.extend({mode:n,padding:l}),reset:function(){var t;a.reset.call(this);var e=this.cfg,r=e.iv,e=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=e.createEncryptor:(t=e.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(e,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),l=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,t=t.salt,e=t?s.create([1398893684,1701076831]).concat(t).concat(e):e;return e.toString(o)},parse:function(t){var e,r=o.parse(t),t=r.words;return 1398893684==t[0]&&1701076831==t[1]&&(e=s.create(t.slice(2,4)),t.splice(0,4),r.sigBytes-=16),d.create({ciphertext:r,salt:e})}},u=e.SerializableCipher=r.extend({cfg:r.extend({format:l}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),e=n.finalize(e),n=n.cfg;return d.create({ciphertext:e,key:r,iv:n.iv,algorithm:t,mode:n.mode,padding:n.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),t=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||s.random(8);t=c.create({keySize:e+r}).compute(t,i),r=s.create(t.words.slice(e),4*r);return t.sigBytes=4*e,d.create({key:t,iv:r,salt:i})}},p=e.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:t}),encrypt:function(t,e,r,i){r=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=r.iv;i=u.encrypt.call(this,t,e,r.key,i);return i.mixIn(r),i},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);r=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=r.iv,u.decrypt.call(this,t,e,r.key,i)}})}(),U.mode.CFB=((F=U.lib.BlockCipherMode.extend()).Encryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;j.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),F.Decryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);j.call(this,t,e,i,r),this._prevBlock=n}}),F),U.mode.CTR=(M=U.lib.BlockCipherMode.extend(),P=M.Encryptor=M.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c>>2]|=e<<24-r%4*8,t.sigBytes+=e},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso10126={pad:function(t,e){e*=4,e-=t.sigBytes%e;t.concat(U.lib.WordArray.random(e-1)).concat(U.lib.WordArray.create([e<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso97971={pad:function(t,e){t.concat(U.lib.WordArray.create([2147483648],1)),U.pad.ZeroPadding.pad(t,e)},unpad:function(t){U.pad.ZeroPadding.unpad(t),t.sigBytes--}},U.pad.ZeroPadding={pad:function(t,e){e*=4;t.clamp(),t.sigBytes+=e-(t.sigBytes%e||e)},unpad:function(t){for(var e=t.words,r=t.sigBytes-1,r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},U.pad.NoPadding={pad:function(){},unpad:function(){}},m=(P=U).lib.CipherParams,C=P.enc.Hex,P.format.Hex={stringify:function(t){return t.ciphertext.toString(C)},parse:function(t){t=C.parse(t);return m.create({ciphertext:t})}},function(){var t=U,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],y=[],v=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=0,i=0,e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;h[r]=n=n>>>8^255&n^99;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a,_[n]=(a=16843009*c^65537*s^257*o^16843008*r)<<24|a>>>8,y[n]=a<<16|a>>>16,v[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],r=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^y[h[a>>>16&255]]^v[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,y,v,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],y=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],v=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++],h=_,l=y,f=v,d=g;_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],y=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],v=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=y,t[e+2]=v,t[e+3]=g},keySize:8});t.AES=e._createHelper(r)}(),function(){var t=U,e=t.lib,i=e.WordArray,r=e.BlockCipher,e=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],n=e.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){for(var s=n[o]=[],c=f[o],r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}for(var a=this._invSubKeys=[],r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){e=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=e,this._lBlock^=e<>>t^this._lBlock)&e;this._lBlock^=e,this._rBlock^=e<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),t=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=n.createEncryptor(i.create(e)),this._des2=n.createEncryptor(i.create(r)),this._des3=n.createEncryptor(i.create(t))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(e)}(),function(){var t=U,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;for(var n=0,o=0;n<256;n++){var s=n%r,s=e[s>>>2]>>>24-s%4*8&255,o=(o+i[n]+s)%256,s=i[n];i[n]=i[o],i[o]=s}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){var r=(r+t[e=(e+1)%256])%256,o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);r=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);for(var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],r=this._b=0;r<4;r++)N.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),s=e>>>16|4294901760&o,c=o<<16|65535&e;n[0]^=e,n[1]^=s,n[2]^=o,n[3]^=c,n[4]^=e,n[5]^=s,n[6]^=o,n[7]^=c;for(r=0;r<4;r++)N.call(this)}},_doProcessBlock:function(t,e){var r=this._X;N.call(this),D[0]=r[0]^r[5]>>>16^r[3]<<16,D[1]=r[2]^r[7]>>>16^r[5]<<16,D[2]=r[4]^r[1]>>>16^r[7]<<16,D[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)D[i]=16711935&(D[i]<<8|D[i]>>>24)|4278255360&(D[i]<<24|D[i]>>>8),t[e+i]^=D[i]},blockSize:4,ivSize:2}),M.Rabbit=F._createHelper(P),F=(M=U).lib.StreamCipher,P=M.algo,W=[],O=[],I=[],P=P.RabbitLegacy=F.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)q.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],t=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(t<<8|t>>>24)|4278255360&(t<<24|t>>>8),s=e>>>16|4294901760&o,t=o<<16|65535&e;i[0]^=e,i[1]^=s,i[2]^=o,i[3]^=t,i[4]^=e,i[5]^=s,i[6]^=o,i[7]^=t;for(n=0;n<4;n++)q.call(this)}},_doProcessBlock:function(t,e){var r=this._X;q.call(this),W[0]=r[0]^r[5]>>>16^r[3]<<16,W[1]=r[2]^r[7]>>>16^r[5]<<16,W[2]=r[4]^r[1]>>>16^r[7]<<16,W[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)W[i]=16711935&(W[i]<<8|W[i]>>>24)|4278255360&(W[i]<<24|W[i]>>>8),t[e+i]^=W[i]},blockSize:4,ivSize:2}),M.RabbitLegacy=F._createHelper(P),U}); \ No newline at end of file diff --git a/docs/updateRecord.md b/docs/updateRecord.md index 3788f10..1acf857 100644 --- a/docs/updateRecord.md +++ b/docs/updateRecord.md @@ -1,4 +1,32 @@ # drpyS更新记录 + +### 20250310 + +更新至V1.1.23 + +1. 修复番茄小说 +2. 新增2个源 + +### 20250227 + +更新至V1.1.22 + +1. 优化123网盘的逻辑和推送示例 +2. 优化sqlite3库兼容装逼壳 + +### 20250226 + +更新至V1.1.21 + +1. 增加123网盘的逻辑和推送示例 + +### 20250225 + +更新至V1.1.20 + +1. UC整体逻辑修改,并在扫码插件增加了UC_TOKEN扫码逻辑 +2. 数据库sqlite3优化,寻找另一个wasm实现的库平替了兼容性极差的sqlite3原生库 + ### 20250224 更新至V1.1.19 @@ -6,9 +34,10 @@ 1. 修复 推送和所有网盘源涉及的UC播放问题,支持原代本和原代服务加速 2. 更新猫爪的 alist.js 3. 新增 `sqlite` `sqlite3` 依赖,在ds源里的异步方法里直接使用,示例: + ```javascript await database.startDb(); -console.log('database:',database); +console.log('database:', database); const db = database.db; // 创建表 await db.run(` diff --git a/js/gaze.js b/js/gaze.js new file mode 100644 index 0000000..c210c0e --- /dev/null +++ b/js/gaze.js @@ -0,0 +1,591 @@ +globalThis.window = globalThis.global = globalThis; + +class Go { + constructor() { + let s = new TextEncoder("utf-8"), + i = new TextDecoder("utf-8"), + r = new DataView(new ArrayBuffer(8)); + var o = []; + + this._callbackTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + let e = () => new DataView(this._inst.exports.m.buffer); + let t = (e) => { + r.setBigInt64(0, e, !0); + let t = r.getFloat64(0, !0); + if (0 === t) return; + if (!isNaN(t)) return t; + let n = 4294967295n & e; + return this._values[n]; + }; + let n = (n) => { + let s = e().getBigUint64(n, !0); + return t(s); + }; + let l = (e) => { + if ("number" == typeof e) + return isNaN(e) + ? 2146959360n << 32n + : 0 === e + ? (2146959360n << 32n) | 1n + : (r.setFloat64(0, e, !0), r.getBigInt64(0, !0)); + switch (e) { + case void 0: + return 0n; + case null: + return (2146959360n << 32n) | 2n; + case !0: + return (2146959360n << 32n) | 3n; + case !1: + return (2146959360n << 32n) | 4n; + } + let t = this._ids.get(e); + void 0 === t && + (void 0 === (t = this._idPool.pop()) && + (t = BigInt(this._values.length)), + (this._values[t] = e), + (this._goRefCounts[t] = 0), + this._ids.set(e, t)), + this._goRefCounts[t]++; + let n = 1n; + switch (typeof e) { + case "string": + n = 2n; + break; + case "symbol": + n = 3n; + break; + case "function": + n = 4n; + } + return t | ((2146959360n | n) << 32n); + }; + let a = (t, n) => { + let s = l(n); + e().setBigUint64(t, s, !0); + }; + let c = (e, t, n) => new Uint8Array(this._inst.exports.m.buffer, e, t); + let $ = (e, t, s) => { + let i = Array(t); + for (let r = 0; r < t; r++) i[r] = n(e + 8 * r); + return i; + }; + let d = (e, t) => i.decode(new DataView(this._inst.exports.m.buffer, e, t)); + let u = Date.now() - performance.now(); + this.importObject = { + wasi_snapshot_preview1: { + fd_write: function (t, n, s, r) { + let l = 0; + if (1 == t) + for (let a = 0; a < s; a++) { + let c = n + 8 * a, + $ = e().getUint32(c + 0, !0), + d = e().getUint32(c + 4, !0); + l += d; + for (let u = 0; u < d; u++) { + let f = e().getUint8($ + u); + if (13 == f); + else if (10 == f) { + let h = i.decode(new Uint8Array(o)); + (o = []), console.log(h); + } else o.push(f); + } + } + else console.error("invalid file descriptor:", t); + return e().setUint32(r, l, !0), 0; + }, + fd_close: () => 0, + fd_fdstat_get: () => 0, + fd_seek: () => 0, + proc_exit(e) { + if (globalThis.process) process.exit(e); + else throw "trying to exit with code " + e; + }, + random_get: (e, t) => (crypto.getRandomValues(c(e, t)), 0), + }, + a: { + "runtime.ticks": () => u + performance.now(), + "runtime.sleepTicks": (e) => { + setTimeout(this._inst.exports.t, e); + }, + d(e) { + console.error("d not implemented"); + }, + e(e, t) { + let n = d(e, t); + return l(n); + }, + a(e, n, s) { + let i = d(n, s), + r = t(e), + o = Reflect.get(r, i); + return l(o); + }, + f(e, n, s, i) { + let r = t(e), + o = d(n, s), + l = t(i); + Reflect.set(r, o, l); + }, + "syscall/js.valueDelete"(e, n, s) { + let i = t(e), + r = d(n, s); + Reflect.deleteProperty(i, r); + }, + i: (e, n) => l(Reflect.get(t(e), n)), + fIndex(e, n, s) { + Reflect.set(t(e), n, t(s)); + }, + j(n, s, i, r, o, l, c) { + let u = t(s), + f = d(i, r), + h = $(o, l, c); + try { + let g = Reflect.get(u, f); + a(n, Reflect.apply(g, u, h)), e().setUint8(n + 8, 1); + } catch (p) { + a(n, p), e().setUint8(n + 8, 0); + } + }, + "syscall/js.valueInvoke"(n, s, i, r, o) { + try { + let l = t(s), + c = $(i, r, o); + a(n, Reflect.apply(l, void 0, c)), e().setUint8(n + 8, 1); + } catch (d) { + a(n, d), e().setUint8(n + 8, 0); + } + }, + g(n, s, i, r, o) { + let l = t(s), + c = $(i, r, o); + try { + a(n, Reflect.construct(l, c)), e().setUint8(n + 8, 1); + } catch (d) { + a(n, d), e().setUint8(n + 8, 0); + } + }, + h: (e) => t(e).length, + b(n, i) { + let r = String(t(i)), + o = s.encode(r); + a(n, o), e().setInt32(n + 8, o.length, !0); + }, + c(e, n, s, i) { + let r = t(e); + c(n, s, i).set(r); + }, + "syscall/js.valueInstanceOf": (e, n) => t(e) instanceof t(n), + k(n, s, i, r, o) { + let l = n + 4, + a = c(s, i), + $ = t(o); + if (!($ instanceof Uint8Array || $ instanceof Uint8ClampedArray)) { + e().setUint8(l, 0); + return; + } + let d = $.subarray(0, a.length); + a.set(d), e().setUint32(n, d.length, !0), e().setUint8(l, 1); + }, + l(n, s, i, r, o) { + let l = n + 4, + a = t(s), + $ = c(i, r); + if (!(a instanceof Uint8Array || a instanceof Uint8ClampedArray)) { + e().setUint8(l, 0); + return; + } + let d = $.subarray(0, a.length); + a.set(d), e().setUint32(n, d.length, !0), e().setUint8(l, 1); + }, + }, + }; + this.importObject.env = this.importObject.a; + } + async run(instance) { + this._inst = instance; + this._values = [NaN, 0, null, true, false, globalThis, this]; + this._goRefCounts = []; + this._ids = new Map(); + this._idPool = []; + this.exited = false; + while (true) { + const resumePromise = new Promise((resolve) => { + this._resolveCallbackPromise = () => { + if (this.exited) { + throw new Error("bad callback: Go program has already exited"); + } + setTimeout(resolve, 0); + }; + }); + + this._inst.exports.r(); + if (this.exited) break; + + await resumePromise; + } + } + _resume() { + if (this.exited) { + throw new Error("Go program has already exited"); + } + this._inst.exports.s(); + if (this.exited) { + this._resolveExitPromise(); + } + } + _makeFuncWrapper(funcId) { + const self = this; + return function () { + const event = { + id: funcId, + this: this, + args: arguments, + }; + self._pendingEvent = event; + self._resume(); + const result = event.result; + return result; + }; + } +} + +const decryptor = (() => { + let wasmInstance = null; + let go = new Go(); + + const pedanticAe = function (buffer) { + const decompressedSync = zlib.brotliDecompressSync(buffer); + return decompressedSync; + }; + const initWASM = async (func) => { + const wasmBuffer = await fetchWASM(); + const { instance } = await WebAssembly.instantiate( + wasmBuffer, + go.importObject + ); + wasmInstance = instance; + go.run(instance); + }; + const fetchWASM = async () => { + const response = await axios.get( + "https://temp-rs-1257790209.cos.ap-chengdu.myqcloud.com/IceDespair-V2.6.svg", + { + responseType: "arraybuffer", + headers: { + "Content-Type": "application/wasm", + }, + } + ); + return pedanticAe(new Uint8Array(response.data)); + }; + const parseUrlParams = (url) => { + const params = {}; + const queryString = url.split("?")[1]; + if (!queryString) return params; + + queryString.split("-").forEach((pair) => { + const [key, value] = pair.split("="); + if (key && value) params[key] = decodeURIComponent(value); + }); + return params; + }; + const getWasmFunc = (name, mid, key) => { + return window[ + bytesToString(window["DimGive"](name, mid, decodeURIComponent(key))) + ]; + }; + const decryptDataM3u = async (bytes, sign, mid, key) => { + if (!wasmInstance) await initWASM(); + const result = getWasmFunc("nihilism", mid, key)( + bytes, + sign, + mid, + decodeURIComponent(key) + ); + return bytesToString(pedanticAe(result)); + }; + const decryptData = async (data, mid, key) => { + if (!wasmInstance) await initWASM(); + const result = getWasmFunc("8069", mid, key)( + data, + mid, + decodeURIComponent(key) + ); + return bytesToString(result); + }; + const decryptStream = async (data, mid, key, url) => { + if (!url.includes("gazes_v-@_info")) return url; + const istr = url.split("/").at(-1); + const ungzipped = pako.ungzip(data, { + to: "string", + }); + const bytes = processBytes(CryptoJS.enc.Base64.parse(ungzipped)); + const sign = CryptoJS.MD5( + `${istr}- are we anti-socialists? against the government? spies? traitor? fresh blood? no, we are just weak, sick bystanders; we just need to rot little by little with formalism until we finally become food for new shoots. ` + ) + .toString() + .substring(8, 24); + return decryptDataM3u(bytes, sign, mid, key); + }; + const processBytes = (base64Data) => { + return Uint8Array.from( + { + length: base64Data.sigBytes, + }, + (_, i) => (base64Data.words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff + ); + }; + const bytesToString = (byteArray) => { + return String.fromCharCode.apply(null, byteArray); + }; + const decryptPlay = async (playUrl, src) => { + const params = parseUrlParams(playUrl); + const encryptedSrc = src; + const decryptedLink = await decryptData( + Uint8Array.from(atob(encryptedSrc), (c) => c.charCodeAt(0)), + params.mid, + params[Object.keys(params).at(-1)] + ); + return decryptedLink; + }; + const decryptM3u8 = async (playUrl, src, decryptedLink) => { + const params = parseUrlParams(playUrl); + const encryptedSrc = src; + const { data } = await axios.get(decryptedLink, { + responseType: "arraybuffer", + }); + const m3u8 = await decryptStream( + data, + params.mid, + params[Object.keys(params).at(-1)], + decryptedLink + ); + return m3u8; + }; + return { + decryptM3u8, + decryptPlay, + parseUrlParams, + }; +})(); + +var rule = { + 类型: "影视", + title: "GAZE", + desc: "源动力+L佬+秋秋+嗷呜 联合出品", + host: "https://gaze.run", + url: "/filter_movielist", + searchUrl: "/filter_movielist", + searchable: 2, + quickSearch: 0, + timeout: 5000, + play_parse: true, + filterable: 0, + class_name: "电影&剧集&番剧&国漫", + class_url: "1&2&bangumi&chinese_cartoon", + headers: { + "User-Agent": PC_UA, + Origin: "https://gaze.run", + }, + 预处理: async () => { + await rule.dealHeaders(); + }, + 推荐: async function (tid, pg, filter, extend) { + const { input, pdfa, pdfh, pd } = this; + const html = await request(input); + const d = []; + const data = pdfa(html, ".row .card"); + data.forEach((it) => { + d.push({ + title: pdfh(it, ".card-body .card-title&&Text"), + pic_url: pdfh(it, ".view img.load-imgs&&data-src"), + desc: pdfh(it, ".view .dbadge-box .badge-default&&Text"), + url: pdfh(it, ".view a&&href").replace("play/", ""), + }); + }); + return setResult(d); + }, + 一级: async function (tid, pg, filter, extend) { + const { input } = this; + const html = await request(input, { + method: "POST", + headers: { + ...this.headers, + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + data: { + mform: tid, + mcountry: "all", + "tag_arr[]": "all", + album: "all", + years: "all", + sort: "updatetime", + title: "", + page: pg, + }, + }); + const resp = JSON.parse(html); + const d = []; + resp.mlist.forEach((it) => { + d.push({ + title: it.title, + pic_url: it.cover_img, + desc: `${it.grade}|${it.definition}`, + url: it.mid, + }); + }); + return setResult(d); + }, + 二级: async function (ids) { + const { input, pdfa, pdfh, pd } = this; + const html = await request(`${this.host}/play/${ids[0]}`, { + headers: this.headers, + }); + const vod = { + vod_id: ids[0], + vod_name: pdfh(html, ".row.p-2 img&&alt"), + vod_pic: pdfh(html, ".row.p-2 img&&src"), + type_name: pdfa(html, ".row.p-2 a") + .map((it) => pdfh(it, "a&&Text")) + .join("/"), + vod_remarks: pdfh(html, ".row.p-2 h5:eq(-1)&&Text"), + vod_year: pdfh(html, ".row.p-2 a:eq(-1)&&Text"), + vod_area: pdfh(html, ".row.p-2 a:eq(-2)&&Text"), + vod_content: pdfh(html, ".row.p-2 p&&Text"), + vod_play_from: "源动力偷的线路", + vod_play_url: pdfa(html, ".col-md-12&&.sbtn-block") + .map( + (it) => + `${pdfh(it, "button--i&&Text").trim()}$${ids[0]}|${pdfh( + it, + "button&&data-src" + )}` + ) + .join("#"), + }; + return vod; + }, + 搜索: async function (wd, quick, pg) { + const { input } = this; + const html = await request(input, { + method: "POST", + headers: { + ...this.headers, + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + }, + data: { + mform: "all", + mcountry: "all", + "tag_arr[]": "all", + album: "all", + years: "all", + sort: "updatetime", + title: wd, + page: pg, + }, + }); + const resp = JSON.parse(html); + const d = []; + resp.mlist.forEach((it) => { + d.push({ + title: it.title, + pic_url: it.cover_img, + desc: `${it.grade}|${it.definition}`, + url: it.mid, + }); + }); + return setResult(d); + }, + lazy: async function (flag, id, flags) { + const { pdfa, pdfh } = this; + const [data_id, data_src] = id.split("|"); + const sourceReqUrl = `${this.host}/play/${data_id}`; + console.warn(data_id, data_src); + const source = await axios.get(sourceReqUrl, { headers: this.headers }); + const script = pdfa(source.data, "script"); + const scriptContent = script.filter((e) => + e.includes("configs-n26.1.js") + )[0]; + const sourceUrl = pdfh(scriptContent, "script&&src"); + console.warn("sourceUrl", sourceUrl); + + let play = await decryptor.decryptPlay(sourceUrl, data_src); + + if (play.includes("gazes_v-@_info")) { + return { + parse: 0, + url: + getProxyUrl() + + "&playdata=" + + encodeURIComponent(JSON.stringify([sourceUrl, data_src, play])) + + "&t=0", + }; + } else { + if (play.includes("cloud.189.cn")) { + let js_data = decryptor.parseUrlParams(sourceUrl); + const thirdKey = Object.keys(js_data)[2]; + + try { + const re_link = await axios.post( + `${this.host}/fetch_189c_murl`, + { + urls: play, + mid: js_data.mid, + }, + { + headers: { + "Content-Type": + "application/x-www-form-urlencoded; charset=UTF-8", + Accept: "*/*", + Origin: this, + [thirdKey]: encodeURIComponent(js_data[thirdKey]), + Cookie: source.headers["set-cookie"] + .map((it) => it.split(";")[0]) + .join(";"), + }, + } + ); + console.log("API Response:", re_link.data); + play = re_link.data?.url; + } catch (error) { + console.error("Request Failed:", error); + } + } + return { + parse: 0, + url: play, + }; + } + }, + proxy_rule: async function (params) { + try { + const segments = JSON.parse(decodeURIComponent(params.playdata)); + let [sourceUrl, data_src, play] = segments; + console.log(segments); + + let m3u8 = await decryptor.decryptM3u8(sourceUrl, data_src, play); + return [200, "text/text", m3u8]; + } catch (e) { + console.log(e); + } + }, + dealHeaders: async function () { + const resp = await axios.get(`${this.host}/filter`, { + headers: this.headers, + }); + // cookie 处理 + const headers = resp.headers; + const cookies = headers["set-cookie"]; + const cookie = cookies.map((item) => item.split(";")[0]).join("; "); + this.headers.Cookie = cookie; + // 请求头处理 + const html = resp.data; + const kv_macth = html.match(/'headers':({[^{}]*})/)[1]; + const kv_headers = new Function(`return ${kv_macth}`)(); + for (const key in kv_headers) { + this.headers[key] = kv_headers[key]; + } + console.warn("headers", this.headers); + }, +}; diff --git a/js/push_agent.js b/js/push_agent.js index be8b47f..d4b8167 100644 --- a/js/push_agent.js +++ b/js/push_agent.js @@ -25,8 +25,7 @@ var rule = { let vod = { vod_pic: icon, vod_id: orId, - vod_content: orId || '温馨提醒:宝子们,推送的时候记得确保ids存在哟~', - vod_name: 'DS推送:道长&秋秋倾情打造', + vod_content: 'DS推送:道长&秋秋倾情打造', } let playPans = []; if (/^[\[{]/.test(input.trim())) { @@ -56,7 +55,7 @@ var rule = { let list = input.split('@'); // log(list); for (let i = 0; i < list.length; i++) { - if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com/.test(list[i])) { + if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com|www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com/.test(list[i])) { if (/pan.quark.cn/.test(list[i])) { playPans.push(list[i]); const shareData = Quark.getShareData(list[i]); @@ -127,12 +126,24 @@ var rule = { playurls.push(urls); }) } + if(/www.123684.com|www.123865.com|www.123912.com/.test(list[i])) { + playPans.push(list[i]); + let shareData = await Pan.getShareData(list[i]) + let videos = await Pan.getFilesByShareUrl(shareData) + if (videos.length > 0) { + playform.push('Pan123-' + shareData); + playurls.push(videos.map((v) => { + const list = [v.ShareKey, v.FileId, v.S3KeyFlag, v.Size, v.Etag]; + return v.FileName + '$' + list.join('*'); + }).join('#')) + } + } } else { playform.push('推送'); playurls.push("推送" + '$' + list[i]) } } - } else if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com/.test(input)) { + } else if (/pan.quark.cn|drive.uc.cn|www.alipan.com|www.aliyundrive.com|cloud.189.cn|yun.139.com|www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com/.test(input)) { if (/pan.quark.cn/.test(input)) { playPans.push(input); const shareData = Quark.getShareData(input); @@ -203,6 +214,19 @@ var rule = { playurls.push(urls); }) } + if(/www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com/.test(input)) { + playPans.push(input); + let shareData = await Pan.getShareData(input) + let videos = await Pan.getFilesByShareUrl(shareData) + Object.keys(videos).forEach(it => { + playform.push('Pan123-' + it) + const urls = videos[it].map(v => { + const list = [v.ShareKey, v.FileId, v.S3KeyFlag, v.Size, v.Etag]; + return v.FileName + '$' + list.join('*'); + }).join('#'); + playurls.push(urls); + }) + } } else { playform.push('推送'); playurls.push("推送" + '$' + input) @@ -222,7 +246,7 @@ var rule = { } else { return {parse: 1, url: input} } - } else if (/Quark-|UC-|Ali-|Cloud-|Yun-/.test(flag)) { + } else if (/Quark-|UC-|Ali-|Cloud-|Yun-|Pan123-/.test(flag)) { const ids = input.split('*'); const urls = []; let UCDownloadingCache = {}; @@ -254,30 +278,13 @@ var rule = { } } if (flag.startsWith('UC-')) { - log("UC网盘解析开始") + console.log("UC网盘解析开始"); if (!UCDownloadingCache[ids[1]]) { const down = await UC.getDownload(ids[0], ids[1], ids[2], ids[3], true); if (down) UCDownloadingCache[ids[1]] = down; } - downUrl = UCDownloadingCache[ids[1]].download_url; - const headers = { - "Referer": "https://drive.uc.cn/", - "cookie": UC.cookie, - "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch' - }; - urls.push("UC原画", downUrl); - - urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers))); - if (ENV.get('play_local_proxy_type', '1') === '2') { - urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers))); - } else { - urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl)); - } - return { - parse: 0, - url: urls, - header: headers, - } + const downCache = UCDownloadingCache[ids[1]]; + return await UC.getLazyResult(downCache, mediaProxyUrl) } if (flag.startsWith('Ali-')) { const transcoding_flag = { @@ -321,8 +328,21 @@ var rule = { url: url } } + if(flag.startsWith('Pan123-')) { + log('盘123解析开始') + const url = await Pan.getDownload(ids[0],ids[1],ids[2],ids[3],ids[4]) + urls.push("原画",url) + let data = await Pan.getLiveTranscoding(ids[0],ids[1],ids[2],ids[3],ids[4]) + data.forEach((item) => { + urls.push(item.name,item.url) + }) + return { + parse: 0, + url: urls + } + } } else { return input } }, -} +} \ No newline at end of file diff --git "a/js/\345\205\250\346\260\221\350\277\275\345\211\247.js" "b/js/\345\205\250\346\260\221\350\277\275\345\211\247.js" new file mode 100644 index 0000000..b563217 --- /dev/null +++ "b/js/\345\205\250\346\260\221\350\277\275\345\211\247.js" @@ -0,0 +1,107 @@ +var rule = { + 类型:'影视', + title:'全民追剧', + desc:'不告诉你', + host:'https://jenzg.cn', + url: '/index.php/vod/showfyfilter.html[/index.php/vod/showfyclass.html]', + searchUrl: '/index.php/vod/search/page/fypage/wd/**.html', + searchable:1,quickSearch:1,double:false,timeout:5000,play_parse:true,filterable:1,invalid:true, + class_name:'电影&电视剧&综艺&动漫&短剧', + class_url:'/id/61&/id/79&/id/88&/id/93&/id/99', + filter_url:'{{fl.area}}{{fl.class}}{{fl.cateId}}/page/fypage{{fl.year}}', + filter_def:{'/id/61':{cateId:'/id/61'},'/id/79':{cateId:'/id/79'},'/id/88':{cateId:'/id/88'},'/id/93':{cateId:'/id/93'},'/id/99':{cateId:'/id/99'}}, + 预处理: async () => {return []}, + 推荐: async function (tid, pg, filter, extend) { + let homeFn = rule.一级.bind(this); + return await homeFn(); + }, + 一级: async function (tid, pg, filter, extend) { + let {input, pdfa, pdfh, pd} = this; + let html = await request(input); + let d = []; + let data = pdfa(html, '.module-items .module-item'); + data.forEach((it) => { + d.push({ + title: pdfh(it, 'a&&title'), + pic_url: pd(it, 'img&&data-src'), + desc: pdfh(it, '.module-item-text&&Text'), + url: pd(it, 'a&&href'), + }) + }); + return setResult(d) + }, + 二级: async function (ids) { + let {input, pdfa, pdfh, pd} = this; + let html = await request(input); + let VOD = {}; + VOD.vod_name = pdfh(html, 'h1&&Text');//名称 + VOD.vod_actor = pdfh(html, '.video-info-items:eq(1)&&Text');//演员 + VOD.vod_director = pdfh(html, '.video-info-items:eq(0)&&Text');//导演 + VOD.vod_remarks = pdfh(html, '');//备注 + VOD.vod_status = pdfh(html, '');//状态 + VOD.vod_content = pdfh(html, '.video-info-content&&Text');//简介 + let playlist = pdfa(html, '.module-list'); + let tabs = pdfa(html, '.module-tab&&.module-tab-item.tab-item'); + let playmap = {}; + tabs.map((item, i) => { + const form = pdfh(item, 'span&&Text'); + const list = playlist[i]; + const a = pdfa(list, 'body&&a:not(:contains(排序))'); + a.map((it) => { + let title = pdfh(it, 'a&&Text'); + let urls = pd(it, 'a&&href', input); + if (!playmap.hasOwnProperty(form)) { + playmap[form] = []; + } + playmap[form].push(title + "$" + urls); + }); + }); + VOD.vod_play_from = Object.keys(playmap).join('$$$'); + const urls = Object.values(playmap); + const playUrls = urls.map((urllist) => { + return urllist.join("#"); + }); + VOD.vod_play_url = playUrls.join('$$$'); + return VOD; + }, + 搜索: async function (wd, quick, pg) { + let {input, pdfa, pdfh, pd} = this; + let html = await request(input); + let d = []; + let data = pdfa(html, '.module-items .module-search-item'); + data.forEach((it) => { + d.push({ + title: pdfh(it, 'a&&title'), + pic_url: pd(it, 'img&&data-src'), + desc: pdfh(it, '.video-serial&&Text'), + url: pd(it, 'a&&href'), + content: pdfh(it, '.video-info-aux&&Text'), + }) + }); + return setResult(d); + }, + lazy: async function (flag, id, flags) { + let {input, pdfa, pdfh, pd} = this; + let html = await request(input); + html = JSON.parse(html.match(/r player_.*?=(.*?)

    drpyS(drpy-node)

    -

    nodejs作为服务端的drpy实现。全面升级异步写法
    积极开发中,每日一更,当前进度 48%
    找工作中,随缘更新

    +

    nodejs作为服务端的drpy实现。全面升级异步写法
    积极开发中,每日一更,当前进度 49%
    找工作中,随缘更新

    更新记录

    +

    20250310

    +

    更新至V1.1.23

    +

    20250227

    +

    更新至V1.1.22

    +

    20250226

    +

    更新至V1.1.21

    +

    20250225

    +

    更新至V1.1.20

    20250224

    更新至V1.1.19

    20250211

    diff --git a/utils/database.js b/utils/database.js index fa41812..a9f991f 100644 --- a/utils/database.js +++ b/utils/database.js @@ -1,66 +1,25 @@ -import sqlite3 from 'sqlite3' -import {open} from 'sqlite' +// 1️⃣ 导入时用别名重命名原模块的 Database +import pkg from 'node-sqlite3-wasm'; + +const {Database: SQLite3Database} = pkg; // 👈 关键别名 import {fileURLToPath} from "url"; import path from 'path'; -async function main() { - // 打开数据库(若不存在则创建) - const db = await open({ - filename: '../database.db', - driver: sqlite3.Database - }); - - // 创建表 - await db.run(` - CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL - ) - `); - - // 插入数据 - await db.run('INSERT INTO users (name) VALUES (?)', ['Alice']); - await db.run('INSERT INTO users (name) VALUES (?)', ['Bob']); - - // 查询数据 - const users = await db.all('SELECT * FROM users'); - console.log(users); - - // 更新数据 - await db.run('UPDATE users SET name = ? WHERE id = ?', ['Charlie', 1]); - - // 查询更新后的数据 - const updatedUsers = await db.all('SELECT * FROM users'); - console.log(updatedUsers); - - // 删除数据 - await db.run('DELETE FROM users WHERE id = ?', [2]); - - // 查询删除后的数据 - const finalUsers = await db.all('SELECT * FROM users'); - console.log(finalUsers); - - // 关闭数据库 - await db.close(); -} - -// main().catch(err => console.error(err)); +// 2️⃣ 定义你的自定义类(可继承/扩展/完全重写) export class DataBase { constructor(db_file) { this.db_file = db_file || './database.db'; this.db = null; } + // 自定义方法 async initDb() { const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const __rootPath = path.join(__dirname, '../'); const __dbpath = path.join(__rootPath, this.db_file); // console.log('__dbpath:', __dbpath); - const db = await open({ - filename: __dbpath, - driver: sqlite3.Database - }); + const db = new SQLite3Database(__dbpath); this.db = db; return db } @@ -79,4 +38,44 @@ export class DataBase { } } +async function main() { + // 打开数据库(若不存在则创建) + const db = new SQLite3Database("../database.db"); + + // 创建表 + db.run(` + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL + ) + `); + + // 插入数据 + db.run('INSERT INTO users (name) VALUES (?)', ['Alice']); + db.run('INSERT INTO users (name) VALUES (?)', ['Bob']); + + // 查询数据 + const users = db.all('SELECT * FROM users'); + console.log(users); + + // 更新数据 + db.run('UPDATE users SET name = ? WHERE id = ?', ['Charlie', 1]); + + // 查询更新后的数据 + const updatedUsers = db.all('SELECT * FROM users'); + console.log(updatedUsers); + + // 删除数据 + db.run('DELETE FROM users WHERE id = ?', [2]); + + // 查询删除后的数据 + const finalUsers = db.all('SELECT * FROM users'); + console.log(finalUsers); + + // 关闭数据库 + db.close(); +} + export const database = new DataBase('./database.db'); + +// main().catch(err => console.error(err)); diff --git a/utils/pan123.js b/utils/pan123.js new file mode 100644 index 0000000..ee04693 --- /dev/null +++ b/utils/pan123.js @@ -0,0 +1,236 @@ +import axios from "axios"; +import {ENV} from "./env.js"; +import {base64Decode} from "../libs_drpy/crypto-util.js"; + + +class Pan123 { + constructor() { + this.regex = /https:\/\/(www.123684.com|www.123865.com|www.123912.com|www.123pan.com|www.123pan.cn|www.123592.com)\/s\/([^\\/]+)/ + this.api = 'https://www.123684.com/b/api/share/'; + this.loginUrl = 'https://login.123pan.com/api/user/sign_in'; + this.cate = '' + } + + async init() { + if(this.passport){ + console.log("获取盘123账号成功") + } + if(this.password){ + console.log("获取盘123密码成功") + } + if(this.auth){ + let info = JSON.parse(CryptoJS.enc.Base64.parse(this.auth.split('.')[1]).toString(CryptoJS.enc.Utf8)) + if(info.exp > Math.floor(Date.now() / 1000)){ + console.log("登录成功") + }else { + console.log("登录过期,重新登录") + await this.loin() + } + }else { + console.log("尚未登录,开始登录") + await this.loin() + } + } + + get passport(){ + return ENV.get('pan_passport') + } + + get password(){ + return ENV.get('pan_password') + } + + get auth(){ + return ENV.get('pan_auth') + } + + async loin(){ + let data = JSON.stringify({ + "passport": this.passport, + "password": this.password, + "remember": true + }); + let config = { + method: 'POST', + url: this.loginUrl, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', + 'Content-Type': 'application/json', + 'App-Version': '43', + 'Referer': 'https://login.123pan.com/centerlogin?redirect_url=https%3A%2F%2Fwww.123684.com&source_page=website', + }, + data: data + }; + + let auth = (await axios.request(config)).data + ENV.set('pan_auth',auth.data.token) + } + + getShareData(url){ + url = decodeURIComponent(url); + const matches = this.regex.exec(url); + if(url.indexOf('?') > 0){ + this.SharePwd = url.split('?')[1].match(/[A-Za-z0-9]+/)[0]; + console.log(this.SharePwd) + } + if (matches) { + if(matches[2].indexOf('?') > 0){ + return matches[2].split('?')[0] + }else { + return matches[2].match(/www/g)?matches[1]:matches[2]; + } + + } + return null; + } + + async getFilesByShareUrl(shareKey){ + let file = {} + let cate = await this.getShareInfo(shareKey, this.SharePwd, 0, 0) + if(cate && Array.isArray(cate)){ + await Promise.all(cate.map(async (item) => { + if (!(item.filename in file)) { + file[item.filename] = []; + } + const fileData = await this.getShareList(item.shareKey,item.SharePwd,item.next, item.fileId); + if (fileData && fileData.length > 0) { + file[item.filename].push(...fileData); + } + })); + } + // 过滤掉空数组 + for (let key in file) { + if (file[key].length === 0) { + delete file[key]; + } + } + return file; + } + + async getShareInfo(shareKey,SharePwd,next,ParentFileId) { + let cate = [] + let list = await axios.get(this.api+"get",{ + headers: {}, + params: { + "limit": "100", + "next": next, + "orderBy": "file_name", + "orderDirection": "asc", + "shareKey": shareKey, + "SharePwd": SharePwd, + "ParentFileId": ParentFileId, + "Page": "1" + } + }); + if(list.status === 200){ + if(list.data.code === 5103){ + console.log(list.data.message); + }else { + let info = list.data.data; + let next = info.Next; + let infoList = info.InfoList + infoList.forEach(item => { + if(item.Category === 0){ + cate.push({ + filename:item.FileName, + shareKey:shareKey, + SharePwd:SharePwd, + next:next, + fileId:item.FileId + }); + } + }) + let result = await Promise.all(cate.map(async (it)=> this.getShareInfo(shareKey,SharePwd,next, it.fileId))); + result = result.filter(item => item !== undefined && item !== null); + return [...cate,...result.flat()]; + } + } + } + + async getShareList(shareKey,SharePwd,next,ParentFileId) { + let video = [] + let infoList = (await axios.get(this.api+"get",{ + headers: {}, + params: { + "limit": "100", + "next": next, + "orderBy": "file_name", + "orderDirection": "asc", + "shareKey": shareKey, + "SharePwd": SharePwd, + "ParentFileId": ParentFileId, + "Page": "1" + } + })).data.data.InfoList; + infoList.forEach(it=>{ + if(it.Category === 2){ + video.push({ + ShareKey: shareKey, + FileId: it.FileId, + S3KeyFlag: it.S3KeyFlag, + Size: it.Size, + Etag: it.Etag, + FileName: it.FileName, + }) + } + }) + return video; + } + + async getDownload(shareKey,FileId,S3KeyFlag,Size,Etag) { + await this.init(); + let data = JSON.stringify({ + "ShareKey": shareKey, + "FileID": FileId, + "S3KeyFlag": S3KeyFlag, + "Size": Size, + "Etag": Etag + }); + let config = { + method: 'POST', + url: `${this.api}download/info`, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', + 'Authorization': `Bearer ${this.auth}`, + 'Content-Type': 'application/json;charset=UTF-8', + 'platform': 'android', + }, + data: data + }; + let down = (await axios.request(config)).data.data + return base64Decode((new URL(down.DownloadURL)).searchParams.get('params')); + } + + async getLiveTranscoding(shareKey,FileId,S3KeyFlag,Size,Etag){ + await this.init(); + let config = { + method: 'GET', + url: `https://www.123684.com/b/api/video/play/info`, + headers: { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36', + 'Authorization': `Bearer ${this.auth}`, + 'Content-Type': 'application/json;charset=UTF-8', + 'platform': 'android', + }, + params:{ + "etag": Etag, + "size": Size, + "from": "1", + "shareKey": shareKey + } + }; + let down = (await axios.request(config)).data.data.video_play_info + let videoinfo = [] + down.forEach(item => { + if(item.url!==''){ + videoinfo.push({ + name:item.resolution, + url:item.url + }) + } + }) + return videoinfo; + } +} + +export const Pan = new Pan123(); \ No newline at end of file diff --git a/utils/uc.js b/utils/uc.js index 483ef33..5eec95e 100644 --- a/utils/uc.js +++ b/utils/uc.js @@ -24,6 +24,19 @@ class UCHandler { this.maxCache = 1024 * 1024 * 100; this.urlHeadCache = {}; this.subtitleExts = ['.srt', '.ass', '.scc', '.stl', '.ttml']; + this.Addition = { + DeviceID: '07b48aaba8a739356ab8107b5e230ad4', + RefreshToken: '', + AccessToken: '' + } + this.conf = { + api: "https://open-api-drive.uc.cn", + clientID: "5acf882d27b74502b7040b0c65519aa7", + signKey: "l3srvtd7p42l0d0x1u8d7yc8ye9kki4d", + appVer: "1.6.8", + channel: "UCTVOFFICIALWEB", + codeApi: "http://api.extscreen.com/ucdrive", + }; } @@ -33,6 +46,10 @@ class UCHandler { return ENV.get('uc_cookie'); } + get token() { + return ENV.get('uc_token_cookie'); + } + getShareData(url) { let matches = this.regex.exec(url); if (matches[1].indexOf("?") > 0) { @@ -386,6 +403,19 @@ class UCHandler { } } + generateDeviceID(timestamp) { + return CryptoJS.MD5(timestamp).toString().slice(0, 16); // 取前16位 + } + + generateReqId(deviceID, timestamp) { + return CryptoJS.MD5(deviceID + timestamp).toString().slice(0, 16); + } + + generateXPanToken(method, pathname, timestamp, key) { + const data = method + '&' + pathname + '&' + timestamp + '&' + key; + return CryptoJS.SHA256(data).toString(); + } + async getDownload(shareId, stoken, fileId, fileToken, clean) { @@ -398,32 +428,85 @@ class UCHandler { this.saveFileIdCaches[fileId] = saveFileId; } + if (this.token) { + let video = [] + const pathname = '/file'; + const timestamp = Math.floor(Date.now() / 1000).toString() + '000'; // 13位时间戳需调整 + const deviceID = this.Addition.DeviceID || this.generateDeviceID(timestamp); + const reqId = this.generateReqId(deviceID, timestamp); + const x_pan_token = this.generateXPanToken("GET", pathname, timestamp, this.conf.signKey); + let config = { + method: 'GET', + url: `https://open-api-drive.uc.cn/file`, + params: { + req_id: reqId, + access_token: this.token, + app_ver: this.conf.appVer, + device_id: deviceID, + device_brand: 'Xiaomi', + platform: 'tv', + device_name: 'M2004J7AC', + device_model: 'M2004J7AC', + build_device: 'M2004J7AC', + build_product: 'M2004J7AC', + device_gpu: 'Adreno (TM) 550', + activity_rect: '{}', + channel: this.conf.channel, + method: "streaming", + group_by: "source", + fid: this.saveFileIdCaches[fileId], + resolution: "low,normal,high,super,2k,4k", + support: "dolby_vision" + }, + headers: { + 'User-Agent': 'Mozilla/5.0 (Linux; U; Android 9; zh-cn; RMX1931 Build/PQ3A.190605.05081124) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1', + 'Connection': 'Keep-Alive', + 'Accept-Encoding': 'gzip', + 'x-pan-tm': timestamp, + 'x-pan-token': x_pan_token, + 'content-type': 'text/plain;charset=UTF-8', + 'x-pan-client-id': this.conf.clientID + } + } + let req = await axios.request(config); + if (req.status === 200) { + let videoInfo = req.data.data.video_info + videoInfo.forEach((item) => { + video.push({ + name: item.resolution, + url: item.url + }) + }) + return video; + } + } else { + const down = await this.api(`file/download?${this.pr}`, { - const down = await this.api(`file/download?${this.pr}&sys=win32&ve=1.8.5&ut=Nk3UvPSOMurIrtiKrHXzCmx/iPIGIRI1HG5yX5zQL7ln7A%3D%3D`, { - - fids: [this.saveFileIdCaches[fileId]], + fids: [this.saveFileIdCaches[fileId]], - }); + }); - if (down.data) { - const low_url = down.data[0].download_url; - const low_cookie = this.cookie; - const low_headers = { - "Referer": "https://drive.uc.cn/", - "cookie": low_cookie, - "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch' - }; - // console.log('low_url:', low_url); - const test_result = await this.testSupport(low_url, low_headers); - // console.log('test_result:', test_result); - if (!test_result[0]) { - try { - await this.refreshUcCookie('getDownload'); - } catch (e) { - console.log(`getDownload:自动刷新UC cookie失败:${e.message}`) + if (down.data) { + const low_url = down.data[0].download_url; + const low_cookie = this.cookie; + const low_headers = { + "Referer": "https://drive.uc.cn/", + "cookie": low_cookie, + "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch' + }; + // console.log('low_url:', low_url); + const test_result = await this.testSupport(low_url, low_headers); + // console.log('test_result:', test_result); + if (!test_result[0]) { + try { + await this.refreshUcCookie('getDownload'); + } catch (e) { + console.log(`getDownload:自动刷新UC cookie失败:${e.message}`) + } } + return down.data[0]; } - return down.data[0]; + } @@ -431,6 +514,40 @@ class UCHandler { } + async getLazyResult(downCache, mediaProxyUrl) { + const urls = []; + + downCache.forEach((it) => { + urls.push(it.name, it.url); + }); + + return {parse: 0, url: urls} + + /* + // 旧的加速写法 + const downUrl = downCache.download_url; + const headers = { + "Referer": "https://drive.uc.cn/", + "cookie": this.cookie, + "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/2.5.20 Chrome/100.0.4896.160 Electron/18.3.5.4-b478491100 Safari/537.36 Channel/pckk_other_ch' + }; + urls.push("UC原画", downUrl); + urls.push("原代服", mediaProxyUrl + `?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers))); + if (ENV.get('play_local_proxy_type', '1') === '2') { + urls.push("原代本", `http://127.0.0.1:7777/?thread=${ENV.get('thread') || 6}&form=urlcode&randUa=1&url=` + encodeURIComponent(downUrl) + '&header=' + encodeURIComponent(JSON.stringify(headers))); + } else { + urls.push("原代本", `http://127.0.0.1:5575/proxy?thread=${ENV.get('thread') || 6}&chunkSize=256&url=` + encodeURIComponent(downUrl)); + } + + return { + parse: 0, + url: urls, + header: headers, + } + */ + + } + async testSupport(url, headers) {