python实现调用js并获取参数

最近接到一个小项目,用python实现一些底层接口,完成数据获取与数据封装,其实本来也不难,其中有一块是要利用python实现获取一个加密签名,再传到第三方接口,获取token,其中它的前端加密算法中有一个是利用crypto.js进行一些列加密,这样其实比较难搞。于是便想利用python来实现调用js生成加密签名,再进行结果回传,查询了一些方案并进行实施,最终获得了想要的结果,特此分享出来。

1.js文件引入crypto.js文件

let Crypto = require("./../node_modules/crypto.js");
const id="4QF88sui99kuiOH";//id
const ts=((new Date()).valueOf().toString()).substr(0,10);//获取当前时间戳
const signStr ="id="+id+"&ts="+ts;

//封装参数
function tokenObject(id,ts,signature){
    this.id = id;
    this.ts = ts;
    this.signature =signature;
}
//获取签名
function getSignature() {
    let signature = md5encode(signStr);
    let token = new tokenObject(id,ts,signature);
    return token;
}
//利用crypto.js进行MD5加密
 function md5encode(word) {
     return Crypto.md5(word).toString();
 }

这里的crypto.js引入最好以npm方式进行安装,可能需要安装一些依赖包,所以最好将babel这种相关依赖一并安装,利用npm安装crypto.js时代码如下:

npm install crypto.js --save

这里一定要注意,在npm里搜索crypto时,会出现两种类型比较相似的包,一个是crypto.js(原生crypto加密模块的二次封装,简化常用加密函数的使用),另一个是crypto-js,这两个看起来相似,我一度以为是一个,但加密的结果不一样,后续我出个文分析这两个的区别。这里用的是crypto.js。这样js文件已经准备好了,记得在js文件里调用函数,要不获取不到相关数据。

2. python读取脚本文件库的引入

因为项目需求用python2.7来进行实现,所以我们使用的语法是基于python2。我们使用的运行js的脚本库为execjs,这个库支持python2和python3。具体安装方法有多种,这里介绍一种,利用命令行进入安装python的Scripts文件夹下,我的是D:\python2.7\Scripts,输入:

pip install PyExecJS

我的已经安装好了,输入会出现以下结果,如果没有安装,则会进行安装。
在这里插入图片描述
安装好以后,python代码如下:

import execjs
import requests
import json

//读取并编译js文件,运行js内函数获得想要的结果
def getSignatureString():
    jsstr = ReadJs()
    ctx = execjs.compile(jsstr)
    signature =json.dumps(ctx.call("getSignature"))//上面那个js文件中,这个方法用来获取签名
    return signature

//读取JS文件,将js代码转换
def ReadJs():
    jsfile = open("./../javascript/getSignature.js","r")//打开js所在文件,方式以只读方式打开
    codeline = jsfile.readline()
    codestr=""
    while codeline:
        codestr =codestr +codeline
        codeline =jsfile.readline()
    return codestr
    
//将运行js获得的ts与signature参数取回来,转换成字典形式,在传递到获取token接口
def getCode():
    url=""
    id = "4QF88sui99kuiOH"
    dict_json =json.loads(getSignatureString())
    params = {"id": id, "ts": dict_json['ts'], "signature": dict_json['signature']}
    result = requests.post(url, data=params )
    response_dic = result.text
    success_object =json.loads(response_dic)
    return success_object

这样就可对这个python文件进行运行了,记得在当前文件中调用这个函数。本文也是最近项目上的一个小实现,如果好方法,请多指教。

猜你喜欢

转载自blog.csdn.net/qq_33479841/article/details/88769782
今日推荐