爬虫(2)关于百度翻译API的JS渗透破解
现在开始,进入百度翻译页面
先说一下我们的目的:
获取这串json数据
F12进去发现,有两个很明显的请求连接 (图中已标识)
首先先来看输入语言检测api
很明显就是向这个地址发起Post请求,然后自动检测输入语言类别.
好戏现在开始!
很明显我们要开始处理百度翻译接口。
问题1:
我们看到这里的Post请求下的Form Data 我们只需知道sign 和 token 其他很好理解是什么
这里小编写了尝试了三遍输入,发现token完全一模一样。除了sign,好我们就从这个sign开始。
然后就进入我们的JS世界了。(这个环节是整个项目最重要的)
进入来之后发现3876行,然后我们设置DOM断点
然后重新输入翻译字体,实现debug功能
一步一步从上往下找 Call Stack (调用堆栈)里面找
最后在这里找到了data参数,并且发现了sign,随后我们点进去
直接模拟js代码,然后打断点,代码下面有
重新debug,bang bang bang,sign在这里产生(320305.131321201)然后顺理成章CV走
然后调试,安装node.js(js的运行环境),然后调试,直到能输出sign为止(过程中要用到gtk变量)
import execjs, requests, json, re from datetime import datetime,timedelta from common import langList with open('./e.js', 'r', encoding='utf8') as f: js = f.read() jsfunc = execjs.compile(js) sess = requests.Session() sess.headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36', 'origin': 'https://fanyi.baidu.com', 'referer': 'https://fanyi.baidu.com', } def lan_detect(String): r = sess.post('https://fanyi.baidu.com/langdetect', data={'query': String}) StringType = r.json()['lan'] print('你输入的翻译内容为', langList[StringType]) return StringType def get_r(): for i in range(2): r = sess.get('https://fanyi.baidu.com') return r def get_token(): r1 = get_r() result2 = re.search(r"token: '(.+?)'", r1.text) # 6ba0a416db86c535db0158a86775297f token = (result2.group(1)) return token def get_sign(String): r2 = get_r() gtk = re.search(r"window.gtk = '(.+?)';", r2.text).group(1) print('gtk', gtk) sign = jsfunc.call('e', String, gtk) print('sign', sign) return sign def baidutranslate(String, target_lan): data = { 'from': lan_detect(String), 'to': target_lan, 'query': String, 'transtype': 'realtime', 'simple_means_flag': '3', 'sign': get_sign(String), 'token': get_token(), } r = sess.post('https://fanyi.baidu.com/v2transapi?', data=data) translate_result = r.json()['trans_result']['data'][0]['dst'] print('翻译结果:', translate_result) if __name__ == '__main__': a = input('请输入你要翻译的内容') baidutranslate(a, target_lan='jp')