type
status
date
slug
summary
tags
category
icon
password
逆向学习之有道翻译
声明
本人所有逆向、破解及爬虫相关教程均是以纯技术的角度来探讨研究和学习,严禁使用教程中提到的技术去破解、滥用、伤害其他公司及个人的利益,以及将以下内容用于商业或者非法用途。
〇、为啥?
看到聚合翻译的软件,就心想咱要是也想搞一个类似的得咋弄呢?肯定要有几家常用翻译翻译的接口,然后去聚合调用才行。就想先拿有道翻译的接口试试水,并记录一下过程。
一、找到API接口
首先还是要在请求中找到我们要的api,使用的工具就是chrome浏览器开发者工具。
过滤选择下面的
Fetch/XHR
然后随便输入几个字符看看下面的请求可以发现每次输入框发生改变都会调用图中圈起的api,在看一下参数和响应内容发现就是我们想要的。
二、观察接口
先看一下接口的详细情况:
- URL参数:
参数名 | 参数值 | 猜测的用途 |
smartresult | dict | 固定的 |
smartresult | rule | 固定的 |
- Form Data参数:
参数名 | 参数值 | 猜测的用途 |
i | aaa | 要翻译啥 |
from | AUTO | 从啥语言翻的 |
to | AUTO | 往哪翻的 |
smartresult | dict | 固定的 |
client | fanyideskweb | 固定的 |
salt | 16456680560149 | 像是时间戳 |
sign | 3d4a58570b60a9e4729d84ffc539ec23 | 加密字符串 |
lts | 1645668056014 | 像是时间戳 |
bv | 866ddc825824adb95a25e4ff4107f5a0 | 加密字符串 |
doctype | json | 固定的 |
version | 2.1 | 固定的 |
keyfrom | 固定的 | |
action | FY_BY_REALTlME | 固定的 |
- cookies:
OUTFOX_SEARCH_USER_ID | |
JSESSIONID | aaaj-vk-PYAZR7X05Wk8x |
OUTFOX_SEARCH_USER_ID_NCOO | 49135154.68687222 |
JSESSIONID | abcQQkpI3SuAO4ybQ-k8x |
DICT_UGC | be3af0da19b5c5e6aa4e17bd8d90b28a |
_ntes_nnid | 6c20d2b4a1d415e9f66b45f42896a2bb,1645411239529 |
SESSION_FROM_COOKIE | fanyiweb |
YOUDAO_FANYI_SELECTOR | OFF |
___rl__test__cookies | 1645668063927 |
- 请求头:请求头看着是有很多的,但常用必传的就那么几个如:
Origin
、Referer
、User-Agent
,这几个参数大部分是都会验证的,Cookies
是根据情况来传递的
上面列出来了这个请求的参数和参数用途的一些猜想,还有这个参数所携带的cookies。
对于参数来说有些参数就是固定的不能管就行,有些参数是经过计算出来的,要找到对能算法才能模拟。
对于cookies来说可能会有很多,不一定是都需要的,可以根据cookies的时效性,cookies的名称来粗略的判断一下,在通过请求模拟工具如
postman
、 Apifox
等进一步的判断一下哪几个cookies才是真正要用到的三、寻找参数
首先在chrome开发者工具里面找到对应的请求,然后再找到发起这个请求的方法,这里有两个方法可以找到对应的js代码:
- 通过network的Initiator标签这个查看请求栈
- 通过打请求断点的方式,直接切换到
Sources
页面,在XHR/fech Breakpoints
添加要监听的请求,请求中包括这个字符串就会断掉
使用以上哪种方法都可以,然后改变输入框中字符串触发断点。观察
Call Stack
找到参数来源断点可能会断在发请求的底层,要观察调用栈找到发起请求的业务代码是哪里
可以发现这里就是发起请求的地方,参数也能对应上,查看加密参数的生成会发现是由一个叫
v.generateSaltSign(n)
的方法生成的,下面看看这个方法里面实现的逻辑就可以了,在打一个断点达到方法处,然后可以单步调试进入进去或直接在 Console
面板输入函数名查看函数的逻辑如下:
代码逻辑很简单,就是时间戳、md5加密和随机数之类的一些,直接模拟就好,参数
e
是要翻译的字符串,我们把它转成python的代码看看:到此为止请求体中的参数全部找到了,我们用python请求一下看看:
让我们看下运行结果:
四、寻找Cookies
结果返回了一个错误,原因呢猜测是
cookies
的问题,可以从请求中复制一个到代码中确认下我们的猜想:不出所料返回了正确的结果,下一步就是逐步确认下需要的
cookies
是哪几个,上面的cookies一共是三组,可以挨个删除试试,最后得出结果是只需要 OUTFOX_SEARCH_USER_ID
的cookies,接下来就是找到这个cookies设置的地方,一个cookies如果会保存到浏览器中只会有两种方法:- JavaScript代码保存
- 通过请求响应头中的
Set-Cookie
先看看第一种方法:
在浏览器调试页面按快捷键 :
Ctrl+Shift+F
全局搜索这个cookies,看看有没有哪里的代码设置这个cookies全局搜索后发现只有
cookies的生成,没有
的生成。
然后我们接下来看第二个方法:
先把cookies清空
再把请求过滤改为
然后清空所有请求,改变输入框内容后观察请求:
可以看到清空cookies后它发起了一个不带目标 cookies
的请求吗,然后同样报错了,再看另一个请求:
可以看到通过这个请求获取了设置cookies,接下来就是使用同样的方法查看这个请求的参数:
同样去掉一些固定的参数后只有两个是我们需要模拟的,让我们来找一下相关代码:
会发现里面的变量
就是带入的参数,
就是获取动态参数的方法,进入t函数内部就看看,找出目标变量:
观察上面的代码后可以发现:
- 设置了cookie:___rl__test__cookies 值为当日时间戳
- 设置变量
G
等于OUTFOX_SEARCH_USER_ID_NCOO
的cookie,如果没有则设置为:
- 设置了值
_ncoo
等于变量G
- 设置了值
_nssn
登录变量F
但F
的值为空所有可以不管
- 设置了值
_ntms
为时间戳a
所以获取cookies请求的参数已经找到了,先转成python代码:
提示:random.uniform(0, 1)是代替js种的Math.random(), 其作用都是获取0到1之间的浮点数
由于是调用一个请求获取的cookie然后要带入到另一个请求中,所以要两个请求保持同一个会话
五、编写代码
下面是示例代码:
运行结果:
这里我们来分析下响应结果:
- smartResult:词典的结果
- translateResult:翻译的结果,有来源和目标
- type:翻译的类型就是从什么语言翻译到什么语言
会看到翻译完后,界面上面的显示也会由
自动检测语言
改变为返回的内容,只不过是中文的,所以查一下 en2zh-CHS
会不会查到什么对应关系:可以看到对应关系是直接写在html中的,取出来就好,然后在对代码做一些小调整:
运行结果:
六、结束
本篇文章呢难度相对不大,但涉及到的知识点还有有一些的:
- chrome浏览器开发者工具调试方法,如:观察请求、追踪请求代码栈、打请求断点、全局搜索代码、清空cookies等
- 如何分析js代码
- 浏览器cookies保存的方式
- python中保持同一个会话以带入上一个请求中的cookies
- 作者:昊色居士
- 链接:https://blog.haose.love//article/490adc13-0cb4-4160-825e-ea7b4d4c43f9
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。