最近接到一个小项目,用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文件进行运行了,记得在当前文件中调用这个函数。本文也是最近项目上的一个小实现,如果好方法,请多指教。