把谷歌的接口逆向重新整理一下,方便需要的时候可以用到

有一个第三方的依赖 googletrans,但是已经两年没更新,用不了了,所以还是自己逆向比较实在

首先是抓包

通过多次对比,发现只需确认 f.sid _reqid 两个参数,其他都是固定的

那就来看看这两个是怎么来的吧,无痕模式fiddler开起来

首先是 f.sid 就在第一次访问 https://translate.google.cn/ 时候返回的html里面

f.sid 只需要一次请求就行,后面都是不会变动的,生成代码如下:

1
2
3
4
5
def get_sid():
url = "https://translate.google.cn/"
resp = requests.get(url)
sid = re.search(r'"FdrFJe":"(.+?)",', resp.text).group(1)
return sid

reqid就不一样了,每一次请求都是不一样的,这就需要逆向分析它的生成逻辑

先打断点调试一波:

这里 wa就是 reqid的值了,继续追踪wa生成点

1
2
3
4
this.wc = $ma++;
gt || (a = new Date,
gt = 3600 * a.getHours() + 60 * a.getMinutes() + a.getSeconds());
this.Wa = 1 + gt + 1E5 * this.wc;

gt 参数也很明显了,这里的 $ma每次都是从0开始计数,随着请求次数递增1,生成代码如下:

1
2
3
4
5
6
def get_reqid():
ma = 0
now = datetime.now()
gt = 3600 * now.hour + 60 * now.minute + now.second
wa = 1 + gt + 100000 * ma
return wa

(后面调试的时候发现这两个参数其实是不需要的 😥😥😥,只要 post 过去的数据格式正确就行)

代码整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import re
import json
import requests


def single_word(word, ol="en", dl="zh-CN", flag=0):
"""
默认 en to zh
if flag: zh to en
"""
if flag:
ol, dl = dl, ol
url = "https://translate.google.cn/_/TranslateWebserverUi/data/batchexecute"
form_data = {
"f.req": f'[[["MkEWBc","[[\\"{word}\\",\\"{ol}\\",\\"{dl}\\",true],[null]]",null,"generic"]]]',
}
resp = requests.post(url, data=form_data)
buff_str = re.search(r'MkEWBc","(\[\[.+?\])",null,null,null', resp.text).group(1)
data = json.loads(buff_str.replace("\\", ""))
result = data[1][0][0][5][0][0]
print(result)


if __name__ == "__main__":
single_word("Desktop")
single_word(
"我是一个兵",
flag=1,
)