您现在的位置是: 网站首页> 学习笔记> JS逆向 JS逆向

Python调用JS代码

2021-01-04 [selenium] [JS调用] 3907人已围观

常见的JS调用库,及说明

一、PyV8

V8是Google的javascript开源引擎,内置在Chrome浏览器中, 而PyV8则是基于V8引擎开发的Pyhton库,可以通过Python程序调用V8引擎执行JS代码; 但是V8太久未更新,存在内在泄露问题,一些大佬不推荐使用。

二、Js2Py

这是一个python实现的js解释器和翻译器,有bug,性能不高, 对高度混淆的JS会有转换失败的情况,且转换出来的代码可读性较差, 另外这个项目的issues中还有很多bug未修复。

三、PyMiniRacer

一个比较新的V8引擎的一个包装库,继承PyExecJS、PyV8血统。

四、PyExecJS

诞生于Ruby,被移植到Python中,可选择执行引擎,一般情况下会选择NodeJS(安装方便,执行效率高); 但是执行大型JS时还是会有点慢。

引擎选择:

# 第一种方式
os.environ["EXECJS_RUNTIME"] = "Node"

# 第二种方式(临时使用一下)
import execjs.runtime_names
node = execjs.get(execjs.runtime_names.Node)

execjs使用方法

# 第一种
import execjs
result = execjs.eval('xxx')    # xxxx为要执行的js代码

# 第二种
import execjs
js_code = """
    // 各种js代码
    function f(x){
        return x + "...";
    }
"""
ctx = execjs.compile(js_code)
result = ctx.call("这里可以传参,由x接收")

五、Selenium

一个web自动化测试框架,相当于在浏览器中执行js代码。

js_code = """
        需要执行的JS代码
"""
result = browser.execute_script(js_code)

六、Pyppeteer

一个WEB自动化测试框架,是nodejs中谷歌开发的Puppeteer库的Python版本, 性能比Selenium高,支持协程的方式调用。

js_code = """
        需要执行的JS代码
"""
result = await browser.evaluate(js_code, *data)

# 如果需要在页面加载前调用JS(可以用来初始化环境)
result = await browser.evaluateOnNewDocument(js_code, *data)

以上方法调用js都有一个问题,就是速度慢,比较好的改进方法是通过nodejs写一个服务接口, 让nodejs执行js代码,我们需要使用的时候直接调用api服务。

另外扣出来js代码经常会遇到一些常见的问题,比如:

1.浏览环境中的window全局对象,在nodejs中是没有的,nodejs中的全局对象是global; 调试时如果报没有window、document、navigate之类的错误,我们可以定义一个window或document对象, 给它们赋个空值,或者把它指向global; 但是这样处理的话又有另一个问题,就是window中的属性什么的不全,不真实, 解决的方法是使用类似jsdom的库,尽量模拟真实环境。

2.window.btoa,将字符串转为base64编码,在nodejs中是不存在这个方法的, 可以使用其它转base64的方法替换,比如:

Buffer.from('xxx需要转base64编码字符串').toString('base64')

看某视频教程做的笔记,有不及之处请大佬多多指教。

文章评论

暂无评论

添加评论





本栏推荐

站点信息

  • 建站时间:2021-01-01
  • 网站程序:Django 3.1.2
  • 文章统计:53篇
  • 文章评论:31条
  • 统计数据