破解百度翻译页面api参数加密
2019-02-25 16:14:29来源:博客园 阅读 ()
我们的目标 https://fanyi.baidu.com/ 找到获取翻译的请求
是这个 https://fanyi.baidu.com/v2transapi
查看一下post提交的表单,是这个
其中的en表示英文,zh表示中文,query是我们输入的,transtype与semple_means_flag的内容是固定的。现在就是差sign和token。
首先查找sign,在全局搜索搜索sign。出现这样
可以发现里面有很多,找到正确的那个,像下面
我们发现这个可能就是我们要找的,点击进去。
可以看出来这是应该ajax请求,p里面的参数就是我们要找的参数。在5828和5831序号哪里点一下,然后打开断点。刷新页面,输入一个字母,就会和下面一样。
这样然后鼠标放在m上面悬停一下会出现一个跳转,点击可以跳转到他的函数哪里。跳转过后我们看到m函数是
1 function n(r, o) { 2 for (var t = 0; t < o.length - 2; t += 3) { 3 var a = o.charAt(t + 2); 4 a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a), 5 a = "+" === o.charAt(t + 1) ? r >>> a : r << a, 6 r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a 7 } 8 return r 9 } 10 function e(r) { 11 var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g); 12 if (null === o) { 13 var t = r.length; 14 t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10)) 15 } else { 16 for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++) 17 "" !== e[C] && f.push.apply(f, a(e[C].split(""))), 18 C !== h - 1 && f.push(o[C]); 19 var g = f.length; 20 g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join("")) 21 } 22 var u = void 0 23 , l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107); 24 u = null !== i ? i : (i = window[l] || "") || ""; 25 for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) { 26 var A = r.charCodeAt(v); 27 128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)), 28 S[c++] = A >> 18 | 240, 29 S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224, 30 S[c++] = A >> 6 & 63 | 128), 31 S[c++] = 63 & A | 128) 32 } 33 for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++) 34 p += S[b], 35 p = n(p, F); 36 return p = n(p, D), 37 p ^= s, 38 0 > p && (p = (2147483647 & p) + 2147483648), 39 p %= 1e6, 40 p.toString() + "." + (p ^ m) 41 }
这是sign的加密函数,我们可以发现传的值就是我们在输入框输入的值。
把这些保存在一个.js的文件保持起来。里面的i = window[l] 这个window对象是浏览器才有的,如果我们使用python的js2py或者execjs会报错
我们查看到这个值是320305.131321201
var u = void 0 , l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107); u = null !== i ? i : (i = window[l] || "") || "";
修改为 var u = void 0, i = null; u = null !== i ? i : (i = "320305.131321201" || "") || "";
这样执行就不会出错
接下来还差token值了,我们搜索token发现如下
发现就在第一个,点进去
就在请求的html里面。现在需要的参数都找到了。
1 import requests 2 import js2py 3 import re 4 5 6 class BaiDuTranslateAPI(object): 7 headers = { 8 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' 9 } 10 def __init__(self): 11 super(BaiDuTranslateAPI).__init__() 12 self.GetReady() 13 def GetReady(self): 14 url_index = 'https://www.baidu.com' 15 self.session = requests.session() 16 self.session.get(url=url_index, headers=self.headers) 17 self.headers['Referer'] = url_index 18 url_html = 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh' 19 html = self.session.get(url=url_html, headers=self.headers) 20 comm = re.compile('token: \'(\w+)\'') 21 self.token = comm.search(html.text).group(1) 22 self.headers['Referer'] = url_html 23 24 def Get_Js(self): 25 with open(r'D:\vim\hello_data(1)\panyi.js', 'r', encoding='utf-8') as f: 26 return f.read() 27 def Translate(self,file): 28 files = False 29 file = str(file) 30 for i in file: 31 if '\u4e00' <= i.encode().decode('utf-8') <= '\u9fff': 32 files = True 33 else: 34 files = False 35 if files == False: 36 break 37 return files 38 39 def BaiDu(self,file): 40 run_js = js2py.EvalJs({}) 41 run_js.execute(self.Get_Js()) 42 sign = run_js.e(file) 43 url_api = 'https://fanyi.baidu.com/v2transapi' 44 is_it = self.Translate(file) 45 if is_it: 46 iia = 'zh' 47 iib = 'en' 48 else: 49 iia = 'en' 50 iib = 'zh' 51 data = { 52 'from': iia, 53 'to': iib, 54 'query': file, 55 'transtype': 'realtime', 56 'simple_means_flag': '3', 57 'sign': sign, 58 'token': self.token 59 } 60 html = self.session.post(url=url_api, headers=self.headers, data=data).json() 61 return (html['trans_result']['data'][0]['dst']) 62 def Start(self,file='i'): 63 try: 64 int(file) 65 return file 66 except: 67 # self.zhunbei() 68 files = self.BaiDu(file) 69 return files 70 71 if __name__ == '__main__': 72 a = BaiDuTranslateAPI() 73 print(a.Start('i')) 74 print(a.Start('love')) 75 print(a.Start('you'))
运行结果
原文链接:https://www.cnblogs.com/dayouzi/p/10422556.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 手把手教你破解文件密码、wifi密码、网页密码 2019-07-24
- python+selenium实现自动化百度搜索关键词 2019-07-24
- Django2.0+小程序技术打造微信小程序助手百度云 2019-05-16
- Python实现翻译小工具 2019-05-10
- python爬取百度文库所有内容 2019-05-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash