【逆向】Python 调用 JS 代码实战:使用 pyexecjs 与 Node.js 无缝衔接

简介: 本文介绍了如何使用 Python 的轻量级库 `pyexecjs` 调用 JavaScript 代码,并结合 Node.js 实现完整的执行流程。内容涵盖环境搭建、基本使用、常见问题解决方案及爬虫逆向分析中的实战技巧,帮助开发者在 Python 中高效处理 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

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 浏览器开发者工具

  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. pyexecjs 依赖于 Node.js 环境
  2. 安装 pyexecjs 后,使用 execjs.get().name 验证环境
  3. 对于复杂的 JS 代码,可以使用 execjs.compile() 预编译
  4. Windows 用户需要处理编码问题
  5. 解决第三方库依赖时,使用 npm install 安装

通过本文介绍的方法,你可以轻松地在 Python 项目中集成 JavaScript 逻辑,解决各种复杂场景下的问题。无论你是爬虫开发者、安全研究人员,还是全栈开发者,pyexecjs 都将成为你工具箱中的利器。

小贴士:在实际项目中,建议将 JS 代码保存为独立文件,通过 open() 读取,这样更便于维护和调试。



相关文章
|
3月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
450 7
|
3月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
3月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
278 100
|
3月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
445 95
|
3月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
143 12
|
3月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
383 1
|
3月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
653 1
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
356 0
|
3月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
441 0
|
Python
PYTHON实战两数之和
1. 两数之和 难度:简单 收藏 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
267 0
PYTHON实战两数之和

推荐镜像

更多