网上有人用了js2py,我自己用了一下,运行太慢了,没有用过pyV8,不做评论,平时主要是用execjs,用着还顺手。
在python爬虫逆向js的时候,由于js代码的复杂性,可能会直接有调用js的情况,这个时候我就选用execjs,但是用这个库,我只能得到js返回的结果,有时候需要debug,就不知道该怎么实现了,例如:
// python_ondejs.js
function add(num1, num2) {
var num3 = 0
// console.log(num1, num2)
num3 = num1 + num2;
console.log(num3)
return num3
}
# python_nodejs.py
import execjs
def get_data(args1, args2):
with open("python_ondejs.js", "r", encoding="utf-8") as f:
jzsc_code = f.read()
decrypted_data = execjs.compile(jzsc_code).call("add", args1, args2)
print(decrypted_data)
return decrypted_data
if __name__ == '__main__':
get_data(1, 2)
用python调用的时候,只能获取到 add 返回的值,也就是 num3,这知识简单的一个js函数调用,如果复杂一些,需要像debug那样,查看参数的运行值,也就是js里面的console,该怎么办呢?
这个时候用到了python的另一个库 import subprocess,首先修改 .py 文件
# python_nodejs.py
import subprocess
import execjs
def get_data(args1, args2):
with open("python_ondejs.js", "r", encoding="utf-8") as f:
jzsc_code = f.read()
decrypted_data = execjs.compile(jzsc_code).call("add", args1, args2)
print(decrypted_data)
return decrypted_data
if __name__ == '__main__':
# get_data(1, 2)
args1 = "1"
args2 = "2"
p = subprocess.Popen(['node', './python_ondejs.js', args1, args2], stdout=subprocess.PIPE)
out = p.stdout.read()
print('out:', "\n", out)
然后修改 js 的代码:
// python_ondejs.js
function add(num1, num2) {
var num3 = 0
// console.log(num1, num2)
num3 = num1 + num2;
console.log(num3)
return num3
}
var num1 = parseInt(process.argv[2]);
var num2 = parseInt(process.argv[3]);
// console.log(num1, num2)
add(num1, num2)
运行就可以看到console的数据了,调试完成之后,用 execjs 调用或传参就行,subprocess 只是用来实现类似 debug 的方式,查看 js 里面的console,不要搞混淆了。