目录:
1.抓包:
通过抓包可以发现.,真正的一句话的翻译其实它的url应该是:
分析参数:
这里判断参数:大致判断sign,和token是不定的
2.分析:
确定了 url 及大概要逆向的参数后,可以查看调用栈或者直接搜索关键词(参数名或url)定位到js代码:
发现嫌疑入口函数:
猜测:
y = {
from: d.fromLang, // 从xxxx
to: d.toLang, // 翻译成xxxx
query: e, // 被翻译的内容
transtype: r, // 固定的翻译类型
simple_means_flag: 3, // 常量
sign: L(e), // ????
token: window.common.token, // 不确定,可能为固定值
domain: R.getCurDomain() // 不确定,可能为固定值
};
先看token:
搜索关键词token:发现在首页源码里
由于在我进行翻译的时候. 页面是没有刷新的.
所以, 这个token一般在进行翻译的时候是不会改变的.即为固定值
接下来是domain:
打断点进入函数:
继续进入:
OK. M是常量. "common"
最后是sign:
依旧是打断点,进入:
仔细观察下. 发现该函数内部只调用了n() a()函数. 其他函数都是js内置的东西.
向上简单寻找就发现了. 这里是一个大闭包:
直接将这整个js闭包代码扣下来,命名为sign.js:
注意:在函数e中有:var i = null
需要把这一句提前到我们sign.js的第一行:因为在浏览器中这里是一个闭包,在外界进行加载的时候,i就被初始化了。所以我们需要手动的将它放在前面进行初始化。
尝试签名:
import requests
import execjs
f = open("sign.js", mode="r", encoding='utf-8')
js = execjs.compile(f.read())
ret = js.call('e', 'love')
print(ret)
报错了,说这里面没有window
确实, 由于我们的js是在node里面运行的. node是没有window对象的.
整合起来这里要用到window['gtk'],通过搜索发现:
搞定...我们只要把js里面的window['gtk']修改成这个就好了
3.最终代码:
import requests
import execjs
f = open("sign.js", mode="r", encoding='utf-8')
js = execjs.compile(f.read())
url = "https://fanyi.baidu.com/v2transapi?from=en&to=zh"
content = input("请输入一段英文:")
data = {
"from": "en",
"to": "zh",
"query": content,
"transtype": "realtime",
"simple_means_flag": "3",
"sign": js.call("e", content),
"token": "c63d27ea65fdf259bf4d56b792e47b17",
"domain": "common",
}
headers = {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Referer": "https://fanyi.baidu.com/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"
}
resp = requests.post(url, data=data, headers=headers)
print(resp.json())