破解百度翻译页面api参数加密
我们的目标 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函数是
function n(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt(t + 2);
a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
}
return r
}
function e(r) {
var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
if (null === o) {
var t = r.length;
t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
} else {
for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++)
"" !== e[C] && f.push.apply(f, a(e[C].split(""))),
C !== h - 1 && f.push(o[C]);
var g = f.length;
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(""))
}
var u = void 0
, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
u = null !== i ? i : (i = window[l] || "") || "";
for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
var A = r.charCodeAt(v);
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)),
S[c++] = A >> 18 | 240,
S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
S[c++] = A >> 6 & 63 | 128),
S[c++] = 63 & A | 128)
}
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++)
p += S[b],
p = n(p, F);
return p = n(p, D),
p ^= s,
0 > p && (p = (2147483647 & p) + 2147483648),
p %= 1e6,
p.toString() + "." + (p ^ m)
}
这是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里面。现在需要的参数都找到了。
import requests
import js2py
import re class BaiDuTranslateAPI(object):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
def __init__(self):
super(BaiDuTranslateAPI).__init__()
self.GetReady()
def GetReady(self):
url_index = 'https://www.baidu.com'
self.session = requests.session()
self.session.get(url=url_index, headers=self.headers)
self.headers['Referer'] = url_index
url_html = 'https://fanyi.baidu.com/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh'
html = self.session.get(url=url_html, headers=self.headers)
comm = re.compile('token: \'(\w+)\'')
self.token = comm.search(html.text).group(1)
self.headers['Referer'] = url_html def Get_Js(self):
with open(r'D:\vim\hello_data(1)\panyi.js', 'r', encoding='utf-8') as f:
return f.read()
def Translate(self,file):
files = False
file = str(file)
for i in file:
if '\u4e00' <= i.encode().decode('utf-8') <= '\u9fff':
files = True
else:
files = False
if files == False:
break
return files def BaiDu(self,file):
run_js = js2py.EvalJs({})
run_js.execute(self.Get_Js())
sign = run_js.e(file)
url_api = 'https://fanyi.baidu.com/v2transapi'
is_it = self.Translate(file)
if is_it:
iia = 'zh'
iib = 'en'
else:
iia = 'en'
iib = 'zh'
data = {
'from': iia,
'to': iib,
'query': file,
'transtype': 'realtime',
'simple_means_flag': '',
'sign': sign,
'token': self.token
}
html = self.session.post(url=url_api, headers=self.headers, data=data).json()
return (html['trans_result']['data'][0]['dst'])
def Start(self,file='i'):
try:
int(file)
return file
except:
# self.zhunbei()
files = self.BaiDu(file)
return files if __name__ == '__main__':
a = BaiDuTranslateAPI()
print(a.Start('i'))
print(a.Start('love'))
print(a.Start('you'))
运行结果
破解百度翻译页面api参数加密的更多相关文章
- 百度翻译&&金山词霸API
#/usr/bin/env python3 #coding=utf8 """百度翻译api功能实现函数,本模块基于Python3.x实现,getTransResult(q ...
- 百度翻译新API C#版在 winform,Asp.Net的小程序
3月的下午,在C#群里日常装逼(聊天), 一兄弟说百度翻译有没有winfrom上用的Demo,问了一天 嫌烦了 我就干脆自己写个: PS 百度上的部分代码害死人啊 api地址都换的不成样了, 还 ...
- 使用百度翻译的API接口
http://api.fanyi.baidu.com/api/trans/product/desktop 这是申请的接口地址,会得到一个APPID和一个钥密 然后下载PHP的对应的代码 有一个PHP文 ...
- 基于百度翻译API开发属于自己的翻译工具
你是否每天使用着网页翻译工具?你是否遇到过这种情况,上网过程中遇到一个很长的单词但是又不能复制,要开两个浏览器,一个打开百度翻译,照着另一个网页输入单词?你安装了各种翻译软件后,又删除,只因忍受不了那 ...
- 调用百度翻译 API 来翻译网站信息
之前说过jquery.i18n.js 来做网站的中英翻译,前提就得做一套中文内容,一套英文内容来解决,好处是中英翻译可以准确无误,本篇文章我们来看一下调用百度翻译的 API 来进行网站的翻译,但是翻译 ...
- python截图+百度ocr(图片识别)+ 百度翻译
一直想用python做一个截图并自动翻译的工具,恰好最近有时间就在网上找了资料,根据资料以及自己的理解做了一个简单的截图翻译工具.整理一下并把代码放在github给大家参考.界面用python自带的G ...
- 公众号对接百度翻译API
有时候在公众号中需要对接一些翻译的功能或者其他.最常见的翻译API就是中英互译,程序员用的最多的也就是中译英. 1.到百度翻译官网申请账号 http://api.fanyi.baidu.com/api ...
- 日常API之百度翻译
百度翻译是什么,可以吃吗?相信很多人都熟悉,它是我们生活中必不可少的一只东东. 但是,百度翻译开发平台只有每月只能翻译200万个字符,多出的要按照49.00/百万字符来算.对于我酱紫的乞丐程序员来说, ...
- 百度翻译api 实现简易微信翻译小程序
介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示 使用百度翻译api需要申请 appid 与 key 并在 ap ...
随机推荐
- Nginx中如何限制某个IP同一时间段的访问次数
如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候.其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见 ...
- smack
XMPP/Smack/Openfire javax.net.ssl.SSLException: Received fatal alert: internal_error 解决: 1.在链接openfi ...
- 跨线程send message
今天同事问了一个问题,说在线程中send message 和直接调用是不是一样,他觉得是一样的,但是线程跟踪却发现处理过程是在接收消息队列完成.回家看到博客园上的一番争论才有些明白,这里贴出来,共勉 ...
- HihoCoder1652 : 三角形面积和2([Offer收割]编程练习赛38)(几何)(不会几何,占位)
描述 如下图所示,在X轴上方一共有N个三角形.这些三角形的底边与X轴重合,底边上两个顶点的坐标分别是(Li, 0)和(Ri, 0),底边的对顶点坐标是(Xi, Yi).其中Li ≤ Xi ≤ Ri 且 ...
- 更换mysql数据目录后出现 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法
服务器上的mysql默认数据目录为/var/lib/mysql/,同时服务器的/空间不是很大,而近期又有大量的日志需要导入进行分析,时常搞得/的空间捉襟见肘,晚上一狠心就想把mysql的数据目录转移到 ...
- noip2011普及组:统计单词
题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位 置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在 ...
- sql基础内容2
-- day16课程内容 --CREATE DATABASE day16;USE day16; -- *************一.数据约束********************------ 1.1 ...
- Spring boot 学习 五:domain的定义
一 public class City implements Serializable 实现了Sericalizable接口,只是一种标志.表示可以被序列化. java的ObjectOutputStr ...
- appium连真机问题
adb devices -l 后出现:List of devices attached 解决方法:用管理员身份运行以上命令 adb kill-server adb start-server adb d ...
- POI 中的CellType类型以及值的对应关系
操作使用POI接口,了解CellType的类型和值的对应关系. CellType 类型 值 CELL_TYPE_NUMERIC 数值型 0 CELL_TYPE_STRING 字符串型 1 CELL_T ...