web逆向日记——解决execjs出现中文乱码

249 阅读2分钟

本人美滋滋写完js代码后,用py的execjs去调用写好的js代码,python命令一敲上,你猜怎么着,报错了,它提示说我什么\ufffd编码问题,这不是unicode编码吗,好好好,检查了下文件的编码,然后把控制台用命令行chcp命令调成一样的utf-8编码

## 将控制台编码改为utf-8
chcp 65001

还报错,啥情况?已经把py文件、js文件和控制台编码改成一样的了。
于是单独对py用python看看能不能输出中文,结果显示是正常的,没问题啊。那问题只能出现在execjs调用js代码上了,然后写了个简易的js去调用,好家伙,真给乱码啊,那问题就出现在execjs。 于是嘎嘎搜,发现是因为execjs库是py2的产物,而py2使用的ASCII编码,并且execjs库其实已经停止更新了。
解决方法:1.需要在execjs库引入之前加上下面代码

import subprocess
from functools import partial
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
# import execjs   记得一定要在这个之前引入

2.使用PyExecJS2库代替,剩下代码也是一样的import execjs

    pip install PyExecJS2

———————————————————————————————————————————
更新:2024.8.13
发现问题:根据本人需要调用先后两个函数,两个函数都使用到了全局对象的时间戳,并且必须一致,所以本人前一个函数set,后一个函数get。但是发现该库在先后调用函数时,上下文并不一致,每次调用函数好像都在重新解释js了,查了论坛半天也没有结果。(全网都没发现这个问题还是这本身就是PyExecJS库的缺点??)
问题复述:代码如下,原本应该调用三次increment后,输出分别为1,2,3。但结果却为1,1,1,就好像上下文没有生效一样。

import execjs

# 编译 JavaScript 代码并创建一个上下文对象
ctx = execjs.compile("""
    var counter = 0;

    function increment() {
        counter += 1;
        return counter;
    }
""")

# 在同一个上下文中多次调用 JavaScript 函数
result1 = ctx.call("increment")
print(result1)  # 输出: 1

result2 = ctx.call("increment")
print(result2)  # 输出: 1

result3 = ctx.call("increment")
print(result3)  # 输出: 1

解决方法:抛弃PyExecJS2,使用py_mini_racer(PS:不需要用Node.js时,因为该库不调用Node.js去解释,使用不了require语法的)
1.安装使用py_mini_racer

pip install py_mini_racer

2.调用示例

from py_mini_racer import MiniRacer

ctx = MiniRacer()
jscode = '''var counter = 0;
    function increment() {
        counter += 1;
        return counter;
    }'''
ctx.eval(jscode)
result = ctx.call("increment")
print(result)  # 输出: 1

result = ctx.call("increment")
print(result)  # 输出: 2

result = ctx.call("increment")
print(result)  # 输出: 3