有道翻译接口逆向

前言

本文主要介绍了有道翻译的接口调用情况,对两个接口进行了初步的接口逆向,只供学习交流使用。

找到翻译接口 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 urlencodedef 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)# 获取 keykey = json_data['data']['secretKey']return keydef send(chinese):url = "https://dict.youdao.com/webtranslate"mysticTime = get_timestamp()# sign 是 client=fanyideskweb&mysticTime=1711295634744&product=webfanyi&key=fsdsogkndfokasodnasotmp_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 base64def 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,'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)# 获取 keyreturn json_data['data']def send(chinese):url = "https://dict.youdao.com/webtranslate"mysticTime = get_timestamp()data = init_data()aesIv = data['aesIv']aesKey = data['aesKey']secretKey = data['secretKey']# sign 是 client=fanyideskweb&mysticTime=1711295634744&product=webfanyi&key=fsdsogkndfokasodnasotmp_sign = f"client=fanyideskweb&mysticTime={mysticTime}&product=webfanyi&key={secretKey}"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:", encode_data)print("aesIv:", aesIv)print("aesKey:", aesKey)decode(encode_data, aesIv, aesKey)# 执行解密过程
def decode(encode_data, aesIv, aesKey):# 将秘密字符串转换为字节,并使用base64解码key = hashlib.md5(aesKey.encode('utf-8')).digest()iv = hashlib.md5(aesIv.encode('utf-8')).digest()print(len(encode_data))# 解密数据# 创建AES解密器aes = AES.new(key, AES.MODE_CBC, iv)decrypted_padded = aes.decrypt(base64.urlsafe_b64decode(encode_data))decrypted = unpad(decrypted_padded, AES.block_size).decode('utf8')# 返回解密后的数据json_data = json.loads(decrypted)print(json_data)#passif __name__ == '__main__':chinese = "你好,大家好才是真的好"send(chinese)

这边花时间最多的就是寻找 webtranslate 返回内容的解密方法,需要熟练运用 chrome 提供的工具,查询每一个方法的作用,但是只要细心点一定会成功的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】归并排序(不用递归)

大家好,我是苏貝,本篇博客带大家了解归并排序,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 归并排序(用递归) 之前我们写了一篇博客来介绍如何用递归实现归并排序…

工业无线网关在汽车制造企业的应用效果和价值-天拓四方

随着智能制造的快速发展,工业无线网关作为关键通信设备,在提升生产效率、优化生产流程、实现设备间的互联互通等方面发挥着越来越重要的作用。以下是一个关于工业无线网关在智能制造行业应用的具体案例,展示了其在实际生产中的应用效果和价值…

fastadmin学习01-windows下安装部署

下载源代码 官网 安装 解压,然后使用phpstorm打开 修改配置文件 创建数据库 -- drop database fastadmin01; create database fastadmin01;这样fastadmin就部署好了 访问主页也能看到前台页面

进行接口测试时,连接数据库,对数据源进行备份、还原、验证操作

进行接口测试时,我们需要连接到数据库中,对数据源进行备份、还原、验证等操作。 一、Python连接数据库常见模块 MysqlDBpython2时代最火的驱动库。基于C开发,对windows平台不友好。现在已经进入python3时代,基本不再使用MysqlCl…

Vue3气泡卡片(Popover)

效果如下图:在线预览 APIs 参数说明类型默认值必传title卡片标题string | slot‘’falsecontent卡片内容string | slot‘’falsemaxWidth卡片内容最大宽度string | number‘auto’falsetrigger卡片触发方式‘hover’ | ‘click’‘hover’falseoverlayStyle卡片样式…

Qt/QML编程之路:画线及倒车影响(48)

前言: 倒车影像中有一个属性比较实用,那就是倒车线,这条线很明显会在视频图像上叠加显示,或者说在视频上面一个图层画的线。这里有一个画线的Qt示例,用于在一个scene上画一个对角线: #include "mainwindow.h" #include <QApplication> #include <QtW…

python接口自动化测试 之mock模块基本使用介绍

mock作用 解决依赖问题&#xff0c;达到解耦作用 当我们测试某个目标接口&#xff08;模块&#xff09;时&#xff0c;该接口依赖其他接口&#xff0c;当被依赖的接口未开发完成时&#xff0c;可以用mock模拟被依赖接口&#xff0c;完成目标接口的测试 模拟复杂业务的接口 …

argocd部署

一、前言 ArgoCD 是一个开源的、持续交付工具&#xff0c;用于自动化部署应用程序到 Kubernetes 集群。它基于 GitOps 理念&#xff0c;通过使用 Git 作为单一的源头来管理应用程序的配置和部署状态&#xff0c;argocd会定时监控git仓库中的yaml配置文件&#xff0c;当git仓库中…

案例分享|智能机器人空调压缩机曲轴轴套装配

随着空调市场的不断扩大和消费者对于空调性能要求的提高&#xff0c;空调压缩机的制造质量也日益受到关注。作为压缩机核心部件之一的曲轴轴套&#xff0c;其装配质量直接关系到压缩机的性能和稳定性。 一、案例背景 某知名空调制造商在生产某型号压缩机时&#xff0c;发现曲轴…

2024年3月GESP等级认证C++编程五级真题

2024年3月GESP认证C编程五级真题试卷 题目总数&#xff1a;27 总分数&#xff1a;100 选择题 第 1 题 单选题 唯⼀分解定理描述的内容是 ( ) ? A.任意整数都可以分解为素数的乘积 B.每个合数都可以唯⼀分解为⼀系列素数的乘积 C.两个不同的整数可以分解为相同…

初步接触C++

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习C&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 初步区别C语言和C命名空间1.命名空间的定义2.命名空间的使用 C的输入输出缺省参数1.缺省参数…

机器学习——神经网络简单了解

一、神经网络基本概念 神经网络可以分为生物神经网络和人工神经网络 (1)生物神经网络,指的是生物脑内的神经元、突触等构成的神经网络&#xff0c;可以使生物体产生意识&#xff0c;并协助生物体思考、行动和管理各机体活动。 (2)人工神经网络,是目前热门的深度学习的研究…

计算坤是如何工作的

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:&#x1f649; &#x1f439;今日诗词:&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac…

进程、线程、协程与虚拟线程(进程相关)

进程、线程、协程与虚拟线程 这一次我们从头&#xff0c;从最大的先开始说&#xff0c;我们从进程开始&#xff0c;因为内容比较多&#xff0c;所以我们分为几个不同的文章来介绍。先从进程&#xff0c;再从线程&#xff0c;最后介绍协程与虚拟线程。 简介 我们以一张操作系…

ehters.js:provider

ethers.jsV5.4文档 安装ethers npm install ethers5.4.0// 引入 import { ethers } from ethersProviders /** Provider类* Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。 */ const provider new ethers.providers.Web3Provider…

2024年第16届大广赛新命题发布-爱华仕箱包

2024年3月27日&#xff0c;2024年第16届大广赛发布了新的命题&#xff0c;爱华仕箱包命题&#xff0c;自2017年起&#xff0c;爱华仕箱包已连续8年担任全国大学生广告艺术大赛命题单位。 爱华仕现已实现百货、超市、电商、礼品、投标、海外市场6大零售网络的全覆盖&#xff0c…

左值引用、右值引用及移动语义

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 左值 概念 可以取到地址的值就是左值&#xff0c;并且一般情况下可以修改&#xff08;const类型左值不可修改&#xff09;。 左值举例&#xff1a; //左值 int a 0; const int b 1; int* p &a; 右值 概念 不能…

三相四线智能电表直接接入式接线图

大家好&#xff0c;今天我们要聊的是三相四线智能电表的直接接入式接线方式。别担心&#xff0c;我会用简单易懂的语言来解释这个看似复杂的主题。 首先&#xff0c;我们得知道什么是三相四线电表。在我们的生活中&#xff0c;电力供应通常分为单相和三相。三相电&#xff0c;就…

vue 下载图片/视频到浏览器

方法1&#xff1a;直接在当前页面打开图片或者视频 window.location.href url;//借用a标签实现同样效果 const link document.createElement(a) link.href url // 文件地址 link.click(); 方法2&#xff1a;新开一个窗口打开图片或视频 window.open(url); 方法3&#xf…

分页-PageHelper原理以及实时分页-键集分页

一.PageHelper原理 1.使用 PageHelper 是国内非常优秀的一款开源 mybatis 分页插件&#xff0c;它支持常用的主流数据库&#xff0c;例如 Oracle、Mysql、MariaDB、SQLite、Hsqldb 等。 PageHelper 的安装很简单&#xff0c;只需要在 pom.xml 中加入以下依赖即可&#xff1a…