冷月半明 2024-06-19 10:16 采纳率: 82.1%
浏览 4

Python中运行js报错

在Python中运行js报错,在js和Python中都打印过相关类型和值了,都没问题,这是怎么回事啊?


# 检查响应状态码
if response.status_code == 200:
    try:
        # 获取响应内容的UTF-8解码字符串
        response_text = str(response.content.decode('utf-8'))
        print(type(response_text))
        decrypted_text = execjs.compile(open('./decrypt.js', 'r', encoding='utf-8').read()).call('decrypt',
                                                                                                 response_text)
        # 打印解密后的文本
        print("Decrypted response:", decrypted_text)

    except execjs.ProgramError as e:
        print(f"JavaScript error: {e}")
    except FileNotFoundError:
        print("JavaScript file 'decrypt.js' not found.")
    except UnicodeDecodeError as e:
        print(f"Encoding error: {e}")
    except ValueError as e:
        print(f"Value error: {e}")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
else:
    print(f"Failed to fetch data: {response.status_code}")
// @charset "UTF-8";

const CryptoJs = require('crypto-js');

function decrypt(t) {
    // return typeof t.replace(/\s+/g, '')
    // t = t.replace(/\s+/g, '')
    var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : ""
        , r = 'rewin-swhysc1234'
        , i = CryptoJs.enc.Utf8.parse(r)
        , o = CryptoJs.AES.decrypt(t, i, {
        mode: CryptoJs.mode.ECB,
        padding: CryptoJs.pad.Pkcs7
    });
    return CryptoJs.enc.Utf8.stringify(o).toString()
}

运行截图:
另外,注释掉的 t.replace这行没问题,可以成功执行。

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-19 10:16
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的信息来看,主要的问题在于execjs模块在执行JavaScript代码时遇到了错误。根据错误信息'NoneType' object has no attribute 'replace',这意味着在JS代码执行过程中,某个变量为None(在JS中表示为nullundefined),而尝试调用了replace方法。

    在你的JS代码中,t变量被传递给decrypt函数,并且在注释掉的行中有尝试使用replace方法。尽管你提到注释掉那行代码后仍出现问题,但是错误信息指出的是replace方法调用出错,这表明问题可能发生在JS代码执行的其他部分,尤其是CryptoJs.AES.decrypt(t, i, {...})这一行。AES解密要求输入的密文格式正确,否则会抛出异常。

    解决步骤如下:

    1. 检查response_text的格式:确保response_text是一个有效的加密字符串,没有额外的空白字符或不正确的编码。你可以通过在调用JS函数前,先在Python端检查response_text是否符合预期的格式。

    2. 检查CryptoJS库的加载:在JS代码中,你使用了require('crypto-js')来加载CryptoJS库。确保在运行环境(比如Node.js)中已经正确安装了CryptoJS库,或者在Python环境中使用了与execjs兼容的cryptojs实现。

    3. 处理异常情况:在JS代码中增加一些错误处理逻辑,例如检查t变量是否为undefinednull,并在调用CryptoJs.AES.decrypt之前进行相应的预处理。

    修改后的JS代码示例:

    // @charset "UTF-8";
    const CryptoJs = require('crypto-js');
    
    function decrypt(t) {
        if (!t || typeof t !== 'string') {
            throw new Error('Invalid input for decryption.');
        }
        // t = t.replace(/\s+/g, '') // 如果需要移除空白字符
        var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "";
        var r = 'rewin-swhysc1234';
        var i = CryptoJs.enc.Utf8.parse(r);
        try {
            var o = CryptoJs.AES.decrypt(t, i, {
                mode: CryptoJs.mode.ECB,
                padding: CryptoJs.pad.Pkcs7
            });
            return CryptoJs.enc.Utf8.stringify(o).toString();
        } catch (error) {
            console.error('Decryption error:', error);
            throw error;
        }
    }
    

    在Python端,你可以在调用execjs.compile(...).call('decrypt', ...)之前,增加一些预处理逻辑,比如去除字符串中的空白字符或检查其有效性。

    如果以上步骤都无法解决问题,建议检查decrypt.js文件是否能独立运行无误,以及Python环境下的execjs模块版本是否支持你的JS代码。

    如果问题仍然存在,可能需要更详细的日志或调试信息来进一步定位问题所在。例如,尝试在JS代码中加入更多的console.log()语句,以便在Python中捕获并打印出这些日志信息,从而了解JS代码执行的具体流程和可能的异常点。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月19日

悬赏问题

  • ¥15 rt-thread线程切换的问题
  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊