如何在Power Automate Desktop中使用CryptoJS?遇'CryptoJS未定义'报错
解决Power Automate Desktop中Run JavaScript的'CryptoJS'未定义错误
问题原因
Power Automate Desktop的Run JavaScript操作基于Windows脚本宿主(WSH)的JScript引擎,这个环境没有内置CryptoJS库,直接调用CryptoJS对象自然会报未定义错误。
解决方案
由于WSH无法加载外部JS库,你需要把CryptoJS的核心代码内联到脚本中。以下是整合了CryptoJS SHA1模块的完整可运行代码:
// CryptoJS SHA1核心代码(内联部分) var CryptoJS=CryptoJS||function(h,s){var f={},t=f.lib={},g=function(){},j=t.Base={extend:function(a){g.prototype=this;var c=new g;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, q=t.WordArray=j.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes,e=a.sigBytes;this.clamp();if(b%4)for(var g=0;g<e;g++)c[b+g>>>2]|=(d[g>>>2]>>>24-8*(g%4)&255)<<24-8*((b+g)%4);else if(65535<d.length)for(g=0;g<e;g+=4)c[b+g>>>2]=d[g>>>2];else c.push.apply(c,d);this.sigBytes+=e;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<< 32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=j.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d++)c.push(4294967296*h.random()|0);return new q.init(c,a)}}),v=f.enc={},k=v.Hex={stringify:function(a){var c=a.words,d=a.sigBytes;for(var b=[],e=0;e<d;e++){var g=c[e>>>2]>>>24-8*(e%4)&255;b.push((g>>>4).toString(16));b.push((g&15).toString(16))}return b.join("")},parse:function(a){var c=a.length,d=[];for(var b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b, 2),16)<<24-4*(b%8);return new q.init(d,c/2)}},m=v.Latin1={stringify:function(a){var c=a.words,d=a.sigBytes;for(var b=[],e=0;e<d;e++)b.push(String.fromCharCode(c[e>>>2]>>>24-8*(e%4)&255));return b.join("")},parse:function(a){var c=a.length,d=[];for(var b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},n=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(m.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return m.parse(unescape(encodeURIComponent(a)))}}, p=t.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=n.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data.words,d=c.length,b=this.blockSize,e=this._nDataBytes,f=h.floor(e/(4*b)),g=f*b,e=4*g,this._nDataBytes=e;c.splice(0,g);return g},clone:function(){var a=j.clone.call(this);a._data=this._data.clone();return a},_minBufferSize:function(){return 0}});t.Hasher=p.extend({init:function(){this.reset()}, reset:function(){p.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);this._doFinalize();return this._hash},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new u.HMAC.init(a,d)).finalize(c)}}});var u=f.algo={};return f}(Math); (function(h){for(var s=CryptoJS,f=s.lib,t=f.WordArray,g=f.Hasher,j=[],q=[],v=function(a){return 4294967296*(a-(a|0))|0},k=2,m=0;64>m;){var n;a:{n=k;for(var p=h.sqrt(n),u=2;u<=p;u++)if(!(n%u)){n=!1;break a}n=!0}n&&(8>m&&(j[m]=v(h.pow(k,0.5))),q[m]=v(h.pow(k,1/3)),m++);k++}var f=s.algo.SHA1=g.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doFinalize:function(){var a=this._data,c=a.words,d=a.sigBytes,b=this.blockSize,e=8*d,f=e>>>29,c=e>>> 3&31;c[c>>>2]|=128<<24-8*(c%4);c[(f+5)<(c.length-1)?f+5:c.length-1]=h.floor(e/4294967296);c[f+4]=e;a.sigBytes=4*c.length;this._process()},_processBlock:function(a,c){for(var d=this._hash.words,b=d[0],e=d[1],f=d[2],g=d[3],h=d[4],m=0;80>m;m++){if(16>m)var n=a[c+m]|0;else{var n=a[c+m-16]^a[c+m-14]^a[c+m-8]^a[c+m-3];n=n<<1|n>>>31}var p=(b<<5|b>>>27)+h+n,q=m<20?(e&f|~e&g)+1518500249:m<40?(e^f^g)+1859775393:m<60?(e&f|e&g|f&g)+2400959708:(e^f^g)+3395469782;h=g;g=f;f=e<<30|e>>>2;e=b;b=p}d[0]=d[0]+b|0;d[1]=d[1]+e|0; d[2]=d[2]+f|0;d[3]=d[3]+g|0;d[4]=d[4]+h|0}});s.SHA1=g._createHelper(f);s.HmacSHA1=g._createHmacHelper(f)})(Math); // 你的原有逻辑代码 var currentDate = new Date(); var year = currentDate.getUTCFullYear().toString(); var month = (currentDate.getUTCMonth()+1).toString(); // 可选:月份补零,确保是两位数字 // month = month.padStart(2, '0'); var day = currentDate.getUTCDate().toString(); // 可选:日期补零,确保是两位数字 // day = day.padStart(2, '0'); var formattedUTCDate = year + month + day; var pass = "MNA8016fa5558"+ formattedUTCDate +"0957b65ffr534w2f19f1"; var enc_pass = CryptoJS.SHA1(pass).toString(CryptoJS.enc.Hex); WScript.Echo(enc_pass);
补充说明
- 代码开头的部分是CryptoJS的SHA1核心实现(仅包含SHA1和Hex编码所需的代码,精简后体积更小),内联后就能直接调用
CryptoJS.SHA1和CryptoJS.enc.Hex。 - 如果你需要其他CryptoJS算法,同样需要把对应算法的核心代码内联进来,WSH不支持动态加载外部脚本。
- 可选的补零操作:如果你的
formattedUTCDate需要月份和日期是两位数字(比如20240501而不是202451),可以取消注释代码里的padStart行。
内容的提问来源于stack exchange,提问作者HAJJAJ
相关产品推荐
相关产品推荐

