最近接到一个小项目,要使用python实现一些底层的socket来完成数据采集和数据打包。 其实一开始并不难。 其中一种是使用python获取加密签名,然后传递给第三方socket来获取token。 其中python 调用 javascript,它的后端加密算法之一使用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时python 调用 javascript,会有两类比较相似的包,一类是crypto。 js,这两个看起来很像,我一度以为是一个,但是加密结果不一样,我会发一篇文章来分析一下两者的区别。 这里使用了 Crypto.js。 这样js文件就已经准备好了,记得调用js文件中的函数,不然获取不到相关数据。
2.Python读取脚本文件库的介绍
因为项目需要使用python2.7实现,所以我们使用的句型是基于python2的。 我们用来运行js的脚本库是execjs,它支持python2和python3。 具体安装方法有很多,这里介绍一种,使用命令行进入安装python的Scripts文件夹,我的是D:python2.7Scripts,输入:
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文件就可以运行了,记得在当前文件中调用这个函数。 本文也是最近一个项目的一个小实现。 如果有好的方法请指教。