1.JS混淆加密
我们之前爬取有道翻译的翻译内容时,我们通过fiddler抓取url地址时,我们发现如果我们直接将相关参数传入,会报错。只是因为,某些参数是变化的。因此,我们需要解读JS文件,取得相关参数的生成算法,利用python生成参数,再传入。
我们继续以有道翻译为例讲解如何获取相关参数的生成算法,并利用python生成参数。
首先,我们使用fiddler抓取翻译所需要的全部参数,
data = {
"i": keyword, # 翻译内容
"from": "AUTO", # 源语言,固定值
"to": "AUTO", # 目标语言,固定值
"smartresult": "dict", # 智能结果,固定值
"client": "fanyideskweb", # 客户端,固定值
"salt": res['salt'], # 加密用的盐,这个值变化
"sign": res['sign'], # 签名字符串,这个值变化
"ts": res['ts'], # 毫秒时间戳,这个值变化
"bv": res['bv'], # 未知值,这个值变化
"doctype": "json", # 文档类型,固定值
"version": "2.1", # 版本,固定值
"keyfrom": "fanyi.web", # 键的来源,固定值
"action": "FY_BY_CLICKBUTTION", # 操作动作,固定值
}
通过分析参数我们发现需要获取salt、sign、ts和bv参数的算法。
我们进入有道翻译页面,右键“检查”-“网络”找到所有的js文件,依次进入并搜索salt、sign。
经过搜索,我们发现fanyi.js文件中有salt和sign,将fanyi.js下载并格式化。在格式化后的js文件中搜索salt,我们可以找到这样一个函数,
function (e, t) {
var n = e("./jquery-1.7"); // e为要翻译的内容
e("./utils");
e("./md5");
var r = function (e) {
var t = n.md5(navigator.appVersion), // t参数为经过md5加密后的浏览器版本
r = "" + (new Date).getTime(), // r参数为时间戳
i = r + parseInt(10 * Math.random(), 10); // i参数为时间戳加0-10之间随机整数
return {
ts: r, // ts参数为r
bv: t, // bv参数为t
salt: i, // salt参数为i
// sign参数为md5加密
sign: n.md5("fanyideskweb" + e + i + "mmbP%A-r6U3Nw(n]BjuEU")
}
};
t.recordUpdate = function (e) {
var t = e.i,
i = r(t);
n.ajax({
type: "POST",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
url: "/bettertranslation",
data: {
i: e.i,
client: "fanyideskweb",
salt: i.salt,
sign: i.sign,
ts: i.ts,
bv: i.bv,
tgt: e.tgt,
modifiedTgt: e.modifiedTgt,
from: e.from,
to: e.to
},
success: function (e) {
},
error: function (e) {
}
})
},
经过分析js代码,我们可以获取salt、sign、ts和bv参数的算法。我们下面使用python生成这些参数,
import hashlib
import time
import random
def handlerSignSalt(e):
navigator_appVersion = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56"
t = hashlib.md5(navigator_appVersion.encode('utf-8')).hexdigest()
r = str(int