Python调用JS的三种常用方法【学习心得】

        在做JS逆向的时候,一种情况是直接用Python代码复现JS代码的功能,达成目的。但很多时候这种方法有明显的缺点,那就是一旦JS代码逻辑发生了更改,你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了,我直接得到你的JS代码片段,用Python去操作JS运行,并得到结果。这种做法的好处在于可以将JS代码看成一个黑盒子,我不关心里面是怎么写的,我只在乎是否输出了正确的结果。

方法一、用Python的pyexecjs库

pyexecjs库允许在Python环境中执行JavaScript代码,无需浏览器环境。在我的另一篇文章中详细讲了pyexecjs库的用法,大家可以去看看哦!

http://t.csdnimg.cn/Eo29Dhttp://xn--pythonpyexecjs-082ha0760esa4358l6pybfnik9rvpff4ap62eee2q

优点:

  • 简单易用,无需启动浏览器环境即可执行JavaScript代码。
  • 在内存中执行JavaScript代码,性能相对较高。
  • 缺点:

  • 只能执行纯JavaScript代码,无法处理DOM操作或者利用浏览器特性的功能(如Web API、HTML5特性等)。
  • 需要系统安装支持的JavaScript运行时环境(如Node.js或Rhino等)。
  • 对于复杂或依赖特定环境的JavaScript代码支持有限。
  • 方法二、Python的selenium库

            selenium主要用于Web自动化测试,它可以启动一个真实的浏览器(如Chrome、Firefox等)并模拟用户操作。若要执行JavaScript代码,可以利用execute_script方法。至于如何使用execute_script我这里给出一段参考的代码:

    # 导入webdriver模块中的Options类(这里省略了import语句)
    chrome_option = Options()
    
    # 设置Chrome浏览器启动选项,使其在无头模式下运行,即不显示用户界面
    chrome_option.add_argument("--headless")
    
    # 禁用GPU硬件加速,这对于某些系统在headless模式下运行时是必要的
    chrome_option.add_argument("--disable-gpu")
    
    # 忽略SSL证书错误,防止因为证书问题导致的网页加载失败
    chrome_option.add_argument('--ignore-certificate-errors')
    
    # 使用前面设置好的Chrome启动选项实例化一个Chrome浏览器对象
    browser = webdriver.Chrome(options=chrome_option)
    
    # 定义要访问的网址,并使用浏览器打开该网址
    url = "替换成你想要处理的网址"
    browser.get(url)
    
    # 在当前页面上执行一段JavaScript代码,并获取其返回结果
    result = browser.execute_script("你想执行的JS代码片段")
    
    # 输出执行JavaScript后得到的结果
    print(result)
    
    # 暂停程序运行10秒,确保有足够时间进行页面加载或执行后续操作
    time.sleep(10)
    
    # 关闭并退出浏览器
    browser.quit()

    优点:

  • 真实的模拟浏览器环境执行JavaScript代码,因此能够处理与DOM相关的操作,以及调用浏览器提供的所有Web API和HTML5特性。
  • 适用于网页自动化测试和爬虫开发等场景,对网页动态加载内容有良好的支持。
  • 缺点:

  • 执行速度相比直接在内存中执行JavaScript慢,因为需要启动和控制一个完整的浏览器实例。
  • 使用成本相对较高,需要配置对应的浏览器驱动程序。
  • 若只是简单的JavaScript计算任务,使用selenium显得较为笨重。
  • 方法三、用node.js搭建一个HTTP API后台服务接口,开放给Python代码调用

            首先,在Node.js中创建一个HTTP服务器,并暴露执行JavaScript功能的API。然后,在Python中调用这个HTTP API来执行JavaScript代码。下面介绍Node.js中的一个包express,他可以快速的搭建一个Web服务。

    // 导入express包
    const express = require("express")
    
    // 创建Web实例
    const app =  express()
    
    // 设置端口
    const port = 3000
    
    
    // 处理GET请求
    app.get('/', function (req, res){
        // 获取请求参数
        let params = req.query   // 获得整个请求参数
        let key = req.query.key  // 获得某个请求参数,这个key是我从前端自己传入的http://localhost:3000/?key=100
        // 返回响应
        res.send(`Your query params = ${key}`)
    })
    
    
    // 处理POST请求
    // 先设置中间件
    app.use(express.json())  // 用于解析JSON格式的请求体
    app.post('/', function (req, res) {
        // 获取表单数据
        let data = req.body  // 获得整个表单数据
        let name = req.body.name  // 获得某个表单数据,这个name是我自己从前端传入的{"name": "wangxin", "age": 18}
        // 返回响应
        res.send(`Your form data = ${name}`)
    })
    
    
    // 启动服务
    app.listen(port, function (){
        console.log(`Server is running at http://localhost:${port}`)
    })
    

    优点:

  • 提供了一种跨语言交互的解决方案,Python可以通过HTTP请求调用Node.js服务端的JavaScript代码,灵活性较强。
  • Node.js服务可以封装复杂的JavaScript逻辑,并进行优化和安全控制,提供给Python或其他客户端调用。
  • 可以复用已有的JavaScript模块和生态系统
  • 缺点:

  • 需要额外搭建并维护一个HTTP服务,增加了系统的复杂性和部署成本。
  • HTTP请求存在网络延迟,不适合对响应时间要求极高的场景
  • 如果API设计不当或未做足够的安全性验证,可能带来安全风险。例如,在上述示例中直接执行用户提供的JavaScript代码是极其危险的,应避免在生产环境中这样做。
  • 作者:小oo呆

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python调用JS的三种常用方法【学习心得】

    发表回复