Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
在 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
验证安装
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 中使用:
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 浏览器开发者工具
1)打开浏览器开发者工具(F12)
2)在 Network 面板中查看请求
3)找到加密参数的请求,查看对应的 JS 文件
4)在 Sources 面板中搜索关键参数(如 sign、token)
5.2 代码搜索法
1)在 JS 文件中搜索常见加密函数(如 md5、sha1、aes)
2)搜索参数名(如 data、params、sign)
3)查看函数调用关系
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 调试技巧
1)逐步调试:在 JS 代码中添加 console.log 输出关键变量
2)参数验证:打印输入参数和输出结果,确认加密逻辑
3)环境一致性:确保 Python 和 Node.js 环境中的库版本一致
7. 总结
pyexecjs 是一个非常实用的 Python 库,它让我们能够在 Python 中无缝调用 JavaScript 代码。通过结合 Node.js,我们可以轻松处理各种复杂的 JS 逻辑,包括:
1)数据加密/解密
2)网络请求模拟
3)逆向分析
4)自动化测试
关键要点:
1)pyexecjs 依赖于 Node.js 环境
2)安装 pyexecjs 后,使用 execjs.get().name 验证环境
3)对于复杂的 JS 代码,可以使用 execjs.compile() 预编译
4)Windows 用户需要处理编码问题
5)解决第三方库依赖时,使用 npm install 安装
通过本文介绍的方法,你可以轻松地在 Python 项目中集成 JavaScript 逻辑,解决各种复杂场景下的问题。无论你是爬虫开发者、安全研究人员,还是全栈开发者,pyexecjs 都将成为你工具箱中的利器。
小贴士:在实际项目中,建议将 JS 代码保存为独立文件,通过
open()读取,这样更便于维护和调试。
更多推荐



所有评论(0)