前言
在进行python爬虫js逆向时,有时候会遇到一些比较复杂的、带有混淆的JavaScript代码,对于某些复杂部分我们可能只需要获取其运算结果而无须一步步复现其算法。
这时候可以跳过对繁琐的JavaScript函数进行原理反逆向,而是将其函数代码保存到本地直接使用python的execjs库执行js函数以获得想要的参数。
一、安装
首先在终端中使用pip install安装PyExecJS
pip install PyExecJS
二、使用
1.JavaScript代码示例
我这里示例提供了某网站的一个JavaScript部分代码,下面仅展示其主要加密函数入口,这也是我们在python中需要调用的部分
function sign(randomcode) {
var t = new JSEncrypt();
t.setPublicKey("MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMiU6MWuUemPQkPAZSfYUBD6qfgQfM/jY3OEBbdNlOm0SBjX4Z1GMSg0Jhk70NQlxNfrbz4oN0A+jVhoH7gEyY8CAwEAAQ==");
var encryptedCode = t.encrypt(String(randomcode));
return encryptedCode;
}
2.python调用
我将JavaScript函数代码原文保存在了js/jsencrypt.min.js中,execjs的compile函数通过读取字符串进行函数解析
from execjs import compile
param=123
with open('js/jsencrypt.min.js', encoding='utf-8', errors='ignore') as file:
content = file.read()
encryptfunc = compile(content)
encrypted_code = encryptfunc.call('sign', param)
该处的param即会传给JavaScript sign函数的randomcode,encrypted_code即是JavaScript代码的返回值encryptedCode
三、疑问
本人在使用时遇到了多次奇怪的gbk解码错误,通过修改python环境的lib里的subprocess文件,将encoding=None改为utf-8解决了,但是尚不知道引起该问题的原因是什么,希望有大佬可以解答