在做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代码是极其危险的,应避免在生产环境中这样做。