把谷歌的接口逆向重新整理一下,方便需要的时候可以用到
有一个第三方的依赖 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, )
|