python execjs 问题 就是逆向小问题

python execjs 问题
这是js文件 自己在网上跟着学的 js逆向
js文件可以正常出结果


//导入一个node.js 第三方库
const crypto = require('crypto')


_keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
_p = "W5D80NFZHAYB8EUI2T649RT2MNRMVE2O"

function e2(e) {
    if (null == (e = _u_e(e))) return null;
    for (var t = '', n = 0; n < e.length; n++) {
        var r = _p.charCodeAt(n % _p.length);
        t += String.fromCharCode(e.charCodeAt(n) ^ r)
    }
    return t
}

function _u_e(e) {
    if (null == e) return null;
    e = e.replace(/\r\n/g, '\n');
    for (var t = '', n = 0; n < e.length; n++) {
        var r = e.charCodeAt(n);
        r < 128 ? t += String.fromCharCode(r) : r > 127 && r < 2048 ? (t += String.fromCharCode(r >> 6 | 192), t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224), t += String.fromCharCode(r >> 6 & 63 | 128), t += String.fromCharCode(63 & r | 128))
    }
    return t
}

function e1(e) {
    if (null == e) return null;
    for (var t, n, r, o, i, a, c, u = '', s = 0; s < e.length;) o = (t = e.charCodeAt(s++)) >> 2,
        i = (3 & t) << 4 | (n = e.charCodeAt(s++)) >> 4,
        a = (15 & n) << 2 | (r = e.charCodeAt(s++)) >> 6,
        c = 63 & r,
        isNaN(n) ? a = c = 64 : isNaN(r) && (c = 64),
        u = u + _keyStr.charAt(o) + _keyStr.charAt(i) + _keyStr.charAt(a) + _keyStr.charAt(c);
    return u
}


//  payload已找到   下一步找sig
// payload = e1(e2(JSON.stringify(pay123)))
// console.log(payload)


//找sig,   出现md5,判断是否为md5,在结尾处加上断点  运行到断点处,在控制台中搜索参数的值,并用在线工具解密是否为md5
function sig123(e) {
    return md5(e + _p).toUpperCase()
}

// 死方法    写死的   都用这个
function md5(text) {
    return crypto.createHash('md5').update(text).digest('hex')
}

// sig = sig123(payload)
// console.log(sig)


function main123() {
    h = {}
// 分页参数
    pay123 = {
        "sort": 1,
        "start": 40,
        "limit": 20
    }
    h['payload'] = e1(e2(JSON.stringify(pay123)))
    h['sig'] = sig123(h['payload'])
    return h
}
// console.log(main123())


下面是调用js文件

import execjs


jscode = open(r'D:\pycharm\学习内容\js学习\2023.4.14\烯牛参数生成.js', 'r', encoding='utf-8').read()
# print(jscode)
parames = execjs.compile(jscode).call('main123')
print(parames)

然后报了这个错误
试了好长时间,没找到错误
js文件可以正常使用 是调用时错了吗
还有就是execjs后面的方法compile输入后在pycharm上看着颜色没有变化
这个有影响吗 一般会用颜色变化的吧

还是其它问题 是在官网下载的node.js自动配置的环境 pycharm插件也已安装
用pycharm终端安装pyexecjs的

img

可能是因为js中main123函数中h/pay123等变量都挂载到全局对象上,而在这个上下文中没有全局对象,所以出现语法错误。
建议:在js文件中,所有的变量都是用let进行声明。如

function main123() {
    let h = {}
// 分页参数
    let pay123 = {
        "sort": 1,
        "start": 40,
        "limit": 20
    }
    h['payload'] = e1(e2(JSON.stringify(pay123)))
    h['sig'] = sig123(h['payload'])
    return h
}