我们的目标 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参数加密的更多相关文章

  1. 百度翻译&&金山词霸API

    #/usr/bin/env python3 #coding=utf8 """百度翻译api功能实现函数,本模块基于Python3.x实现,getTransResult(q ...

  2. 百度翻译新API C#版在 winform,Asp.Net的小程序

    3月的下午,在C#群里日常装逼(聊天), 一兄弟说百度翻译有没有winfrom上用的Demo,问了一天  嫌烦了  我就干脆自己写个: PS 百度上的部分代码害死人啊  api地址都换的不成样了, 还 ...

  3. 使用百度翻译的API接口

    http://api.fanyi.baidu.com/api/trans/product/desktop 这是申请的接口地址,会得到一个APPID和一个钥密 然后下载PHP的对应的代码 有一个PHP文 ...

  4. 基于百度翻译API开发属于自己的翻译工具

    你是否每天使用着网页翻译工具?你是否遇到过这种情况,上网过程中遇到一个很长的单词但是又不能复制,要开两个浏览器,一个打开百度翻译,照着另一个网页输入单词?你安装了各种翻译软件后,又删除,只因忍受不了那 ...

  5. 调用百度翻译 API 来翻译网站信息

    之前说过jquery.i18n.js 来做网站的中英翻译,前提就得做一套中文内容,一套英文内容来解决,好处是中英翻译可以准确无误,本篇文章我们来看一下调用百度翻译的 API 来进行网站的翻译,但是翻译 ...

  6. python截图+百度ocr(图片识别)+ 百度翻译

    一直想用python做一个截图并自动翻译的工具,恰好最近有时间就在网上找了资料,根据资料以及自己的理解做了一个简单的截图翻译工具.整理一下并把代码放在github给大家参考.界面用python自带的G ...

  7. 公众号对接百度翻译API

    有时候在公众号中需要对接一些翻译的功能或者其他.最常见的翻译API就是中英互译,程序员用的最多的也就是中译英. 1.到百度翻译官网申请账号 http://api.fanyi.baidu.com/api ...

  8. 日常API之百度翻译

    百度翻译是什么,可以吃吗?相信很多人都熟悉,它是我们生活中必不可少的一只东东. 但是,百度翻译开发平台只有每月只能翻译200万个字符,多出的要按照49.00/百万字符来算.对于我酱紫的乞丐程序员来说, ...

  9. 百度翻译api 实现简易微信翻译小程序

    介绍 口袋翻译 口袋翻译 微信小程序 翻译功能 含7类语言的相互翻译 包含最近10条的翻译历史回溯功能 微信搜索:简e翻译 功能展示   使用百度翻译api需要申请 appid 与 key 并在 ap ...

随机推荐

  1. SpringMVC拦截器的配置与使用详解

         一.SpringMVC拦截器简介      Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.在springmvc中,定义拦截 ...

  2. mac laravel 环境变量设置bash_profile

    mac laravel 环境变量设置bash_profile >>>vim ~/.bash_profile '''text export PATH=$PATH:~/.composer ...

  3. ACM学习历程——HDU5137 How Many Maos Does the Guanxi Worth(14广州10题)(单源最短路)

    Problem Description    "Guanxi" is a very important word in Chinese. It kind of means &quo ...

  4. 【Lintcode】017.Subsets

    题目: 题解: Solution 1 () class Solution { public: vector<vector<int> > subsets(vector<in ...

  5. javacv实现实时视频截图和录像服务easyCV

    本项目维护于github:https://github.com/eguid/easyCV 1.介绍 本项目基于javaCV1.4.x. 其中实现了 (1)实时视频截图服务(支持rtsp/rtmp/ht ...

  6. POJ2553( 有向图缩点)

    The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9779   Accepted:  ...

  7. 转:AppScan代理扫描app/H5安全测试

    1.首先设置AppScan代理,设置如下:

  8. apache2.2.25+php5.43开启curl失败的解决方案。

    首先还是常规步骤: 1.extension_dir = "C:/server/php/ext" 2.extension=php_curl.dll 3.重启apache,发现curl ...

  9. tcp_fast_open的概念 作用以及实现(转)

    引言 三次握手的过程中,当用户首次访问server时,发送syn包,server根据用户IP生成cookie,并与syn+ack一同发回client:client再次访问server时,在syn包携带 ...

  10. ASP.NET Core会议管理平台实战_4、参数校验、操作结果封装,注册参数配置

    登陆和注册之前,需要封装 前端参数的校验,ajax的封装 参数校验,创建公共的类 ,它是一个静态类 这样在调用的时候,直接一句话就可以了,这就是封装的好处 空字符串的校验 调用方式 EF的源码里面有这 ...