python爬虫-js逆向使用python execjs库本地执行js代码


前言

在进行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解决了,但是尚不知道引起该问题的原因是什么,希望有大佬可以解答

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值