本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

在 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 面板中搜索关键参数(如 signtoken

5.2 代码搜索法

1)在 JS 文件中搜索常见加密函数(如 md5sha1aes

2)搜索参数名(如 dataparamssign

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() 读取,这样更便于维护和调试。

转自:https://developer.aliyun.com/article/1681986

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐