首先找到翻译接口
可以看出,翻译接口是 webtranslate,再看返回内容
返回的是一大串字符串,所以后面还需要解密这串字符
解密webstranslate 中的 Form Data 参数
i: 你好,程序
from: auto
to:
domain: 0
dictResult: true
keyid: webfanyi
sign: c04636a841a4b2c374dc4d7dcf675514
client: fanyideskweb
product: webfanyi
appVersion: 1.0.0
vendor: web
pointParam: client,mysticTime,product
mysticTime: 1711293172275
keyfrom: fanyi.web
mid: 1
screen: 1
model: 1
network: wifi
abtest: 0
yduuid: abcdefg
可以看到sign参数加密,加密长度为32位
md5加密特征:
**长度固定。**无论输入的数据长度是多少字节,输出总32位字符。
**不可逆。**即无法通过MD5值反推出原始数据。
**抗修改性。**对原始数据进行的任何改动,甚至是一个字节的修改,都会导致MD5值显著不同。
**抗碰撞性。**要找到两个具有相同MD5值的不同数据非常困难。
由此我们可以判断,它属于md5加密
寻找加密 sign
全局搜索 sign 的值,发现只有这一行的 debug 进去了
点进去之后找到了sign 这个参数,sign 是由于 k(o,e) 这个方法生成的,再网上找方法,最后发现确实是 md5 加密而来的
我们可以试一下,e的结果是
client=fanyideskweb&mysticTime=1711293674225&product=webfanyi&key=fsdsogkndfokasodnaso
页面上 md5 加密后
使用网上的工具加密
发现正好是 32位小写的 md5 加密,结果和预想的正确
通过检查发现 这个key= fsdsogkndfokasodnaso
探索 key 接口
发现这个key 竟然来自于另一个接口
所以自动化翻译需要两个接口来实现,第一步先获取加密的key,之后再请求翻译接口,除了sign,其他的都是写死的
现在看看第一个返回 key的接口是否需要逆向,发现这个sign 也是需要加密的,但是key=asdjnjfenknafdfsdfsd
第一个请求能够复现了
import requests
import datetime
import json
import hashlib
from urllib.parse import urlencode
def get\_timestamp():
return int(datetime.datetime.now().timestamp() \* 1000)
def get\_key():
# 主要是获取key等参数
url = "https://dict.youdao.com/webtranslate/key"
mysticTime = get_timestamp()
tmp_sign = f"client=fanyideskweb&mysticTime={mysticTime}&product=webfanyi&key=asdjnjfenknafdfsdfsd"
sign = hashlib.md5(tmp_sign.encode("utf8")).hexdigest()
# 参数
params = {
'keyid': 'webfanyi-key-getter',
'sign': sign,
'client': 'fanyideskweb',
'product': 'webfanyi',
'appVersion': '1.0.0',
'vendor': 'web',
'pointParam': 'client,mysticTime,product',
'mysticTime': mysticTime,
'keyfrom': 'fanyi.web',
'mid': 1,
'screen': 1,
'model': 1,
'network': 'wifi',
'abtest': '0',
'yduuid': 'abcdefg',
}
url_with_params = f"{url}?{urlencode(params)}"
headers = {
'Accept': 'application/json, text/plain, \*/\*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'https://fanyi.youdao.com',
'Pragma': 'no-cache',
'Referer': 'https://fanyi.youdao.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
'Sec-Ch-Ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Windows"'
}
# 请求
response = requests.get(url_with_params, headers=headers, data={})
json_data = json.loads(response.text)
# 获取 key
key = json_data['data']['secretKey']
return key
def send(chinese):
url = "https://dict.youdao.com/webtranslate"
mysticTime = get_timestamp()
# sign 是 client=fanyideskweb&mysticTime=1711295634744&product=webfanyi&key=fsdsogkndfokasodnaso
tmp_sign = f"client=fanyideskweb&mysticTime={mysticTime}&product=webfanyi&key={get\_key()}"
sign = hashlib.md5(tmp_sign.encode("utf8")).hexdigest()
payload = {
'i': chinese,
'from': 'auto',
'to': '',
'domain': '0',
'dictResult': 'true',
'keyid': 'webfanyi',
'sign': sign,
'client': 'fanyideskweb',
'product': 'webfanyi',
'appVersion': '1.0.0',
'vendor': 'web',
'pointParam': 'client,mysticTime,product',
'mysticTime': mysticTime,
'keyfrom': 'fanyi.web',
'mid': 1,
'screen': 1,
'model': 1,
'network': 'wifi',
'abtest': '0',
'yduuid': 'abcdefg',
}
headers = {
'Accept': 'application/json, text/plain, \*/\*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': 'OUTFOX\_SEARCH\_USER\_ID=-1545431425@10.55.164.248; OUTFOX\_SEARCH\_USER\_ID\_NCOO=1617400304.3454392',
'Origin': 'https://fanyi.youdao.com',
'Pragma': 'no-cache',
'Referer': 'https://fanyi.youdao.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
'sec-ch-ua': '"Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"'
}
response = requests.post(url, headers=headers, data=payload)
encode_data = response.text
# 开始解密数据
print(encode_data)
解密返回的加密数据
但是通过测试发现,send() 这个方法返回的是加密数据,接下来探索如何解密,通过debug 发现解密在这行代码里面
观察这个方法,定义了一个变量a,通过调用一个解密方法,把乱码的字符给解密了
关键代码
const a = Po["a"].decodeData(o, Wo["a"].state.text.decodeKey, Wo["a"].state.text.decodeIv)
, n = a ? JSON.parse(a) : {};
看下 Po[“a”].decodeData 会跳转到哪个方法里面
进入这个解密方法,框选的部分好像就是解码过程了
Debug 看下是怎么解密的
使用模型分析下这个代码
原来 y() 这个函数是 md5 加密的方法
经过采纳考别人的经验,复现出了 python 代码
import requests
import datetime
import json
import hashlib
from urllib.parse import urlencode
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
def get\_timestamp():
return int(datetime.datetime.now().timestamp() \* 1000)
def init\_data():
# 主要是获取key等参数
url = "https://dict.youdao.com/webtranslate/key"
mysticTime = get_timestamp()
tmp_sign = f"client=fanyideskweb&mysticTime={mysticTime}&product=webfanyi&key=asdjnjfenknafdfsdfsd"
sign = hashlib.md5(tmp_sign.encode("utf8")).hexdigest()
# 参数
params = {
'keyid': 'webfanyi-key-getter',
'sign': sign,
'client': 'fanyideskweb',
'product': 'webfanyi',
'appVersion': '1.0.0',
'vendor': 'web',
'pointParam': 'client,mysticTime,product',
'mysticTime': mysticTime,
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/44b7c26a011dbf9613dfb27caea7e3b0.png)
![img](https://img-blog.csdnimg.cn/img_convert/699162b82e845312fea13f205e6a48d9.png)
![img](https://img-blog.csdnimg.cn/img_convert/b87afba6bd50bbff9c66e2ea6f1eeb07.png)
![img](https://img-blog.csdnimg.cn/img_convert/3cfc62a81e17eb54f7a74ef6bfa16575.png)
![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
86381401c05e862fe4e9.png)
![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**
<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />