python调用Javascript实践
一、背景知识
1、Node.js
javacript的运行环境有两个:浏览器、node.js
Node.js 是一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具!
Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使 Node.js 表现得非常出色。
运行js的命令: node app.js
2、npm
npm
是 Node.js 标准的软件包管理器。
在 2017 年 1 月时,npm 仓库中就已有超过 350000 个软件包,这使其成为世界上最大的单一语言代码仓库,并且可以确定几乎有可用于一切的软件包。
安装包的命令:npm install package
3、PyExecJS
一个python库,作用:Run JavaScript code from Python
官方文档 https://pypi.org/project/PyExecJS/
二、实践环节
1、环境准备
(1)pip install PyExecJS
(2)如果运行的js需要外部包,则需要在机器上先安装Node.js和npm(自行百度)
然后命令行npm install 所需的包,注意此步操作默认会在当前目录生成node_modules文件夹,用于存放npm下载的包
2、代码
(1)目录结构
(2)代码
import os
import execjs
os.environ["NODE_PATH"] = os.getcwd()
parser = execjs.compile("""
function parse() {
var cryptico = require("cryptico");
let PassPhrase = new Date + "";
let RSAKey = cryptico.generateRSAKey(PassPhrase, 1024);
let PublicKeyString = cryptico.publicKeyString(RSAKey);
let public_key = new Buffer.from(PublicKeyString, ).toString('base64');
return public_key;
}
function parse1(pwd, challenge) {
var cryptico = require("cryptico");
var GibberishAES = require("./node_modules/gibberish-aes/dist/gibberish-aes-1.0.0.js");
var password = 'admin';
var challenge = challenge;
let PassPhrase = new Date + "";
let RSAKey = cryptico.generateRSAKey(PassPhrase, 1024);
let CipherText = new Buffer.from(challenge, 'base64').toString();
let DecryptionResult = cryptico.decrypt(CipherText, RSAKey);
if (null !== DecryptionResult.plaintext) {
let out = GibberishAES.enc(password, DecryptionResult.plaintext);
let encString = new Buffer.from(out, 'utf-8').toString('base64');
return encString;
}
}
""")
if __name__ == "__main__":
obj = parser.call("parse")
print ("public_key:" + obj)
obj1 = parser.call("parse1", 'admin', 'NjV366/AgZ7tzdpeeR8jBX/jx4+MJJO+yzRZBEKKQBuYVO8eUyIOTUc1eZW9QnCNubTs1/bkUpEAK7Lqy06NWL7GrUfObO8YChZJ6/zMn5fQU3dumtSX6biGt1QP+rcDlzne/9BzYiwiMQ0XCLSCWR7/KgsRrHcecoeWNMGfPAo=')
print ("encString:" + obj1)