python调用js代码解决Google翻译中的tk参数

一、背景

因为这次需要用到一下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地址就把地址补上。

原文地址:https://www.cnblogs.com/future-dream/p/12330860.html