一、背景
因为这次需要用到一下Google翻译,对英文翻译成中文,通过对Google翻译的分析,发现Google翻译里面有一个很重要参数tk。这个参数在每次翻译之前都会重新生成,只有校验通过了才可以将翻译的结果返回。而这个参数是使用js来生成了的。
二、解决
通过查阅相关的资料,在国外大佬的个人博客里面找到了这个参数的解析,国内也有很多大佬解析,这里就简单记录一下,使用python的方法去调用。
1.1 安装PyExecJS
通过下面的指令完成PyExecJs的安装,这样就可以在python中执行js代码。
pip install PyExecJS
1.2 代码封装
通过下面的代码对输入参数的js,进行混淆解析,返回生成的tk值,直接引用即可,后面使用js.getTk方法就可以进行解析了。
import execjs
class Py4Js:
def __init__(self):
self.ctx = execjs.compile("""
function TL(a) {
var k = "";
var b = 406644;
var b1 = 3293161072;
var jd = ".";
var $b = "+-a^+6";
var Zb = "+-3^+b+-f";
for (var e = [], f = 0, g = 0; g < a.length; g++) {
var m = a.charCodeAt(g);
128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023),
e[f++] = m >> 18 | 240,
e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
e[f++] = m >> 6 & 63 | 128),
e[f++] = m & 63 | 128)
}
a = b;
for (f = 0; f < e.length; f++) a += e[f],
a = RL(a, $b);
a = RL(a, Zb);
a ^= b1 || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return a.toString() + jd + (a ^ b)
};
function RL(a, b) {
var t = "a";
var Yb = "+";
for (var c = 0; c < b.length - 2; c += 3) {
var d = b.charAt(c + 2),
d = d >= t ? d.charCodeAt(0) - 87 : Number(d),
d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
}
return a
}
""")
def getTk(self, text):
return self.ctx.call("TL", text)
js = Py4Js()
1.3 分析
通过上面的代码可以看到通过execjs.compile对代码进行编译,使用call函数进行调用,第一个为调用的函数名,第二个为参数。这样就可以将python中的参数传递给js,同时返回执行的结果。剩下的内容就可以按照正常的爬虫请求就可以完成了。
三、总结
网上也有很多资料,这里简单做个记录对以后的复习有好处。找到那个blog地址就把地址补上。