请求分析
首先,我们打开开发者工具,然后打开Google翻译(translate.google.cn),
我们过滤器选择JS,发现第一个js就很可疑,先记下来。
接着,我们随便输入一些内容,便可以很轻松地抓取到这个请求:
观察GET参数,不用说都能看出来下面几个参数是重要的参数:
我们可以猜测:sl为源语言,tl为目标语言,q为要翻译的内容,tk为某种验证参数。
那么tk参数如何获得呢?
tk参数获取
打开我们最开始发现的那个js文件:
translate.google.cn/translate/releases/twsfe_w_20200622_RC00/r/js/translate_m_zh-CN.js
将其格式化,再经过漫长的搜寻,找到了下面的一串代码:
1 | var pu = function(a) { |
很明显,这段代码是一段算法,而且是经过混淆的(变量名很奇怪)。
经过验证,这就是tk参数的加密算法。把不需要部分的去除,稍微进行整理一下:
1 | var qu = function(a, b) { |
这里的tkk就在源代码里面可以找到,如下图:
execjs库的调用
接下来,我们用python的execjs库进行测试,如果没有安装请使用pip install PyExecJS
进行安装。
1 | import execjs |
我们将运行得到的tk带入那个GET请求中,发现仍然可以正常得到返回json,说明tk获取成功。
于是我们就可以通过修改GET请求的参数实现获取翻译结果了。
python版算法
execjs的性能并不是很好,执行时间会很长。因此我们采用另一种方法:将js转换成python代码。
转换后大致代码如下:
1 | def getGoogleToken(a, TKK): |
最终代码
1 | import requests,re,json,time |
以上代码只是获取了翻译结果,在返回的json中其实还包含了很多其它的信息,可以自行扩展此代码。
最后,附上语言对应的代码(sl和tl所用):
1 | source_code_name: [{ |