本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
在 Web 开发和爬虫逆向分析中,我们经常需要处理 JavaScript 代码。Python 本身不支持直接执行 JS,但通过 pyexecjs
这个轻量级库,我们可以轻松地在 Python 环境中调用 JavaScript 代码。本文将详细介绍如何使用 pyexecjs
与 Node.js 配合,实现 Python 调用 JS 代码的完整流程。
1. 环境准备:安装 Node.js
pyexecjs
依赖于一个能运行 JS 的环境,我们选择 Node.js 作为执行引擎。
1.1 安装 Node.js
# Ubuntu/Debian curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash nvm install --lts nvm use --lts # Mac (使用 Homebrew) brew install node
1.2 验证 Node.js 安装
node -v # 应输出类似 v18.18.2 npm -v # 应输出类似 9.8.0
2. 安装 pyexecjs
pip install pyexecjs
2.1 验证安装
import execjs print(execjs.get().name) # 输出: Node.js (V8)
3. 简单使用示例
3.1 直接执行 JS 代码
import execjs # 执行 JS 代码并获取结果 js_code = '"鲁班_王昭君_猴子_亚瑟_蔡文姬".split("_")' result = execjs.eval(js_code) print(result) # 输出: ['鲁班', '王昭君', '猴子', '亚瑟', '蔡文姬']
3.2 编译 JS 代码并调用函数
# 编译 JS 代码 js = """ function add(a, b) { return a + b; } function multiply(a, b) { return a * b; } """ ctx = execjs.compile(js) # 调用 JS 函数 print(ctx.call("add", 10, 20)) # 输出: 30 print(ctx.call("multiply", 5, 6)) # 输出: 30
3.3 Windows 编码问题解决方案
Windows 系统可能会遇到编码问题,解决方法如下:
import subprocess from functools import partial # 解决 Windows 编码问题 subprocess.Popen = partial(subprocess.Popen, encoding='utf-8') import execjs print(execjs.get().name) # 确保能正常运行
4. 补环境:解决常见依赖问题
4.1 补全 JS 第三方库环境
当 JS 代码依赖第三方库(如 crypto、axios)时,需要先安装这些库:
# 安装 crypto 库 npm install crypto # 安装 axios 库 npm install axios
4.2 补全浏览器环境
对于需要浏览器环境的 JS 代码(如处理 DOM 或浏览器 API),可以使用 jsdom
:
npm install jsdom
然后在 Python 中使用:
python
深色版本
import execjs # 创建浏览器环境 ctx = execjs.compile(""" const { JSDOM } = require('jsdom'); const dom = new JSDOM(); const { document } = dom.window; """) # 使用浏览器 API ctx.eval("document.createElement('div')")
5. 找加密入口的几种方法
在爬虫逆向分析中,找到 JS 加密入口是关键步骤。以下是几种实用方法:
5.1 浏览器开发者工具
- 打开浏览器开发者工具(F12)
- 在 Network 面板中查看请求
- 找到加密参数的请求,查看对应的 JS 文件
- 在 Sources 面板中搜索关键参数(如
sign
、token
)
5.2 代码搜索法
- 在 JS 文件中搜索常见加密函数(如
md5
、sha1
、aes
) - 搜索参数名(如
data
、params
、sign
) - 查看函数调用关系
5.3 调试技巧
# 在关键函数处添加调试输出 js_code = """ function encrypt(data) { console.log('加密参数:', data); // 加密逻辑 return encryptedData; } """ ctx = execjs.compile(js_code) result = ctx.call("encrypt", "test")
6. 实战案例:调试工具
让我们通过一个实战案例,展示如何使用 pyexecjs
调试 JS 加密逻辑。
6.1 案例:模拟登录加密
假设我们有一个登录接口,需要对密码进行加密:
JS 代码 (encrypt.js):
function encryptPassword(password) { const salt = "my_salt"; const hash = CryptoJS.SHA256(password + salt).toString(); return hash; }
Python 调用:
import execjs import os # 设置 Node.js 环境变量 os.environ["NODE_PATH"] = "/usr/local/lib/node_modules/" # 编译 JS 代码 with open("encrypt.js", "r") as f: js_code = f.read() ctx = execjs.compile(js_code) # 调用加密函数 encrypted = ctx.call("encryptPassword", "123456") print(f"加密后的密码: {encrypted}")
6.2 调试技巧
- 逐步调试:在 JS 代码中添加
console.log
输出关键变量 - 参数验证:打印输入参数和输出结果,确认加密逻辑
- 环境一致性:确保 Python 和 Node.js 环境中的库版本一致
7. 总结
pyexecjs
是一个非常实用的 Python 库,它让我们能够在 Python 中无缝调用 JavaScript 代码。通过结合 Node.js,我们可以轻松处理各种复杂的 JS 逻辑,包括:
- 数据加密/解密
- 网络请求模拟
- 逆向分析
- 自动化测试
关键要点:
pyexecjs
依赖于 Node.js 环境- 安装
pyexecjs
后,使用execjs.get().name
验证环境 - 对于复杂的 JS 代码,可以使用
execjs.compile()
预编译 - Windows 用户需要处理编码问题
- 解决第三方库依赖时,使用
npm install
安装
通过本文介绍的方法,你可以轻松地在 Python 项目中集成 JavaScript 逻辑,解决各种复杂场景下的问题。无论你是爬虫开发者、安全研究人员,还是全栈开发者,pyexecjs
都将成为你工具箱中的利器。
小贴士:在实际项目中,建议将 JS 代码保存为独立文件,通过
open()
读取,这样更便于维护和调试。