前言
本文主要介绍了有道翻译的接口调用情况,对两个接口进行了初步的接口逆向,只供学习交流使用。
找到翻译接口 webtranslate
网页地址:https://fanyi.youdao.com/index.html#/
首先找到翻译接口
可以看出,翻译接口是 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 = {
'Acce