今天写一个python爬虫来调用百度翻译api的时候,发现百度翻译的formdata里面多了一个sign
参数,这个参数是根据翻译的内容而在前台生成的,如果发送的请求中,query内容和sign不匹配,则收到的响应是error。
在网上查看解决方法时,找到了这么一条办法,就是下载了计算sign
的js源代码,然后使用python的PyExecJS
来调用js函数,动态生成sign。
pip install PyExecJS
import execjs
inputData = "我爱中国"
with open("baidujs.js") as f:
jsData = f.read()
sign = execjs.compile(jsData).call("e",inputData) # 调用js代码中的 e函数,传入参数为 inputData
JS代码原文:
var i = "320305.131321201"
function n(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt(t + 2);
a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a), a = "+" === o.charAt(t + 1) ? r >>> a : r << a, r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
}
return r
}
function e(r) {
var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
if (null =&#